11月
好久没上博客了。。。 今天什么都没有干 。。。心里崩溃了。。。
好多东西要学啊自己智商低下 懒惰 (在颓废就去舔厕所(真的))
记录一些模板
dinic codevs1993
#include<iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; const int inf=0x3f3f3f3f; struct edge { int to,f,nxt; }e[10010]; int n,m,cnt=1; int d[10010],q[10010],g[10010]; inline void Init() { memset(d,0x3f3f3f3f,sizeof(d)); d[1]=1; } inline void link(int u,int v,int c) { e[++cnt].nxt=g[u]; g[u]=cnt; e[cnt].to=v; e[cnt].f=c; } inline int Min(int x,int y) { return x<y?x:y; } inline int read() { int x=0,f=1; char c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9'){x*=10;x+=c-'0';c=getchar();} return x*f; } bool bfs() { Init(); queue<int>q; q.push(1); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=g[u];i;i=e[i].nxt) { int v=e[i].to; if(e[i].f&&d[v]==inf) { d[v]=d[u]+1; q.push(v); } } } return d[n]!=inf; } int dfs(int u,int delta) { if(u==n) return delta; int ret=0; for(int i=g[u];i&δi=e[i].nxt) { int v=e[i].to; if(d[v]==d[u]+1) { int dd=dfs(v,Min(delta,e[i].f)); e[i].f-=dd; e[i^1].f+=dd; delta-=dd; ret+=dd; } } return ret; } inline void dinic() { int tot=0; while(bfs()) { tot+=dfs(1,inf); } printf("%d",tot); } int main() { m=read(); n=read(); for(int i=1;i<=m;i++) { int u,v,c; u=read(); v=read(); c=read(); link(u,v,c); link(v,u,0); } dinic(); return 0; }
费用流 codevs 1227
#include<iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; const int inf=0x3f3f3f3f; struct edge { int to,nxt,c,f; }e[30011]; int n,k,cur,ans,cnt=1; int dist[30011],used[30011],pree[30011],prev[30011],g[30011]; void link(int u,int v,int f,int c) { e[++cnt].nxt=g[u]; g[u]=cnt; e[cnt].f=f; e[cnt].to=v; e[cnt].c=c; } void ins(int u,int v,int f,int c) { link(u,v,f,c); link(v,u,0,-c); } int Min(int x,int y) { return x<y?x:y; } bool spfa() { queue<int>q; memset(dist,-1,sizeof(dist)); memset(used,0,sizeof(used)); dist[0]=0; q.push(0); while(!q.empty()) { int u=q.front(); q.pop(); used[u]=0; for(int i=g[u];i;i=e[i].nxt) { int v=e[i].to,w=e[i].c; if(e[i].f&&dist[v]<dist[u]+w) { dist[v]=dist[u]+w; prev[v]=u; pree[v]=i; if(!used[v]) { q.push(v); used[v]=1; } } } } return dist[10010]!=-1; } int MinCostFlow() { int u=10010,sum=inf; while(u) { e[pree[u]].f--; e[pree[u]^1].f++; u=prev[u]; } // cout<<dist[10010]<<endl; return dist[10010]; } void MinFlow() { while(spfa()) { cur+=MinCostFlow(); if(cur>ans) ans=cur; } printf("%d",ans); } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { int x; scanf("%d",&x); ins((i-1)*n+j,(i-1)*n+j+n*n,1,x); ins((i-1)*n+j,(i-1)*n+j+n*n,k,0); if(i!=n) { ins((i-1)*n+j+n*n,i*n+j,k,0); } if(j!=n) { ins((i-1)*n+j+n*n,(i-1)*n+j+1,k,0); } } } ins(0,1,k,0); ins(n*n*2,10010,k,0); MinFlow(); return 0; }
树剖 自己写错了 老师给调出来的
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define N 200010 using namespace std; typedef long long ll; const int inf=1<<29; struct edge { int nxt,to; }e[N*2]; int n,Time,q,cnt=1; int top[N],tid[N],size[N],used[N],head[N],dep[N],son[N]; ll tree[N*10],sum[N],fa[N],w[N]; char s[10]; void insert(int u,int v) { e[++cnt].nxt=head[u]; head[u]=cnt; e[cnt].to=v; } void dfs1(int u) { used[u]=1; size[u]=1; int Max=0; for(int i=head[u];i;i=e[i].nxt) { int v=e[i].to; if(!used[v]) { fa[v]=u; dep[v]=dep[u]+1; dfs1(v); size[u]+=size[v]; if(size[v]>Max) {Max=size[v];son[u]=v;} } } } void dfs2(int u,int ancestor) { used[u]=1; top[u]=ancestor; tid[u]=++Time; if(son[u]) { dfs2(son[u],ancestor); } for(int i=head[u];i;i=e[i].nxt) { int v=e[i].to; if(!used[v]) dfs2(v,v); } } void update(int l,int r,int x,int pos,int k) { if(l==r) {tree[x]=k; sum[x]=k; return;} if(pos<=(l+r)/2) { update(l,(l+r)/2,2*x,pos,k); tree[x]=max(tree[x],tree[2*x]); } else if(pos>(l+r)/2) { update((l+r)/2+1,r,2*x+1,pos,k); tree[x]=max(tree[x],tree[2*x+1]); } sum[x]=sum[2*x]+sum[2*x+1]; } ll querysm(int l,int r,int x,int a,int b) { if(l>b||r<a) return 0; if(l==a&&r==b) return sum[x]; int mid=(l+r)/2; if(mid>=b) return querysm(l,mid,2*x,a,b); else if(mid<a) return querysm(mid+1,r,2*x+1,a,b); else return querysm(l,mid,2*x,a,mid)+querysm(mid+1,r,2*x+1,mid+1,b); } int querymx(int l,int r,int x,int a,int b) { if(l>b||r<a) return -inf; if(l>=a&&r<=b) return tree[x]; return max(querymx(l,(l+r)/2,2*x,a,b),querymx((l+r)/2+1,r,2*x+1,a,b)); } int Max(int u,int v) { int ret=-inf; while(top[u]!=top[v]) { if(dep[top[u]]<dep[top[v]]) swap(u,v); ret=max(ret,querymx(1,n,1,tid[top[u]],tid[u])); u=fa[top[u]]; } if(tid[u]<tid[v]) swap(u,v); ret=max(ret,querymx(1,n,1,tid[v],tid[u])); return ret; } ll Sum(int u,int v) { ll ret=0; while(top[u]!=top[v]) { if(dep[top[u]]<dep[top[v]]) swap(u,v); ret+=querysm(1,n,1,tid[top[u]],tid[u]); u=fa[top[u]]; } if(tid[u]<tid[v]) swap(u,v); ret+=querysm(1,n,1,tid[v],tid[u]); return ret; } void solve() { for(int i=1;i<=n;i++) { int u=tid[i]; update(1,n,1,u,w[i]); } scanf("%d",&q); for(int i=1;i<=q;i++) { int u,v; scanf("%s%d%d",s,&u,&v); if(s[1]=='H') update(1,n,1,tid[u],v); if(s[1]=='M') printf("%d\n",Max(u,v)); if(s[1]=='S') printf("%lld\n",Sum(u,v)); } } int main() { scanf("%d",&n); for(int i=1;i<n;i++) { int u,v; scanf("%d%d",&u,&v); insert(u,v); insert(v,u); } for(int i=1;i<=n;i++) { scanf("%d",&w[i]); } dfs1(1); memset(used,0,sizeof(used)); dfs2(1,1); solve(); return 0; }
可并堆
#include<iostream> #include<cstdio> #include<cstring> #define N 1000010 using namespace std; int n,m; int l[N],r[N],d[N],a[N],die[N],fa[N]; int merge(int u,int v) { if(!u) return v; if(!v) return u; if(a[u]>a[v]) swap(u,v); r[u]=merge(r[u],v); if(d[r[u]]>d[l[u]]) swap(l[u],r[u]); if(!r[u]) d[u]=0; else d[u]=d[r[u]]+1; return u; } int find(int x) { return x==fa[x]?fa[x]:find(fa[x]); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); fa[i]=i; } scanf("%d",&m); while(m--) { char s[10]; int u,v; scanf("%s",s); if(s[0]=='M') { scanf("%d%d",&u,&v); int p=find(u),q=find(v); if(die[u]||die[v]||p==q) continue; fa[p]=fa[q]=merge(p,q); } else { scanf("%d",&u); if(die[u]) { printf("0\n"); continue; } v=find(u); die[v]=1; printf("%d\n",a[v]); fa[v]=merge(l[v],r[v]); fa[fa[v]]=fa[v]; } } return 0; }
manacher
#include<iostream> #include<cstdio> using namespace std; int n; char a[10010]; string s; int p[10010]; void manacher() { int pos=0,mx=0; for(int i=0;i<s.length();i++) { if(i<mx) { p[i]=min(mx-i,p[2*pos-mx]); } while(s[i-p[i]]==s[i+p[i]]) p[i]++; p[i]--; if(i+p[i]>mx)//当前范围大 { mx=i+p[i]; pos=i;//zx } } mx=0; for(int i=0;i<s.length();i++) { if(p[i]>mx) { mx=p[i]; n=i; } } } int main() { scanf("%s",a); for(int i=0;i<strlen(a)-1;i++) { s=s+a[i]; s=s+'#'; } s=s+a[strlen(a)-1]; manacher(); for(int i=n-p[n];i<=n+p[n];i++) { if(s[i]!='#') printf("%c",s[i]); } return 0; }
splay bzoj1588 调了好长时间
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct data { int fa,l,r,size,cnt,key; }tree[100010]; bool flag1,flag2; int root,n,tot,ans,a,b; int abs(int x) { return x>0?x:-x; } void update(int x) { tree[x].size=tree[tree[x].l].size+tree[tree[x].r].size+tree[x].cnt; } void zig(int x) { int y=tree[x].fa; int z=tree[x].r; tree[y].l=z; tree[z].fa=y; tree[x].fa=tree[y].fa; if(y==tree[tree[y].fa].l) tree[tree[y].fa].l=x; else tree[tree[y].fa].r=x; tree[x].r=y; tree[y].fa=x; update(x); update(y); } void zag(int x) { int y=tree[x].fa; int z=tree[x].l; tree[y].r=z; tree[z].fa=y; tree[x].fa=tree[y].fa; if(y==tree[tree[y].fa].l) tree[tree[y].fa].l=x; else tree[tree[y].fa].r=x; tree[x].l=y; tree[y].fa=x; update(x); update(y); } void splay(int x) { if(!root) { root=x; return; } while(tree[x].fa) { int y=tree[x].fa; int z=tree[y].fa; if(y==root) { if(x==tree[root].l) zig(x); else zag(x); update(x); break; } else if(y==tree[z].l&&x==tree[y].l) {zig(y); zig(x);} else if(y==tree[z].r&&x==tree[y].r) {zag(y); zag(x);} else if(y==tree[z].l&&x==tree[y].r) {zag(x); zig(x);} else if(y==tree[z].r&&x==tree[y].l) {zig(x); zag(x);} update(x); } root=x; } void insert(int x,int k) { if(tree[x].key<k) { if(tree[x].r==0) { ++tot; tree[tot].fa=x; if(x) tree[x].r=tot; tree[tot].key=k; tree[tot].cnt=1; update(tot); update(x); splay(tot); return; } insert(tree[x].r,k); update(x); } else { if(tree[x].l==0) { ++tot; tree[tot].fa=x; if(x) tree[x].l=tot; tree[tot].key=k; tree[tot].cnt=1; update(tot); update(x); splay(tot); return; } insert(tree[x].l,k); update(x); } } void findnxt(int x,int k,int pd) { if(x==0) return; if(pd==0) { if(tree[x].key<=k) { flag1=true; a=tree[x].key; findnxt(tree[x].r,k,pd); } else findnxt(tree[x].l,k,pd); } else { if(tree[x].key>=k) { flag2=true; b=tree[x].key; findnxt(tree[x].l,k,pd); } else findnxt(tree[x].r,k,pd); } } int main() { scanf("%d",&n); while(n--) { int x; scanf("%d",&x); findnxt(root,x,0); findnxt(root,x,1); int temp=0; bool flag=false; // printf("%d %d\n",a,b); if(flag1) { temp=abs(a-x); flag=true; } if(flag2) { if(flag) temp=min(temp,abs(b-x)); else temp=abs(b-x); } if(tree[root].size==0) ans+=x; else ans+=temp; insert(root,x); flag1=false; flag2=false; a=0; b=0; } printf("%d",ans); return 0; }
cdq bzoj3224
#include<cstdio> #include<vector> #include<map> #include<cstring> #include<algorithm> using namespace std; #define K 3000010 struct data { int s,c,m,type,pos,size; }f[K],F[K]; vector<data> c; int n,k,tot; int tree[K],ans[K],temp[K],size[K]; int lowbit(int x) { return x&(-x); } void update(int pos,int delta) { for(int i=pos;i<=k;i+=lowbit(i)) tree[i]+=delta; } int sum(int pos) { int ret=0; for(int i=pos;i>0;i-=lowbit(i)) ret+=tree[i]; return ret; } bool cp(data x,data y) { if(x.s!=y.s) return x.s<y.s; if(x.c!=y.c) return x.c<y.c; return x.m<y.m; } bool cp1(data x,data y) { if(x.c!=y.c) return x.c<y.c; if(x.m!=y.m) return x.m<y.m; return x.type<y.type; } void cdq(int l,int r) { if(l>=r) return; int mid=(l+r)/2; cdq(l,mid); cdq(mid+1,r); c.clear(); for(int i=l;i<=mid;i++) { data t=f[i]; t.type=1; c.push_back(t); } for(int i=mid+1;i<=r;i++) { data t=f[i]; t.type=2; c.push_back(t); } sort(c.begin(),c.end(),cp1); for(int i=0;i<c.size();i++) { if(c[i].type==1) update(c[i].m,c[i].size); if(c[i].type==2) { temp[c[i].pos]+=sum(c[i].m); } } for(int i=0;i<c.size();i++) { if(c[i].type==1) update(c[i].m,-c[i].size); } } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d%d%d",&F[i].s,&F[i].c,&F[i].m); F[i].size++; } sort(F+1,F+n+1,cp); f[++tot]=F[1]; f[1].pos=1; for(int i=2;i<=n;i++) { if(F[i].s!=F[i-1].s||F[i].c!=F[i-1].c||F[i].m!=F[i-1].m) { f[++tot]=F[i]; f[tot].pos=tot; } else f[tot].size++; } cdq(1,tot); for(int i=1;i<=tot;i++) { temp[i]+=f[i].size-1; ans[temp[i]]+=f[i].size; } for(int i=0;i<n;i++) { printf("%d\n",ans[i]); } return 0; }
主席树 poj2104 自己想不出来 zz
#include<cstdio> #include<cstring> #include<algorithm> #define N 1000010 using namespace std; int n,cnt,m; int rt[N],l[N],r[N],a[N],b[N],c[N],sum[N]; bool cp(int x,int y) { return a[x]<a[y]; } void build(int ll,int rr,int&x) { x=++cnt; if(ll==rr) return; build(ll,(ll+rr)/2,l[x]); build((ll+rr)/2+1,rr,r[x]); } void update(int ll,int rr,int&x,int last,int pos) { x=++cnt; l[x]=l[last]; r[x]=r[last]; sum[x]=sum[last]+1; if(ll==rr) return; if(pos>(ll+rr)/2) update((ll+rr)/2+1,rr,r[x],r[last],pos); else update(ll,(ll+rr)/2,l[x],l[last],pos); } int query(int ll,int rr,int x,int y,int k) { if(ll==rr) return ll; int temp=sum[l[x]]-sum[l[y]]; // printf("%d\n",temp); if(temp>=k) return query(ll,(ll+rr)/2,l[x],l[y],k); else return query((ll+rr)/2+1,rr,r[x],r[y],k-temp); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); c[i]=i; } sort(c+1,c+n+1,cp);//c是编号 for(int i=1;i<=n;i++) { b[c[i]]=a[i]; } build(1,n,rt[0]); for(int i=1;i<=n;i++) { update(1,n,rt[i],rt[i-1],c[i]); } while(m--) { int l,r,k; scanf("%d%d%d",&l,&r,&k); // printf("%d\n",query(1,n,rt[r],rt[l-1],k)); printf("%d\n",b[query(1,n,rt[r],rt[l-1],k)]); } return 0; }
gauss
#include<iostream> #include<cstdio> using namespace std; int n; double a[20][20],b[20][20]; void Init() { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { b[i][j]=2*a[i][j]-2*a[i+1][j]; b[i][n+1]+=a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j]; } } } void gauss() { for(int now=1;now<=n;now++) { int x=now; for(int j=now+1;j<=n;j++) { if(b[j][now]>b[x][now]) x=j; } for(int j=1;j<=n+1;j++) swap(b[now][j],b[x][j]); double t=b[now][now]; for(int i=now;i<=n+1;i++) b[now][i]/=t; for(int row=now+1;row<=n;row++) { t=b[row][now]; for(int i=now;i<=n+1;i++) b[row][i]-=b[now][i]*t; } } for(int now=n;now>=2;now--) for(int row=now-1;row>=1;row--) b[row][n+1]-=b[now][n+1]*b[row][now]; for(int i=1;i<n;i++) printf("%.3lf ",b[i][n+1]); printf("%.3lf",b[n][n+1]); } int main() { scanf("%d",&n); for(int i=1;i<=n+1;i++) for(int j=1;j<=n;j++) { scanf("%lf",&a[i][j]); } Init(); gauss(); return 0; }
看毛片 matrix67
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int j; string a,b; int nxt[110]; int main() { cin>>a>>b; a=' '+a; b=' '+b; for(int i=2;i<b.length()-1;i++) { while(j>0&&b[j+1]!=b[i]) j=nxt[j];//推下一个 if(b[j+1]==b[i]) j++;//相等 nxt[i]=j;//最大相等串 } j=0; for(int i=1;i<a.length();i++) { while(j>0&&a[i]!=b[j+1]) j=nxt[j]; if(a[i]==b[j+1]) j++; if(j==b.length()-1) { printf("%d",i-j+1); return 0; } } return 0; }
ac自动机调不对a
哭晕在厕所里