upd:19.4.5 放出来了。如果明天考了我没复习到的认了。考到了复习了的还没拿到理想分的就回来谢罪(bushi

www

SDOI一轮倒计时4天啦w

所以得有个小计划吧QwQ

4.2

目标:BZOJ5407

模板:

✔最小树形图

  1. //Love and Freedom.
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define ll long long
  7. #define inf 20021225
  8. #define M 10010
  9. #define N 110
  10. #define totsize sizeof(int)*(n+1)
  11. using namespace std;
  12.  
  13. struct edge{int u,v,w;}e[M];
  14. int id[N],mn[N],pre[N],vis[N];
  15. int n,m;
  16. int zlal(int rt)
  17. {
  18. int res=;
  19. while()
  20. {
  21. for(int i=;i<=n;i++) mn[i]=inf;
  22. for(int i=;i<=m;i++)
  23. if(e[i].u!=e[i].v && e[i].w<mn[e[i].v])
  24. mn[e[i].v]=e[i].w,pre[e[i].v]=e[i].u;
  25. for(int i=;i<=n;i++) if(i!=rt)
  26. if(mn[i]==inf) return -;
  27. int tn=,u,v;
  28. memset(id,,totsize); memset(vis,,totsize);
  29. mn[rt]=;
  30. for(int i=;i<=n;i++)
  31. {
  32. res+=mn[i]; v=i;
  33. while(v!=rt&&!id[v]&&vis[v]!=i)
  34. vis[v]=i,v=pre[v];
  35. if(v!=rt&&!id[v])
  36. {
  37. ++tn;
  38. for(u=pre[v];u!=v;u=pre[u])
  39. id[u]=tn;
  40. id[v]=tn;
  41. }
  42. }
  43. if(!tn) return res;
  44. for(int i=;i<=n;i++) if(!id[i])
  45. id[i]=++tn;
  46. for(int i=;i<=m;i++)
  47. {
  48. int v=e[i].v;
  49. e[i].u=id[e[i].u];
  50. e[i].v=id[e[i].v];
  51. if(e[i].u!=e[i].v)
  52. e[i].w-=mn[v];
  53. }
  54. n=tn; rt=id[rt];
  55. }
  56. }
  57. int main()
  58. {
  59. int r; scanf("%d%d%d",&n,&m,&r);
  60. for(int i=;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
  61. printf("%d\n",zlal(r));
  62. return ;
  63. }

✔主席树

  1. //Love and Freedom.
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define ll long long
  7. #define inf 20021225
  8. #define N 200010
  9. using namespace std;
  10.  
  11. int read()
  12. {
  13. int s=,f=; char ch=getchar();
  14. while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
  15. while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
  16. return s;
  17. }
  18. struct node{int ls,rs,s;};
  19. struct SGT
  20. {
  21. node t[N*]; int poi;
  22. void pushup(int x){t[x].s=t[t[x].ls].s+t[t[x].rs].s;}
  23. void build(int &x,int l,int r)
  24. {
  25. x=++poi; if(l==r) return; int mid=l+r>>;
  26. build(t[x].ls,l,mid); build(t[x].rs,mid+,r);
  27. }
  28. void modify(int &x,int l,int r,int lt,int d)
  29. {
  30. x=++poi; t[x]=t[lt]; t[x].s++;
  31. if(l==r) return; int mid=l+r>>;
  32. if(d<=mid) modify(t[x].ls,l,mid,t[lt].ls,d);
  33. else modify(t[x].rs,mid+,r,t[lt].rs,d);
  34. }
  35. int query(int x,int y,int l,int r,int d)
  36. {
  37. if(l==r) return l;
  38. int s=t[t[y].ls].s-t[t[x].ls].s,mid=l+r>>;
  39. if(s>=d) return query(t[x].ls,t[y].ls,l,mid,d);
  40. else return query(t[x].rs,t[y].rs,mid+,r,d-s);
  41. }
  42. }sgt;
  43. int a[N],rt[N],n,m,h[N];
  44. int main()
  45. {
  46. n=read(); m=read();
  47. for(int i=;i<=n;i++) a[i]=read(),h[i]=a[i];
  48. sort(h+,h+n+); int nn=unique(h+,h+n+)-h-; sgt.build(rt[],,nn);
  49. 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]);
  50. for(int i=;i<=m;i++)
  51. {
  52. int l,r,k; l=read(); r=read(); k=read();
  53. printf("%d\n",h[sgt.query(rt[l-],rt[r],,nn,k)]);
  54. }
  55. return ;
  56. }

