SDOI前的小计划
upd:19.4.5 放出来了。如果明天考了我没复习到的认了。考到了复习了的还没拿到理想分的就回来谢罪(bushi
www
SDOI一轮倒计时4天啦w
所以得有个小计划吧QwQ
4.2
目标:BZOJ5407
模板:
✔最小树形图
- //Love and Freedom.
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #define ll long long
- #define inf 20021225
- #define M 10010
- #define N 110
- #define totsize sizeof(int)*(n+1)
- using namespace std;
- struct edge{int u,v,w;}e[M];
- int id[N],mn[N],pre[N],vis[N];
- int n,m;
- int zlal(int rt)
- {
- int res=;
- while()
- {
- for(int i=;i<=n;i++) mn[i]=inf;
- for(int i=;i<=m;i++)
- if(e[i].u!=e[i].v && e[i].w<mn[e[i].v])
- mn[e[i].v]=e[i].w,pre[e[i].v]=e[i].u;
- for(int i=;i<=n;i++) if(i!=rt)
- if(mn[i]==inf) return -;
- int tn=,u,v;
- memset(id,,totsize); memset(vis,,totsize);
- mn[rt]=;
- for(int i=;i<=n;i++)
- {
- res+=mn[i]; v=i;
- while(v!=rt&&!id[v]&&vis[v]!=i)
- vis[v]=i,v=pre[v];
- if(v!=rt&&!id[v])
- {
- ++tn;
- for(u=pre[v];u!=v;u=pre[u])
- id[u]=tn;
- id[v]=tn;
- }
- }
- if(!tn) return res;
- for(int i=;i<=n;i++) if(!id[i])
- id[i]=++tn;
- for(int i=;i<=m;i++)
- {
- int v=e[i].v;
- e[i].u=id[e[i].u];
- e[i].v=id[e[i].v];
- if(e[i].u!=e[i].v)
- e[i].w-=mn[v];
- }
- n=tn; rt=id[rt];
- }
- }
- int main()
- {
- int r; scanf("%d%d%d",&n,&m,&r);
- for(int i=;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
- printf("%d\n",zlal(r));
- return ;
- }
✔主席树
- //Love and Freedom.
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #define ll long long
- #define inf 20021225
- #define N 200010
- using namespace std;
- int read()
- {
- int s=,f=; char ch=getchar();
- while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
- while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
- return s;
- }
- struct node{int ls,rs,s;};
- struct SGT
- {
- node t[N*]; int poi;
- void pushup(int x){t[x].s=t[t[x].ls].s+t[t[x].rs].s;}
- void build(int &x,int l,int r)
- {
- x=++poi; if(l==r) return; int mid=l+r>>;
- build(t[x].ls,l,mid); build(t[x].rs,mid+,r);
- }
- void modify(int &x,int l,int r,int lt,int d)
- {
- x=++poi; t[x]=t[lt]; t[x].s++;
- if(l==r) return; int mid=l+r>>;
- if(d<=mid) modify(t[x].ls,l,mid,t[lt].ls,d);
- else modify(t[x].rs,mid+,r,t[lt].rs,d);
- }
- int query(int x,int y,int l,int r,int d)
- {
- if(l==r) return l;
- int s=t[t[y].ls].s-t[t[x].ls].s,mid=l+r>>;
- if(s>=d) return query(t[x].ls,t[y].ls,l,mid,d);
- else return query(t[x].rs,t[y].rs,mid+,r,d-s);
- }
- }sgt;
- int a[N],rt[N],n,m,h[N];
- int main()
- {
- n=read(); m=read();
- for(int i=;i<=n;i++) a[i]=read(),h[i]=a[i];
- sort(h+,h+n+); int nn=unique(h+,h+n+)-h-; sgt.build(rt[],,nn);
- for(int i=;i<=n;i++) a[i]=lower_bound(h+,h+nn+,a[i])-h,sgt.modify(rt[i],,nn,rt[i-],a[i]);
- for(int i=;i<=m;i++)
- {
- int l,r,k; l=read(); r=read(); k=read();
- printf("%d\n",h[sgt.query(rt[l-],rt[r],,nn,k)]);
- }
- return ;
- }
(菜死了 11min才写完还手贱wa了一发QAQ)
✔Tarjan 割点/缩点
✔FFT(快读神tm加速1/4)
- //Love and Freedom.
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #define ll long long
- #define inf 20021225
- #define db double
- #define N 4000100
- using namespace std;
- const db pi=acos(-1.0);
- int read()
- {
- char ch=getchar(); int s=;
- while(ch>''||ch<'') ch=getchar();
- while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
- return s;
- }
- struct cpx
- {
- db x,y;
- cpx(){}
- cpx(db xx,db yy){x=xx,y=yy;}
- };
- cpx operator+(cpx a,cpx b){return cpx(a.x+b.x,a.y+b.y);}
- cpx operator-(cpx a,cpx b){return cpx(a.x-b.x,a.y-b.y);}
- cpx operator*(cpx a,cpx b){return cpx(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
- int rev[N];
- int pre(int n)
- {
- int lim=,l=;
- while(lim<n) lim<<=,l++;
- for(int i=;i<lim;i++)
- rev[i]=(rev[i>>]>>)|((i&)<<(l-));
- return lim;
- }
- void fft(cpx *a,int lim,bool f)
- {
- for(int i=;i<lim;i++) if(rev[i]>i)
- swap(a[i],a[rev[i]]);
- for(int k=,mid=;k<=lim;mid<<=,k<<=)
- {
- cpx Wn=cpx(cos(pi/mid),sin(pi/mid));
- if(f) Wn.y=-Wn.y;
- for(int i=;i<lim;i+=k)
- {
- cpx w=cpx(1.0,0.0);
- for(int j=;j<mid;j++,w=w*Wn)
- {
- cpx x=a[i+j],y=w*a[i+j+mid];
- a[i+j]=x+y,a[i+j+mid]=x-y;
- }
- }
- }
- }
- cpx f[N],g[N];
- int main()
- {
- int n,m; n=read(); m=read(); n++;m++;
- for(int i=;i<n;i++) f[i].x=read();
- for(int i=;i<m;i++) g[i].x=read();
- int lim=pre(n+m); fft(f,lim,); fft(g,lim,);
- for(int i=;i<lim;i++) f[i]=f[i]*g[i];
- fft(f,lim,);
- for(int i=;i<n+m-;i++) printf("%d ",(int)(f[i].x/lim+0.5));
- return ;
- }
✔NTT
✔多项式求逆
✔多项式ln
✔多项式exp
✔多项式除法
✔多项式开根
- //Love and Freedom.
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #define ll long long
- #define inf 20021225
- #define N 400100
- #define mdn 998244353
- #define G 3
- using namespace std;
- int read()
- {
- char ch=getchar(); int s=;
- while(ch>''||ch<'') ch=getchar();
- while(ch<=''&&ch>='') s=s*+ch-'',ch=getchar();
- return s;
- }
- int rev[N];
- int f[N];
- int ksm(int bs,int mi)
- {
- int ans=;
- while(mi)
- {
- if(mi&) ans=(ll)ans*bs%mdn;
- bs=(ll)bs*bs%mdn; mi>>=;
- }
- return ans;
- }
- int inv;
- int pre(int n)
- {
- int lim=,l=;
- while(lim<n) lim<<=,l++;
- for(int i=;i<lim;i++)
- rev[i]=(rev[i>>]>>)|((i&)<<(l-));
- inv=ksm(lim,mdn-);
- return lim;
- }
- void NTT(int *a,int lim,int f)
- {
- for(int i=;i<lim;i++) if(rev[i]<i)
- swap(a[rev[i]],a[i]);
- for(int k=,mid=;k<=lim;mid<<=,k<<=)
- {
- int Wn=ksm(G,(mdn-)/k); if(f) Wn=ksm(Wn,mdn-);
- for(int i=,w=;i<lim;i+=k,w=)
- for(int j=;j<mid;j++,w=(ll)w*Wn%mdn)
- {
- int x=a[i+j],y=(ll)w*a[i+j+mid]%mdn;
- a[i+j]=x+y>=mdn?x+y-mdn:x+y;
- a[i+j+mid]=x-y<?x-y+mdn:x-y;
- }
- }
- if(f) for(int i=;i<lim;i++) a[i]=(ll)a[i]*inv%mdn;
- }
- /**
- poly_inv
- 求 f*g=1(% x^n)
- 因此 g=1(% x^[n/2])
- 已知 f*h=1(% x^[n/2])
- 可得 g-h=0(% x^[n/2])
- 平方 g^2+h^2-2g*h=0(% x^n)
- 左乘f得到 g=2fh-fh^2(% x^n)
- 递归求解
- */
- struct poly_inv
- {
- int g[N],h[N];
- void inv(int *a,int n)
- {
- if(n==){g[]=ksm(a[],mdn-);return;}
- int mid=(n+)>>; inv(a,mid); int lim=pre(n<<);
- for(int i=;i<n;i++) h[i]=a[i];
- for(int i=n;i<lim;i++) h[i]=;
- NTT(h,lim,); NTT(g,lim,);
- for(int i=;i<lim;i++)
- g[i]=(2ll-(ll)g[i]*h[i]%mdn+mdn)%mdn*g[i]%mdn;
- NTT(g,lim,);
- for(int i=n;i<lim;i++) g[i]=;
- }
- void print(int n)
- {
- for(int i=;i<n;i++) printf("%d ",g[i]);
- }
- }INV;
- /**
- poly_ln
- 求g=ln(f)
- 对复合函数g(f)求导
- (ln(f))'=ln'(f)f'=(1/f)*f'
- 即 g'=1/f*f'
- 积分回去就行了
- */
- struct poly_ln
- {
- int g[N],h[N];
- void ln(int *a,int n)
- {
- INV.inv(a,n);
- for(int i=;i<n;i++) g[i]=INV.g[i];
- for(int i=;i<n;i++) h[i-]=(ll)f[i]*i%mdn;
- int lim=pre(n<<); NTT(g,lim,); NTT(h,lim,);
- for(int i=;i<lim;i++) h[i]=(ll)g[i]*h[i]%mdn;
- NTT(h,lim,);
- for(int i=;i<n;i++) g[i+]=(ll)h[i]*ksm(i+,mdn-)%mdn;
- g[]=;
- }
- void print(int n)
- {
- for(int i=;i<n;i++) printf("%d ",g[i]);
- }
- }LN;
- /**
- poly_exp
- 求 g=e^f
- 根据牛顿迭代+泰勒展开
- 可以得到
- h(f)=0(% x^n)
- 展开一次【开方 h(f0)=0(% x^n/2)
- h(f0)+h'(f0)(f-f0)=0(% x^n)
- 移项 f=f0-h(f0)/h'(f0)
- 由于我们求的g=e^f 取h为lng-f=0(% x^n)
- 所以带进去就是 g=g0-(lng0-f)/lng0=g0*(1-lng0+f)
- */
- struct poly_exp
- {
- int s[N],g[N],tmp[N];
- void exp(int *a,int n)
- {
- if(n==){s[]=;return;}
- int mid=n+>>; exp(a,mid);
- for(int i=;i<(n<<);i++) g[i]=;
- LN.ln(g,n);
- for(int i=;i<n;i++) g[i]=LN.g[i],tmp[i]=a[i];
- int lim=pre(n<<);
- NTT(g,lim,);NTT(tmp,lim,);NTT(s,lim,);
- for(int i=;i<lim;i++)
- s[i]=((ll)tmp[i]-g[i]++mdn)%mdn*s[i]%mdn;
- NTT(s,lim,);
- for(int i=n;i<lim;i++) g[i]=tmp[i]=;
- }
- void print(int n)
- {
- for(int i=;i<n;i++) printf("%d ",s[i]);
- }
- }EXP;
- /**
- poly_div
- 通过系数翻转
- f n次 g m次
- f=g*h+r
- fR=x^nf(1/x)
- 所以全部翻转再左乘x^n
- 可以得到
- x^nfR=x^mgR*x^(n-m)hR+x^(n-m+1)*x^(m-1)rR
- 其实就是
- fR=gR*hR+x^(n-m+1)rR
- 于是我们可以在%x^(n-m+1)意义下先求逆得到hR
- 然后翻回去求r
- */
- int main()
- {
- int n; n=read();
- for(int i=;i<n;i++) f[i]=read();
- EXP.exp(f,n); EXP.print(n);
- return ;
- }
(写了前三个 exp懒得调了发现还要清前面的ln啥的就扔在那看看吧QAQ)(多项式除法没写QAQ)
✔左偏树
- //Love and Freedom.
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #define ll long long
- #define inf 20021225
- #define N 100010
- using namespace std;
- int read()
- {
- int f=,s=; char ch=getchar();
- while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
- while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
- return f*s;
- }
- struct node{int val,fa,son[],dis; bool tag;}t[N];
- int find(int x){return t[x].fa^x?t[x].fa=find(t[x].fa):x;}
- int merge(int x,int y)
- {
- if(!x||!y) return x|y;
- if(t[y].val<t[x].val||(t[y].val==t[x].val&&y<x)) swap(x,y);
- t[x].son[]=merge(t[x].son[],y);
- t[t[x].son[]].fa=t[t[x].son[]].fa=x; t[x].fa=x;
- if(t[t[x].son[]].dis>t[t[x].son[]].dis) swap(t[x].son[],t[x].son[]);
- t[x].dis=t[t[x].son[]].dis+;
- return x;
- }
- void pop(int x)
- {
- t[x].tag=; printf("%d\n",t[x].val);
- t[t[x].son[]].fa=t[x].son[]; t[t[x].son[]].fa=t[x].son[];
- t[x].fa=merge(t[x].son[],t[x].son[]);
- }
- int n,m;
- int main()
- {
- n=read(); m=read(); int opt,x,y;
- for(int i=;i<=n;i++) t[i].val=read(),t[i].fa=i;
- for(int i=;i<=m;i++)
- {
- opt=read(); x=read();
- if(opt==)
- {
- y=read(); if(t[x].tag||t[y].tag) continue;
- x=find(x); y=find(y); if(x==y) continue;
- merge(x,y);
- }
- else
- {
- if(t[x].tag){printf("-1\n"); continue;}
- x=find(x); pop(x);
- }
- }
- return ;
- }
✔KD树
✔圆方树
✔FWT
- /**
- OR
- FWT(A)=(FWT(A0),FWT(A0+A1))
- IFWT(A)=(IFWT(A0),IFWT(A1-A0))
- */
- /**
- AND
- FWT(A)=(FWT(A0+A1),FWT(A1))
- IFWT(A)=(IFWT(A0-A1),IFWT(A1))
- */
- /**
- XOR
- FWT(A)=(FWT(A0+A1),FWT(A0-A1))
- IFWT(A)=(IFWT(A0+A1)/2,IFWT(A0-A1)/2)
- */
- //Love and Freedom.
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #define ll long long
- #define inf 20021225
- #define N 2000100
- #define mdn 998244353
- using namespace std;
- int read()
- {
- int s=,f=; char ch=getchar();
- while(ch>''||ch<''){if(ch=='-') f=-;ch=getchar();}
- while(ch<=''&&ch>='') s=s*+ch-'',ch=getchar();
- return (s*f%mdn+mdn)%mdn;
- }
- int a[N],b[N],c[N]; int inv=;
- void fwt(int *a,int top,int type)
- {
- for(int k=,mid=;k<=top;k<<=,mid<<=)
- for(int i=;i<top;i+=k) for(int j=;j<mid;j++)
- {
- int x=a[i+j],y=a[i+j+mid];
- if(type==) a[i+j]=x,a[i+j+mid]=(x+y)%mdn;
- else if(type==) a[i+j]=(x+y)%mdn,a[i+j+mid]=y;
- else if(type==) a[i+j]=(x+y)%mdn,a[i+j+mid]=(x-y+mdn)%mdn;
- else if(type==-) a[i+j]=x,a[i+j+mid]=(y-x+mdn)%mdn;
- else if(type==-) a[i+j]=(x-y+mdn)%mdn,a[i+j+mid]=y;
- else if(type==-) a[i+j]=(ll)(x+y)%mdn*inv%mdn,a[i+mid+j]=((ll)(x-y)%mdn*inv%mdn+mdn)%mdn;
- }
- }
- int top;
- void query(int type)
- {
- fwt(a,top,type); fwt(b,top,type);
- for(int i=;i<top;i++) c[i]=(ll)a[i]*b[i]%mdn;
- fwt(c,top,-type); fwt(a,top,-type); fwt(b,top,-type);
- for(int i=;i<top;i++) printf("%d ",c[i]);
- printf("\n");
- }
- int main()
- {
- int n;
- scanf("%d",&n); top=<<n;
- for(int i=;i<top;i++) scanf("%d",&a[i]);
- for(int i=;i<top;i++) scanf("%d",&b[i]);
- query(); query(); query();
- return ;
- }
✔0/1分数规划
✔后缀自动机
- //Love and Freedom.
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #define ll long long
- #define inf 20021225
- #define N 1000100
- using namespace std;
- struct node{int ch[],fa,len,sz;}t[N*];
- struct edge{int to,lt;}e[N*];
- char ch[N]; int in[N*],cnt,lt,rt,poi,ans,n;
- void add(int x,int y){e[++cnt].to=y;e[cnt].lt=in[x];in[x]=cnt;}
- int id(char c){return c-'a';}
- void insert(int c)
- {
- int p=lt,np=lt=++poi; t[np].len=t[p].len+; t[np].sz=;
- for(;p&&!t[p].ch[c];p=t[p].fa) t[p].ch[c]=np;
- if(!p){t[np].fa=rt; return;}
- int q=t[p].ch[c];
- if(t[q].len==t[p].len+){t[np].fa=q; return;}
- int nq=++poi; t[nq].fa=t[q].fa; t[q].fa=t[np].fa=nq;
- memcpy(t[nq].ch,t[q].ch,sizeof(t[nq].ch)); t[nq].len=t[p].len+;
- for(;p&&t[p].ch[c]==q;p=t[p].fa) t[p].ch[c]=nq;
- }
- void build()
- {
- for(int i=;i<=poi;i++) add(t[i].fa,i);
- }
- void dfs(int x)
- {
- for(int i=in[x];i;i=e[i].lt)
- dfs(e[i].to),t[x].sz+=t[e[i].to].sz;
- if(t[x].sz!=) ans=max(ans,t[x].len*t[x].sz);
- }
- int main()
- {
- scanf("%s",ch+); n=strlen(ch+); rt=lt=poi=;
- for(int i=;i<=n;i++) insert(id(ch[i]));
- build(); dfs(); printf("%d\n",ans);
- return ;
- }
✔线性规划
- //Love and Freedom.
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #include<ctime>
- #define db long double
- #define ll long long
- #define inf 20021225
- #define eps 1e-10
- using namespace std;
- db a[][],ans[]; int id[],n,m;
- void pivot(int x,int y)
- {
- swap(id[n+x],id[y]);
- db w=1.0/a[x][y]; a[x][y]=1.0;
- for(int i=;i<=n;i++) a[x][i]*=w;
- for(int i=;i<=m;i++)
- {
- if(i==x || abs(a[i][y])<eps) continue;
- w=a[i][y]; a[i][y]=0.0;
- for(int j=;j<=n;j++)
- a[i][j]-=a[x][j]*w;
- }
- }
- bool prework()
- {
- while()
- {
- int x=,y=;
- for(int i=;i<=m;i++) if(a[i][]<-eps && (!x||rand()&)) x=i;
- if(!x) return true;
- for(int i=;i<=n;i++) if(a[x][i]<-eps && (!y||rand()&)) y=i;
- if(!y){printf("Infeasible\n");return false;}
- pivot(x,y);
- }
- }
- bool simplex()
- {
- while()
- {
- int x=,y=; db mn=1e15;
- for(int i=;i<=n;i++) if(a[][i]>eps){y=i;break;}
- if(!y) return true;
- for(int i=;i<=m;i++)
- if(a[i][y]>eps && a[i][]/a[i][y]<mn)
- x=i,mn=a[i][]/a[i][y];
- if(!x){printf("Unbounded\n");return false;}
- pivot(x,y);
- }
- }
- int main()
- {
- srand(time()); int t;
- scanf("%d%d%d",&n,&m,&t);
- for(int i=;i<=n;i++) scanf("%Lf",&a[][i]),id[i]=i;
- for(int i=;i<=m;i++)
- {
- for(int j=;j<=n;j++) scanf("%Lf",&a[i][j]);
- scanf("%Lf",&a[i][]);
- }
- if(prework()&&simplex())
- {
- printf("%.8Lf\n",-a[][]);
- if(t)
- {
- for(int i=;i<=m;i++) ans[id[n+i]]=a[i][];
- for(int i=;i<=n;i++) printf("%.8Lf ",ans[i]);
- }
- }
- return ;
- }
回文自动机
✔半平面交
✔旋转卡壳
✔欧拉回路
✔整体二分
✔可持久并查集
✔kruskal重构树
✔点分治/动态点分治
✔凸优化/斜率优化
上下界网络流
✔差分约束
✔LCT
- //Love and Freedom.
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #define ll long long
- #define inf 20021225
- #define N 300100
- #define ls(x) t[x].son[0]
- #define rs(x) t[x].son[1]
- #define fa(x) t[x].fa
- #define isroot(x) (rs(fa(x))!=x && ls(fa(x))!=x)
- using namespace std;
- struct node{int fa,son[],val,sum; bool rev;}t[N];
- void pushup(int x){t[x].sum=t[ls(x)].sum^t[rs(x)].sum^t[x].val;}
- void pushdown(int x)
- {
- if(t[x].rev)
- {
- if(ls(x)) t[ls(x)].rev^=;
- if(rs(x)) t[rs(x)].rev^=;
- swap(ls(x),rs(x)); t[x].rev=;
- }
- }
- void rotate(int x)
- {
- if(!x || isroot(x)) return;
- int f=fa(x),gf=fa(f);
- int k=rs(f)==x,p=k^;
- if(!isroot(f)) t[gf].son[rs(gf)==f]=x;
- t[x].fa=gf; t[f].fa=x;
- if(t[x].son[p]) t[t[x].son[p]].fa=f;
- t[f].son[k]=t[x].son[p]; t[x].son[p]=f;
- pushup(f); pushup(x);
- }
- void push(int x){if(!isroot(x)) push(fa(x));pushdown(x);}
- void splay(int x)
- {
- push(x);
- while(!isroot(x))
- {
- int f=fa(x),gf=fa(f);
- if(!isroot(f)) (rs(gf)==f)^(rs(f)==x)?rotate(x):rotate(f);
- rotate(x);
- }
- }
- void access(int x)
- {
- int y=;
- do
- {
- splay(x);
- t[x].son[]=y;
- pushup(x);
- y=x; x=t[x].fa;
- }while(x);
- }
- void makeroot(int x)
- {
- access(x); splay(x); t[x].rev=;
- }
- int findroot(int x)
- {
- access(x); splay(x);
- while(ls(x)) x=ls(x);
- return x;
- }
- void link(int x,int y)
- {
- makeroot(x);
- if(findroot(y)==x) return;
- t[x].fa=y;
- }
- void cut(int x,int y)
- {
- makeroot(x);
- if(findroot(y)==x && t[x].fa==y && !t[x].son[])
- {
- t[x].fa=t[y].son[]=; pushup(y);
- }
- }
- void modify(int x,int val)
- {
- splay(x);
- t[x].val=val;
- pushup(x);
- }
- int query(int x,int y)
- {
- makeroot(x);access(y);splay(y);return t[y].sum;
- }
- int main()
- {
- int n,m,i,x,y,opt;
- scanf("%d%d",&n,&m);
- for(i=;i<=n;i++) scanf("%d",&t[i].val);
- for(i=;i<=m;i++)
- {
- scanf("%d%d%d",&opt,&x,&y);
- if(opt==) printf("%d\n",query(x,y));
- if(opt==) link(x,y);
- if(opt==) cut(x,y);
- if(opt==) modify(x,y);
- }
- return ;
- }
莫比乌斯反演
积性函数相关
✔Polya
线段树合并
✔插头dp
✔虚树
✔CRT/EXCRT
- //Love and Freedom.
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #define ll long long
- #define ldb long double
- #define inf 20021225
- #define N 100010
- using namespace std;
- ll ksc(ll a,ll b,ll md)
- {
- ll c=(a*b-(ll)((ldb)a/md*b+0.5)*md);
- return c<?c+md:c;
- }
- ll exgcd(ll a,ll b,ll &x,ll &y)
- {
- if(!b){x=;y=;return a;}
- ll g=exgcd(b,a%b,x,y);// printf("QAQ");
- ll k=x; x=y; y=k-a/b*y; return g;
- }
- ll p[N],w[N]; int n;
- ll excrt()
- {
- ll x=w[],P=p[],t,s;
- for(int i=;i<=n;i++)
- {
- ll k=((w[i]-x)%p[i]+p[i])%p[i];
- ll g=exgcd(P,p[i],t,s); ll bs=p[i]/g;
- if(k%g!=) return -;
- t=ksc(t,k/g,bs); x+=t*P; P*=bs;
- x=(x%P+P)%P;
- }
- return x;
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=;i<=n;i++) scanf("%lld%lld",&p[i],&w[i]);
- printf("%lld\n",excrt());
- return ;
- }
SDOI前的小计划的更多相关文章
- WC前的小计划
写在前面的.. 要去WC了好开心的呢.. 但是之前荒废了好多时间呢.. 好吧从明天开始加紧训练,目标是:WC前bzoj300t..(现在是260呢..) 开始吧 来看看完成情况: 40/40 [201 ...
- 冬令营前的一些计划&记录
冬令营前的一些计划&记录 计划 yyb发现自己很多以前学过的东西完完全全不记得了,所以在接下来的时间里可能会留下多篇复习向的博客,当然也可能因为觉得没有必要复习而到处乱做题. 现在先大概归类一 ...
- 利用快排partition求前N小的元素
求前k小的数,一般人的想法就是先排序,然后再遍历,但是题目只是求前N小,没有必要完全排序,所以可以想到部分排序,而能够部分排序的排序算法我能想到的就是堆排序和快排了. 第一种思路,局部堆排序. 首先, ...
- bzoj 前100题计划
bzoj前100题计划 xz布置的巨大的坑.. 有空填题解... 1002 轮状病毒 用python手动matrixtree打表. #include<bits/stdc++.h> #def ...
- NOIP前的一些计划
一些想法 距离NOIP2018只剩下一个星期的时间了,通过这几天在长郡的考试,渐渐感觉还有好多东西自己还不够熟练,也有些东西到现在还不会,现将NOIP前的一些计划列在这里,希望能在考前把他们全部完成吧 ...
- 1245 最小的N个和(前k小ai+bi)
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 有两个长度为 N ...
- 线段树维护区间前k小
线段树维护区间前k小 $ solution: $ 觉得超级钢琴太麻烦?在这里线段树提供一条龙服务 . 咳咳,开始讲正题!这道题我们有一个和超级钢琴复杂度一样 $ ~O(~\sum x\times lo ...
- word段落前的小点·
原因是因为修改论文时,要求在论文的标题前加上 '·' 类似: 在网上搜索了半天,都是加符号,特此记录 解决: 1.文件---选项---显示--勾选段落标记 2.修改样式 至此,设置完毕,章节前的小点已 ...
- 网站网址前的小logo
认识网页前小图标 1.能在浏览器标签.地址栏左边和收藏夹栏显示小图标的网站,其网站都是使用了其名称为"favicon.ico"图标文件,格式为ico格式,图标大小一般为16*16, ...
随机推荐
- selenium中get_cookies()和add_cookie()的用法
在用selenium爬取网页的时候,有时候需要登陆,这时候用selenium获取cookie和携带cookie是很方便的,获取cookie可以通过内置的函数get_cookies(),它得到的是一组c ...
- codeforces 380A Sereja and Prefixes (递归)
题目: A. Sereja and Prefixes time limit per test 1 second memory limit per test 256 megabytes input st ...
- Linux 用户和组信息
linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号.在使用linux操作系统时候,通常我们会遇到对多用户进行管理.比如: 用户账号的添加. ...
- 第 2 章 前端基础之CSS
一.CSS语法 CSS规则由两个主要的部分构成:选择器,以及一条或多条声明. ''' selector { property: value; property: value; ... property ...
- tp 框架目录结构
ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的.最早诞生于2006年初,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布.ThinkPHP从诞生以来一 ...
- poj2376Cleaning Shifts (贪心求解)
描述 大表哥分配 N (1 <= N <= 25,000) 只中的一些奶牛在牛棚附近做些清洁. 他总是要让至少一只牛做清洁.他把一天分成T段(1 <= T <= 1,000,0 ...
- hdu6699Block Breaker
Problem Description Given a rectangle frame of size n×m. Initially, the frame is strewn with n×m squ ...
- JavaScript List
function List() { this.listSize = 0; this.pos = 0; this.dataSource = []; this.clear = fu ...
- ToString()的简单介绍
1.在某一个类中重写该类的toString()方法,是为了方便打印该类实例中的内容.
- BZOJ 1109 (LIS)
题面 传送门 分析 设dp[i]是第i个积木在自己的位置上时,前i个积木中最多能回到自己位置的数目. \(dp[i]=max(dp[j])+1 (i>j,a[i]>a[j],a[i]-a[ ...