复习列表

lmrttx

2020-12-09 21:38:40

Personal

12.9.2020 负环模板,AC。 [负环](https://www.luogu.com.cn/problem/P3385)。 ```cpp #include<bits/stdc++.h> using namespace std; #define inf 10000000 #define maxn 2001 #define maxm 3001 int n,m,cnt,h[maxn],T; int dis[maxn],visnum[maxn]; bool vis[maxn]; queue<int> q; struct edge{ int u,v,w,nxt; edge(int u1=0,int v1=0,int w1=0,int n1=0): u(u1),v(v1),w(w1),nxt(n1) {} }e[maxm<<1]; inline void add(int u,int v,int w){ e[++cnt]=edge(u,v,w,h[u]);h[u]=cnt; } void in(){ scanf("%d%d",&n,&m); cnt=-1; memset(h,-1,sizeof(h)); for(register int i=1,u,v,w;i<=m;++i){ scanf("%d%d%d",&u,&v,&w); add(u,v,w);if(w>=0)add(v,u,w); } } void spfa(){ fill(dis+1,dis+n+1,inf); memset(visnum,0,sizeof(visnum)); memset(vis,0,sizeof(vis)); while(!q.empty()){ q.pop(); } int u,v,w; dis[1]=0;vis[1]=1;q.push(1); while(!q.empty()){ u=q.front();vis[u]=0;q.pop(); for(register int i=h[u];i!=-1;i=e[i].nxt){ v=e[i].v;w=e[i].w; if(dis[u]+w<dis[v]){ dis[v]=dis[u]+w; if(!vis[v]){ ++visnum[v]; if(visnum[v]>=n){ printf("YES\n"); return; } q.push(v); vis[v]=1; } } } } printf("NO\n"); } int main(){ scanf("%d",&T); while(T--){ in();spfa(); } return 0; } ``` update 2020.12.13 **勿忘国耻** 笛卡尔树:二叉搜索树+小根堆 P5854 ```cpp #include<bits/stdc++.h> using namespace std; #define int long long #define maxn 10000005 int n,a[maxn],b[maxn],s[maxn],top,ch[maxn][2],ls,rs; #define gc() (p0==p1&&(p1=(p0=buf)+fread(buf,1,1048576,stdin),p0==p1)?EOF:*p0++) char buf[1048576],*p0,*p1; inline int read() { int r=0; char c=gc(); while (c<48||c>57) c=gc(); while (c>47&&c<58) {r=(r<<3)+(r<<1)+(c^48); c=gc();} return r; } #undef gc signed main(){ //scanf("%lld",&n); n=read(); for(int i=1;i<=n;i++)//scanf("%lld",&a[i]); a[i]=read(); s[++top]=0; for(int i=1;i<=n;i++){ while(top&&a[s[top]]>a[i])ch[i][0]=s[top--]; if(s[top])ch[s[top]][1]=i;s[++top]=i; } for(int i=1;i<=n;i++){ ls^=(i*(ch[i][0]+1));rs^=(i*(ch[i][1]+1)); } printf("%lld %lld",ls,rs); return 0; } ``` update 2021.1.3 [失配树模板](https://www.luogu.com.cn/problem/P5829#submit) ```cpp #include<bits/stdc++.h> using namespace std; #define maxlog 25 #define maxn 1000005 int fail[maxn],fa[maxn][maxlog],dis[maxn],n,q,l1,r1; char s[maxn]; int p=0; int jump(int x,int h){ if(dis[x]<=h)return x; for(register int i=21;i>=0;i--){if(dis[fa[x][i]]>h)x=fa[x][i];} return fa[x][0]; } int lca(int x,int y){ if(dis[x]<dis[y])swap(x,y); x=jump(x,dis[y]);for(register int i=21;i>=0;i--){ if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i]; }return fa[x][0]; } int main(){ scanf("%s%d",&s[1],&q);n=strlen(s+1); for(register int i=2;i<=n;i++){ while(p&&s[p+1]!=s[i])p=fail[p]; if(s[p+1]==s[i])++p;fail[i]=p;dis[i]=dis[p]+1; fa[i][0]=p; } for(register int k=1;k<=21;k++)for(register int i=1;i<=n;i++) fa[i][k]=fa[fa[i][k-1]][k-1]; while(q--){scanf("%d%d",&l1,&r1);printf("%d\n",lca(l1,r1));} return 0; } ```