(菜死了 11min才写完还手贱wa了一发QAQ)

✔Tarjan 割点/缩点

✔FFT(快读神tm加速1/4)

  1. //Love and Freedom.
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define ll long long
  7. #define inf 20021225
  8. #define db double
  9. #define N 4000100
  10. using namespace std;
  11. const db pi=acos(-1.0);
  12. int read()
  13. {
  14. char ch=getchar(); int s=;
  15. while(ch>''||ch<'') ch=getchar();
  16. while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
  17. return s;
  18. }
  19. struct cpx
  20. {
  21. db x,y;
  22. cpx(){}
  23. cpx(db xx,db yy){x=xx,y=yy;}
  24. };
  25. cpx operator+(cpx a,cpx b){return cpx(a.x+b.x,a.y+b.y);}
  26. cpx operator-(cpx a,cpx b){return cpx(a.x-b.x,a.y-b.y);}
  27. cpx operator*(cpx a,cpx b){return cpx(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
  28. int rev[N];
  29. int pre(int n)
  30. {
  31. int lim=,l=;
  32. while(lim<n) lim<<=,l++;
  33. for(int i=;i<lim;i++)
  34. rev[i]=(rev[i>>]>>)|((i&)<<(l-));
  35. return lim;
  36. }
  37. void fft(cpx *a,int lim,bool f)
  38. {
  39. for(int i=;i<lim;i++) if(rev[i]>i)
  40. swap(a[i],a[rev[i]]);
  41. for(int k=,mid=;k<=lim;mid<<=,k<<=)
  42. {
  43. cpx Wn=cpx(cos(pi/mid),sin(pi/mid));
  44. if(f) Wn.y=-Wn.y;
  45. for(int i=;i<lim;i+=k)
  46. {
  47. cpx w=cpx(1.0,0.0);
  48. for(int j=;j<mid;j++,w=w*Wn)
  49. {
  50. cpx x=a[i+j],y=w*a[i+j+mid];
  51. a[i+j]=x+y,a[i+j+mid]=x-y;
  52. }
  53. }
  54. }
  55. }
  56. cpx f[N],g[N];
  57. int main()
  58. {
  59. int n,m; n=read(); m=read(); n++;m++;
  60. for(int i=;i<n;i++) f[i].x=read();
  61. for(int i=;i<m;i++) g[i].x=read();
  62. int lim=pre(n+m); fft(f,lim,); fft(g,lim,);
  63. for(int i=;i<lim;i++) f[i]=f[i]*g[i];
  64. fft(f,lim,);
  65. for(int i=;i<n+m-;i++) printf("%d ",(int)(f[i].x/lim+0.5));
  66. return ;
  67. }

✔NTT

✔多项式求逆

✔多项式ln

✔多项式exp

✔多项式除法  

✔多项式开根

  1. //Love and Freedom.
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define ll long long
  7. #define inf 20021225
  8. #define N 400100
  9. #define mdn 998244353
  10. #define G 3
  11. using namespace std;
  12.  
  13. int read()
  14. {
  15. char ch=getchar(); int s=;
  16. while(ch>''||ch<'') ch=getchar();
  17. while(ch<=''&&ch>='') s=s*+ch-'',ch=getchar();
  18. return s;
  19. }
  20. int rev[N];
  21. int f[N];
  22. int ksm(int bs,int mi)
  23. {
  24. int ans=;
  25. while(mi)
  26. {
  27. if(mi&) ans=(ll)ans*bs%mdn;
  28. bs=(ll)bs*bs%mdn; mi>>=;
  29. }
  30. return ans;
  31. }
  32. int inv;
  33. int pre(int n)
  34. {
  35. int lim=,l=;
  36. while(lim<n) lim<<=,l++;
  37. for(int i=;i<lim;i++)
  38. rev[i]=(rev[i>>]>>)|((i&)<<(l-));
  39. inv=ksm(lim,mdn-);
  40. return lim;
  41. }
  42. void NTT(int *a,int lim,int f)
  43. {
  44. for(int i=;i<lim;i++) if(rev[i]<i)
  45. swap(a[rev[i]],a[i]);
  46. for(int k=,mid=;k<=lim;mid<<=,k<<=)
  47. {
  48. int Wn=ksm(G,(mdn-)/k); if(f) Wn=ksm(Wn,mdn-);
  49. for(int i=,w=;i<lim;i+=k,w=)
  50. for(int j=;j<mid;j++,w=(ll)w*Wn%mdn)
  51. {
  52. int x=a[i+j],y=(ll)w*a[i+j+mid]%mdn;
  53. a[i+j]=x+y>=mdn?x+y-mdn:x+y;
  54. a[i+j+mid]=x-y<?x-y+mdn:x-y;
  55. }
  56. }
  57. if(f) for(int i=;i<lim;i++) a[i]=(ll)a[i]*inv%mdn;
  58. }
  59. /**
  60. poly_inv
  61. 求 f*g=1(% x^n)
  62. 因此 g=1(% x^[n/2])
  63. 已知 f*h=1(% x^[n/2])
  64. 可得 g-h=0(% x^[n/2])
  65. 平方 g^2+h^2-2g*h=0(% x^n)
  66. 左乘f得到 g=2fh-fh^2(% x^n)
  67. 递归求解
  68. */
  69. struct poly_inv
  70. {
  71. int g[N],h[N];
  72. void inv(int *a,int n)
  73. {
  74. if(n==){g[]=ksm(a[],mdn-);return;}
  75. int mid=(n+)>>; inv(a,mid); int lim=pre(n<<);
  76. for(int i=;i<n;i++) h[i]=a[i];
  77. for(int i=n;i<lim;i++) h[i]=;
  78. NTT(h,lim,); NTT(g,lim,);
  79. for(int i=;i<lim;i++)
  80. g[i]=(2ll-(ll)g[i]*h[i]%mdn+mdn)%mdn*g[i]%mdn;
  81. NTT(g,lim,);
  82. for(int i=n;i<lim;i++) g[i]=;
  83. }
  84. void print(int n)
  85. {
  86. for(int i=;i<n;i++) printf("%d ",g[i]);
  87. }
  88. }INV;
  89. /**
  90. poly_ln
  91. 求g=ln(f)
  92. 对复合函数g(f)求导
  93. (ln(f))'=ln'(f)f'=(1/f)*f'
  94. 即 g'=1/f*f'
  95. 积分回去就行了
  96. */
  97. struct poly_ln
  98. {
  99. int g[N],h[N];
  100. void ln(int *a,int n)
  101. {
  102. INV.inv(a,n);
  103. for(int i=;i<n;i++) g[i]=INV.g[i];
  104. for(int i=;i<n;i++) h[i-]=(ll)f[i]*i%mdn;
  105. int lim=pre(n<<); NTT(g,lim,); NTT(h,lim,);
  106. for(int i=;i<lim;i++) h[i]=(ll)g[i]*h[i]%mdn;
  107. NTT(h,lim,);
  108. for(int i=;i<n;i++) g[i+]=(ll)h[i]*ksm(i+,mdn-)%mdn;
  109. g[]=;
  110. }
  111. void print(int n)
  112. {
  113. for(int i=;i<n;i++) printf("%d ",g[i]);
  114. }
  115. }LN;
  116. /**
  117. poly_exp
  118. 求 g=e^f
  119. 根据牛顿迭代+泰勒展开
  120. 可以得到
  121. h(f)=0(% x^n)
  122. 展开一次【开方 h(f0)=0(% x^n/2)
  123. h(f0)+h'(f0)(f-f0)=0(% x^n)
  124. 移项 f=f0-h(f0)/h'(f0)
  125. 由于我们求的g=e^f 取h为lng-f=0(% x^n)
  126. 所以带进去就是 g=g0-(lng0-f)/lng0=g0*(1-lng0+f)
  127. */
  128. struct poly_exp
  129. {
  130. int s[N],g[N],tmp[N];
  131. void exp(int *a,int n)
  132. {
  133. if(n==){s[]=;return;}
  134. int mid=n+>>; exp(a,mid);
  135. for(int i=;i<(n<<);i++) g[i]=;
  136. LN.ln(g,n);
  137. for(int i=;i<n;i++) g[i]=LN.g[i],tmp[i]=a[i];
  138. int lim=pre(n<<);
  139. NTT(g,lim,);NTT(tmp,lim,);NTT(s,lim,);
  140. for(int i=;i<lim;i++)
  141. s[i]=((ll)tmp[i]-g[i]++mdn)%mdn*s[i]%mdn;
  142. NTT(s,lim,);
  143. for(int i=n;i<lim;i++) g[i]=tmp[i]=;
  144. }
  145. void print(int n)
  146. {
  147. for(int i=;i<n;i++) printf("%d ",s[i]);
  148. }
  149. }EXP;
  150. /**
  151. poly_div
  152. 通过系数翻转
  153. f n次 g m次
  154. f=g*h+r
  155. fR=x^nf(1/x)
  156. 所以全部翻转再左乘x^n
  157. 可以得到
  158. x^nfR=x^mgR*x^(n-m)hR+x^(n-m+1)*x^(m-1)rR
  159. 其实就是
  160. fR=gR*hR+x^(n-m+1)rR
  161. 于是我们可以在%x^(n-m+1)意义下先求逆得到hR
  162. 然后翻回去求r
  163. */
  164. int main()
  165. {
  166. int n; n=read();
  167. for(int i=;i<n;i++) f[i]=read();
  168. EXP.exp(f,n); EXP.print(n);
  169. return ;
  170. }

(写了前三个 exp懒得调了发现还要清前面的ln啥的就扔在那看看吧QAQ)(多项式除法没写QAQ)

✔左偏树

  1. //Love and Freedom.
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define ll long long
  7. #define inf 20021225
  8. #define N 100010
  9. using namespace std;
  10. int read()
  11. {
  12. int f=,s=; char ch=getchar();
  13. while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
  14. while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
  15. return f*s;
  16. }
  17. struct node{int val,fa,son[],dis; bool tag;}t[N];
  18. int find(int x){return t[x].fa^x?t[x].fa=find(t[x].fa):x;}
  19. int merge(int x,int y)
  20. {
  21. if(!x||!y) return x|y;
  22. if(t[y].val<t[x].val||(t[y].val==t[x].val&&y<x)) swap(x,y);
  23. t[x].son[]=merge(t[x].son[],y);
  24. t[t[x].son[]].fa=t[t[x].son[]].fa=x; t[x].fa=x;
  25. if(t[t[x].son[]].dis>t[t[x].son[]].dis) swap(t[x].son[],t[x].son[]);
  26. t[x].dis=t[t[x].son[]].dis+;
  27. return x;
  28. }
  29. void pop(int x)
  30. {
  31. t[x].tag=; printf("%d\n",t[x].val);
  32. t[t[x].son[]].fa=t[x].son[]; t[t[x].son[]].fa=t[x].son[];
  33. t[x].fa=merge(t[x].son[],t[x].son[]);
  34. }
  35. int n,m;
  36. int main()
  37. {
  38. n=read(); m=read(); int opt,x,y;
  39. for(int i=;i<=n;i++) t[i].val=read(),t[i].fa=i;
  40. for(int i=;i<=m;i++)
  41. {
  42. opt=read(); x=read();
  43. if(opt==)
  44. {
  45. y=read(); if(t[x].tag||t[y].tag) continue;
  46. x=find(x); y=find(y); if(x==y) continue;
  47. merge(x,y);
  48. }
  49. else
  50. {
  51. if(t[x].tag){printf("-1\n"); continue;}
  52. x=find(x); pop(x);
  53. }
  54. }
  55. return ;
  56. }

✔KD树

✔圆方树

✔FWT

  1. /**
  2. OR
  3. FWT(A)=(FWT(A0),FWT(A0+A1))
  4. IFWT(A)=(IFWT(A0),IFWT(A1-A0))
  5. */
  6.  
  7. /**
  8. AND
  9. FWT(A)=(FWT(A0+A1),FWT(A1))
  10. IFWT(A)=(IFWT(A0-A1),IFWT(A1))
  11. */
  12.  
  13. /**
  14. XOR
  15. FWT(A)=(FWT(A0+A1),FWT(A0-A1))
  16. IFWT(A)=(IFWT(A0+A1)/2,IFWT(A0-A1)/2)
  17. */
  18.  
  19. //Love and Freedom.
  20. #include<cstdio>
  21. #include<cmath>
  22. #include<algorithm>
  23. #include<cstring>
  24. #define ll long long
  25. #define inf 20021225
  26. #define N 2000100
  27. #define mdn 998244353
  28. using namespace std;
  29. int read()
  30. {
  31. int s=,f=; char ch=getchar();
  32. while(ch>''||ch<''){if(ch=='-') f=-;ch=getchar();}
  33. while(ch<=''&&ch>='') s=s*+ch-'',ch=getchar();
  34. return (s*f%mdn+mdn)%mdn;
  35. }
  36. int a[N],b[N],c[N]; int inv=;
  37. void fwt(int *a,int top,int type)
  38. {
  39. for(int k=,mid=;k<=top;k<<=,mid<<=)
  40. for(int i=;i<top;i+=k) for(int j=;j<mid;j++)
  41. {
  42. int x=a[i+j],y=a[i+j+mid];
  43. if(type==) a[i+j]=x,a[i+j+mid]=(x+y)%mdn;
  44. else if(type==) a[i+j]=(x+y)%mdn,a[i+j+mid]=y;
  45. else if(type==) a[i+j]=(x+y)%mdn,a[i+j+mid]=(x-y+mdn)%mdn;
  46. else if(type==-) a[i+j]=x,a[i+j+mid]=(y-x+mdn)%mdn;
  47. else if(type==-) a[i+j]=(x-y+mdn)%mdn,a[i+j+mid]=y;
  48. else if(type==-) a[i+j]=(ll)(x+y)%mdn*inv%mdn,a[i+mid+j]=((ll)(x-y)%mdn*inv%mdn+mdn)%mdn;
  49. }
  50. }
  51. int top;
  52. void query(int type)
  53. {
  54. fwt(a,top,type); fwt(b,top,type);
  55. for(int i=;i<top;i++) c[i]=(ll)a[i]*b[i]%mdn;
  56. fwt(c,top,-type); fwt(a,top,-type); fwt(b,top,-type);
  57. for(int i=;i<top;i++) printf("%d ",c[i]);
  58. printf("\n");
  59. }
  60. int main()
  61. {
  62. int n;
  63. scanf("%d",&n); top=<<n;
  64. for(int i=;i<top;i++) scanf("%d",&a[i]);
  65. for(int i=;i<top;i++) scanf("%d",&b[i]);
  66. query(); query(); query();
  67. return ;
  68. }

✔0/1分数规划

✔后缀自动机

  1. //Love and Freedom.
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define ll long long
  7. #define inf 20021225
  8. #define N 1000100
  9. using namespace std;
  10.  
  11. struct node{int ch[],fa,len,sz;}t[N*];
  12. struct edge{int to,lt;}e[N*];
  13. char ch[N]; int in[N*],cnt,lt,rt,poi,ans,n;
  14. void add(int x,int y){e[++cnt].to=y;e[cnt].lt=in[x];in[x]=cnt;}
  15. int id(char c){return c-'a';}
  16. void insert(int c)
  17. {
  18. int p=lt,np=lt=++poi; t[np].len=t[p].len+; t[np].sz=;
  19. for(;p&&!t[p].ch[c];p=t[p].fa) t[p].ch[c]=np;
  20. if(!p){t[np].fa=rt; return;}
  21. int q=t[p].ch[c];
  22. if(t[q].len==t[p].len+){t[np].fa=q; return;}
  23. int nq=++poi; t[nq].fa=t[q].fa; t[q].fa=t[np].fa=nq;
  24. memcpy(t[nq].ch,t[q].ch,sizeof(t[nq].ch)); t[nq].len=t[p].len+;
  25. for(;p&&t[p].ch[c]==q;p=t[p].fa) t[p].ch[c]=nq;
  26. }
  27. void build()
  28. {
  29. for(int i=;i<=poi;i++) add(t[i].fa,i);
  30. }
  31. void dfs(int x)
  32. {
  33. for(int i=in[x];i;i=e[i].lt)
  34. dfs(e[i].to),t[x].sz+=t[e[i].to].sz;
  35. if(t[x].sz!=) ans=max(ans,t[x].len*t[x].sz);
  36. }
  37. int main()
  38. {
  39. scanf("%s",ch+); n=strlen(ch+); rt=lt=poi=;
  40. for(int i=;i<=n;i++) insert(id(ch[i]));
  41. build(); dfs(); printf("%d\n",ans);
  42. return ;
  43. }

✔线性规划

  1. //Love and Freedom.
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<ctime>
  7. #define db long double
  8. #define ll long long
  9. #define inf 20021225
  10. #define eps 1e-10
  11. using namespace std;
  12.  
  13. db a[][],ans[]; int id[],n,m;
  14. void pivot(int x,int y)
  15. {
  16. swap(id[n+x],id[y]);
  17. db w=1.0/a[x][y]; a[x][y]=1.0;
  18. for(int i=;i<=n;i++) a[x][i]*=w;
  19. for(int i=;i<=m;i++)
  20. {
  21. if(i==x || abs(a[i][y])<eps) continue;
  22. w=a[i][y]; a[i][y]=0.0;
  23. for(int j=;j<=n;j++)
  24. a[i][j]-=a[x][j]*w;
  25. }
  26. }
  27.  
  28. bool prework()
  29. {
  30. while()
  31. {
  32. int x=,y=;
  33. for(int i=;i<=m;i++) if(a[i][]<-eps && (!x||rand()&)) x=i;
  34. if(!x) return true;
  35. for(int i=;i<=n;i++) if(a[x][i]<-eps && (!y||rand()&)) y=i;
  36. if(!y){printf("Infeasible\n");return false;}
  37. pivot(x,y);
  38. }
  39. }
  40.  
  41. bool simplex()
  42. {
  43. while()
  44. {
  45. int x=,y=; db mn=1e15;
  46. for(int i=;i<=n;i++) if(a[][i]>eps){y=i;break;}
  47. if(!y) return true;
  48. for(int i=;i<=m;i++)
  49. if(a[i][y]>eps && a[i][]/a[i][y]<mn)
  50. x=i,mn=a[i][]/a[i][y];
  51. if(!x){printf("Unbounded\n");return false;}
  52. pivot(x,y);
  53. }
  54. }
  55.  
  56. int main()
  57. {
  58. srand(time()); int t;
  59. scanf("%d%d%d",&n,&m,&t);
  60. for(int i=;i<=n;i++) scanf("%Lf",&a[][i]),id[i]=i;
  61. for(int i=;i<=m;i++)
  62. {
  63. for(int j=;j<=n;j++) scanf("%Lf",&a[i][j]);
  64. scanf("%Lf",&a[i][]);
  65. }
  66. if(prework()&&simplex())
  67. {
  68. printf("%.8Lf\n",-a[][]);
  69. if(t)
  70. {
  71. for(int i=;i<=m;i++) ans[id[n+i]]=a[i][];
  72. for(int i=;i<=n;i++) printf("%.8Lf ",ans[i]);
  73. }
  74. }
  75. return ;
  76. }

回文自动机

✔半平面交

✔旋转卡壳

✔欧拉回路

✔整体二分

✔可持久并查集

✔kruskal重构树

✔点分治/动态点分治

✔凸优化/斜率优化

上下界网络流

✔差分约束

✔LCT

  1. //Love and Freedom.
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define ll long long
  7. #define inf 20021225
  8. #define N 300100
  9. #define ls(x) t[x].son[0]
  10. #define rs(x) t[x].son[1]
  11. #define fa(x) t[x].fa
  12. #define isroot(x) (rs(fa(x))!=x && ls(fa(x))!=x)
  13. using namespace std;
  14.  
  15. struct node{int fa,son[],val,sum; bool rev;}t[N];
  16. void pushup(int x){t[x].sum=t[ls(x)].sum^t[rs(x)].sum^t[x].val;}
  17. void pushdown(int x)
  18. {
  19. if(t[x].rev)
  20. {
  21. if(ls(x)) t[ls(x)].rev^=;
  22. if(rs(x)) t[rs(x)].rev^=;
  23. swap(ls(x),rs(x)); t[x].rev=;
  24. }
  25. }
  26. void rotate(int x)
  27. {
  28. if(!x || isroot(x)) return;
  29. int f=fa(x),gf=fa(f);
  30. int k=rs(f)==x,p=k^;
  31. if(!isroot(f)) t[gf].son[rs(gf)==f]=x;
  32. t[x].fa=gf; t[f].fa=x;
  33. if(t[x].son[p]) t[t[x].son[p]].fa=f;
  34. t[f].son[k]=t[x].son[p]; t[x].son[p]=f;
  35. pushup(f); pushup(x);
  36. }
  37. void push(int x){if(!isroot(x)) push(fa(x));pushdown(x);}
  38. void splay(int x)
  39. {
  40. push(x);
  41. while(!isroot(x))
  42. {
  43. int f=fa(x),gf=fa(f);
  44. if(!isroot(f)) (rs(gf)==f)^(rs(f)==x)?rotate(x):rotate(f);
  45. rotate(x);
  46. }
  47. }
  48. void access(int x)
  49. {
  50. int y=;
  51. do
  52. {
  53. splay(x);
  54. t[x].son[]=y;
  55. pushup(x);
  56. y=x; x=t[x].fa;
  57. }while(x);
  58. }
  59. void makeroot(int x)
  60. {
  61. access(x); splay(x); t[x].rev=;
  62. }
  63. int findroot(int x)
  64. {
  65. access(x); splay(x);
  66. while(ls(x)) x=ls(x);
  67. return x;
  68. }
  69. void link(int x,int y)
  70. {
  71. makeroot(x);
  72. if(findroot(y)==x) return;
  73. t[x].fa=y;
  74. }
  75. void cut(int x,int y)
  76. {
  77. makeroot(x);
  78. if(findroot(y)==x && t[x].fa==y && !t[x].son[])
  79. {
  80. t[x].fa=t[y].son[]=; pushup(y);
  81. }
  82. }
  83. void modify(int x,int val)
  84. {
  85. splay(x);
  86. t[x].val=val;
  87. pushup(x);
  88. }
  89. int query(int x,int y)
  90. {
  91. makeroot(x);access(y);splay(y);return t[y].sum;
  92. }
  93. int main()
  94. {
  95. int n,m,i,x,y,opt;
  96. scanf("%d%d",&n,&m);
  97. for(i=;i<=n;i++) scanf("%d",&t[i].val);
  98. for(i=;i<=m;i++)
  99. {
  100. scanf("%d%d%d",&opt,&x,&y);
  101. if(opt==) printf("%d\n",query(x,y));
  102. if(opt==) link(x,y);
  103. if(opt==) cut(x,y);
  104. if(opt==) modify(x,y);
  105. }
  106. return ;
  107. }

莫比乌斯反演

积性函数相关

✔Polya

线段树合并

✔插头dp

✔虚树

✔CRT/EXCRT

  1. //Love and Freedom.
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #define ll long long
  7. #define ldb long double
  8. #define inf 20021225
  9. #define N 100010
  10. using namespace std;
  11.  
  12. ll ksc(ll a,ll b,ll md)
  13. {
  14. ll c=(a*b-(ll)((ldb)a/md*b+0.5)*md);
  15. return c<?c+md:c;
  16. }
  17.  
  18. ll exgcd(ll a,ll b,ll &x,ll &y)
  19. {
  20. if(!b){x=;y=;return a;}
  21. ll g=exgcd(b,a%b,x,y);// printf("QAQ");
  22. ll k=x; x=y; y=k-a/b*y; return g;
  23. }
  24. ll p[N],w[N]; int n;
  25. ll excrt()
  26. {
  27. ll x=w[],P=p[],t,s;
  28. for(int i=;i<=n;i++)
  29. {
  30. ll k=((w[i]-x)%p[i]+p[i])%p[i];
  31. ll g=exgcd(P,p[i],t,s); ll bs=p[i]/g;
  32. if(k%g!=) return -;
  33. t=ksc(t,k/g,bs); x+=t*P; P*=bs;
  34. x=(x%P+P)%P;
  35. }
  36. return x;
  37. }
  38. int main()
  39. {
  40. scanf("%d",&n);
  41. for(int i=;i<=n;i++) scanf("%lld%lld",&p[i],&w[i]);
  42. printf("%lld\n",excrt());
  43. return ;
  44. }

SDOI前的小计划的更多相关文章

  1. WC前的小计划

    写在前面的.. 要去WC了好开心的呢.. 但是之前荒废了好多时间呢.. 好吧从明天开始加紧训练,目标是:WC前bzoj300t..(现在是260呢..) 开始吧 来看看完成情况: 40/40 [201 ...

  2. 冬令营前的一些计划&记录

    冬令营前的一些计划&记录 计划 yyb发现自己很多以前学过的东西完完全全不记得了,所以在接下来的时间里可能会留下多篇复习向的博客,当然也可能因为觉得没有必要复习而到处乱做题. 现在先大概归类一 ...

  3. 利用快排partition求前N小的元素

    求前k小的数,一般人的想法就是先排序,然后再遍历,但是题目只是求前N小,没有必要完全排序,所以可以想到部分排序,而能够部分排序的排序算法我能想到的就是堆排序和快排了. 第一种思路,局部堆排序. 首先, ...

  4. bzoj 前100题计划

    bzoj前100题计划 xz布置的巨大的坑.. 有空填题解... 1002 轮状病毒 用python手动matrixtree打表. #include<bits/stdc++.h> #def ...

  5. NOIP前的一些计划

    一些想法 距离NOIP2018只剩下一个星期的时间了,通过这几天在长郡的考试,渐渐感觉还有好多东西自己还不够熟练,也有些东西到现在还不会,现将NOIP前的一些计划列在这里,希望能在考前把他们全部完成吧 ...

  6. 1245 最小的N个和(前k小ai+bi)

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...

  7. 线段树维护区间前k小

    线段树维护区间前k小 $ solution: $ 觉得超级钢琴太麻烦?在这里线段树提供一条龙服务 . 咳咳,开始讲正题!这道题我们有一个和超级钢琴复杂度一样 $ ~O(~\sum x\times lo ...

  8. word段落前的小点·

    原因是因为修改论文时,要求在论文的标题前加上 '·' 类似: 在网上搜索了半天,都是加符号,特此记录 解决: 1.文件---选项---显示--勾选段落标记 2.修改样式 至此,设置完毕,章节前的小点已 ...

  9. 网站网址前的小logo

    认识网页前小图标 1.能在浏览器标签.地址栏左边和收藏夹栏显示小图标的网站,其网站都是使用了其名称为"favicon.ico"图标文件,格式为ico格式,图标大小一般为16*16, ...

随机推荐

  1. selenium中get_cookies()和add_cookie()的用法

    在用selenium爬取网页的时候,有时候需要登陆,这时候用selenium获取cookie和携带cookie是很方便的,获取cookie可以通过内置的函数get_cookies(),它得到的是一组c ...

  2. codeforces 380A Sereja and Prefixes (递归)

    题目: A. Sereja and Prefixes time limit per test 1 second memory limit per test 256 megabytes input st ...

  3. Linux 用户和组信息

    linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号.在使用linux操作系统时候,通常我们会遇到对多用户进行管理.比如: 用户账号的添加. ...

  4. 第 2 章 前端基础之CSS

    一.CSS语法 CSS规则由两个主要的部分构成:选择器,以及一条或多条声明. ''' selector { property: value; property: value; ... property ...

  5. tp 框架目录结构

    ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的.最早诞生于2006年初,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布.ThinkPHP从诞生以来一 ...

  6. poj2376Cleaning Shifts (贪心求解)

    描述 大表哥分配 N (1 <= N <= 25,000) 只中的一些奶牛在牛棚附近做些清洁. 他总是要让至少一只牛做清洁.他把一天分成T段(1 <= T <= 1,000,0 ...

  7. hdu6699Block Breaker

    Problem Description Given a rectangle frame of size n×m. Initially, the frame is strewn with n×m squ ...

  8. JavaScript List

    function List() {    this.listSize = 0;    this.pos = 0;    this.dataSource = [];    this.clear = fu ...

  9. ToString()的简单介绍

    1.在某一个类中重写该类的toString()方法,是为了方便打印该类实例中的内容.

  10. BZOJ 1109 (LIS)

    题面 传送门 分析 设dp[i]是第i个积木在自己的位置上时,前i个积木中最多能回到自己位置的数目. \(dp[i]=max(dp[j])+1 (i>j,a[i]>a[j],a[i]-a[ ...