由于各种原因,在bzoj上我day1的题一题都没过,所以这里就直接贴loj的链接好了。

D1T1 龙与地下城

中心极限定理。

https://en.wikipedia.org/wiki/Central_limit_theorem

由于某些原因这里的公式挂了...直接看维基吧...

要算积分可以用标准库里的erf:https://en.wikipedia.org/wiki/Error_function

对于正态分布,值落在[-x,x]的概率为,所以落在[0,x]的概率就是这个值的一半,这玩意儿就可以直接当做不定积分了。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #include <stdlib.h>
  7. #include <string>
  8. #include <bitset>
  9. #include <vector>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <algorithm>
  14. #include <sstream>
  15. #include <stack>
  16. #include <iomanip>
  17. using namespace std;
  18. #define pb push_back
  19. #define mp make_pair
  20. typedef pair<int,int> pii;
  21. typedef long long ll;
  22. typedef double ld;
  23. typedef vector<int> vi;
  24. #define fi first
  25. #define se second
  26. #define fe first
  27. #define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
  28. #define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);}
  29. #define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);}
  30. #define es(x,e) (int e=fst[x];e;e=nxt[e])
  31. #define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e])
  32. #define VIZ {printf("digraph G{\n"); for(int i=1;i<=n;i++) for es(i,e) printf("%d->%d;\n",i,vb[e]); puts("}");}
  33. #define VIZ2 {printf("graph G{\n"); for(int i=1;i<=n;i++) for es(i,e) if(vb[e]>=i)printf("%d--%d;\n",i,vb[e]); puts("}");}
  34. #define SZ 666666
  35. int x,y,a,b,T;
  36. ld f[];
  37. void sol()
  38. {
  39. scanf("%d%d",&x,&y);
  40. if((ll)x*y*y<=)
  41. {
  42. for(int i=;i<=x*y;++i) f[i]=;
  43. for(int i=;i<=y;++i)
  44. {
  45. for(int j=x*y;j>=x;--j)
  46. f[j]-=f[j-x];
  47. for(int j=;j<=x*y;++j)
  48. {
  49. f[j]/=x;
  50. if(j) f[j]+=f[j-];
  51. }
  52. }
  53. for(int i=;i<=;++i)
  54. {
  55. int l,r;
  56. scanf("%d%d",&l,&r);
  57. ld ans=f[r];
  58. if(l) ans-=f[l-];
  59. printf("%.10lf\n",ans);
  60. }
  61. }
  62. else
  63. {
  64. int n=y; ld m=(x-)/2.0,s=(x*(ld)x-)/;
  65. ld k=-n*m,b=sqrt(n*s*);
  66. for(int i=;i<=;++i)
  67. {
  68. ld l,r;
  69. scanf("%lf%lf",&l,&r);
  70. l-=0.5,r+=0.5;
  71. l=(l+k)/b; r=(r+k)/b;
  72. printf("%.10lf\n",(erf(r)-erf(l))/);
  73. }
  74. }
  75. }
  76. int main()
  77. {
  78. scanf("%d",&T);
  79. while(T--) sol();
  80. }

D1T2 苹果树

首先如果是树上有父亲限制的01背包,可以参见http://www.cnblogs.com/zzqsblog/p/5537440.html

现在不是01背包了,为了方便起见,一个ai>1的点我们拆成一个ai=1和一个ai比原来少1的点,把这个新点挂在ai=1的点下面进行dp。

多重背包显然可以单调队列优化。

现在剩的就是那个莫名其妙的k。我们枚举一条到叶子的链(注意这里我们忽略ai>1的点),那么我们的要求就是在除了这条链以外最多只能有k个点。

我们进行一次这个背包,可以得到一个dfs序,即我们可以得到一个dfs序后缀的背包信息,那我们把每个点的儿子反过来再得到一个dfs序,把两个dfs序这两个后缀并在一起,恰好就是整棵树去掉这条链,泛化背包类似搞搞就行。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #include <stdlib.h>
  7. #include <string>
  8. #include <bitset>
  9. #include <vector>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <algorithm>
  14. #include <sstream>
  15. #include <stack>
  16. #include <iomanip>
  17. using namespace std;
  18. #define pb push_back
  19. #define mp make_pair
  20. typedef pair<int,int> pii;
  21. typedef long long ll;
  22. typedef double ld;
  23. typedef vector<int> vi;
  24. #define fi first
  25. #define se second
  26. #define fe first
  27. #define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
  28. #define Tree vector<int> ch[SZ];\
  29. void setf(int x,int f) {ch[f].pb(x);}
  30. #define esb(x,e,b) \
  31. (unsigned __=,b=(__<ch[x].size())?(ch[x][__]):;\
  32. __<ch[x].size();++__,b=(__<ch[x].size())?(ch[x][__]):)
  33. #define VIZ {printf("digraph G{\n"); for(int i=1;i<=n;i++) for es(i,e) printf("%d->%d;\n",i,vb[e]); puts("}");}
  34. #define VIZ2 {printf("graph G{\n"); for(int i=1;i<=n;i++) for es(i,e) if(vb[e]>=i)printf("%d--%d;\n",i,vb[e]); puts("}");}
  35. #define SZ 1234567
  36. namespace FF
  37. {
  38. char ch,B[<<],*S=B,*T=B;
  39. #define getc() (S==T&&(T=(S=B)+fread(B,1,1<<20,stdin),S==T)?0:*S++)
  40. #define isd(c) (c>='0'&&c<='9')
  41. int aa,bb;int F(){
  42. while(ch=getc(),!isd(ch)&&ch!='-');ch=='-'?aa=bb=:(aa=ch-'',bb=);
  43. while(ch=getc(),isd(ch))aa=aa*+ch-'';return bb?aa:-aa;
  44. }
  45. }
  46. #define gi FF::F()
  47. int T,n,k;
  48. #define max(a,b) (((a)>(b))?(a):(b))
  49. #define cmax(a,b) (((a)<(b))?((a)=(b)):0)
  50. Tree
  51. int m1[],m2[];
  52. #define R(x,a) (x+(a)*(k+1))
  53. inline void pack(int*r,int v,int x) //x个重1价值v
  54. {
  55. if(!x);
  56. else if(x==)
  57. for(int i=k;i>=;--i)
  58. cmax(r[i],r[i-]+v);
  59. else if(x>=k)
  60. for(int i=;i<=k;++i)
  61. cmax(r[i],r[i-]+v);
  62. else
  63. {
  64. static pii qs[SZ];
  65. int h=,t=;
  66. for(int j=;j<=k;j++)
  67. {
  68. int cv=r[j]-j*v;
  69. while(h!=t&&qs[t-].fi<cv) --t;
  70. qs[t++]=pii(cv,j);
  71. while(qs[h].se<j-x) ++h;
  72. r[j]=qs[h].fi+j*v;
  73. }
  74. }
  75. }
  76. int fa[SZ],a[SZ],v[SZ],dep[SZ],fc[SZ];
  77. int d1[SZ],c1=,l1[SZ],d2[SZ],c2=,l2[SZ],r1[SZ],r2[SZ];
  78. inline void dfs(int x,int*d,int&c,int*l,int*r)
  79. {
  80. d[x]=++c; r[c]=x;
  81. for esb(x,e,b)
  82. dep[b]=dep[x]+,fc[b]=fc[x]+v[b],
  83. dfs(b,d,c,l,r);
  84. l[x]=c;
  85. }
  86. inline void work(int*d,int&c,int*l,int*p,int*r)
  87. {
  88. for(int i=c;i>=;--i)
  89. {
  90. int x=r[i],*A=R(p,d[x]),*B=R(p,l[x]+),*C=R(p,d[x]+);
  91. for(int s=;s<=k;s++)
  92. A[s]=max(B[s],C[s-]+v[x]);
  93. pack(A,v[x],a[x]-);
  94. }
  95. }
  96. bool good[SZ];
  97. void sol()
  98. {
  99. n=gi,k=gi; int N=n; c1=c2=;
  100. for(int i=;i<=n+n;++i)
  101. good[i]=,ch[i].clear();
  102. ll tot=;
  103. for(int i=;i<=N;++i)
  104. {
  105. fa[i]=gi,a[i]=gi,v[i]=gi; tot+=a[i];
  106. if(fa[i]) setf(i,fa[i]),good[fa[i]]=;
  107. if(a[i]>)
  108. {
  109. ++n; setf(n,i); a[n]=a[i]-; good[n]=;
  110. v[n]=v[i]; fa[n]=i; a[i]=;
  111. }
  112. }
  113. int tt=(n+)*(k+);
  114. memset(m1,,tt*sizeof(int));
  115. memset(m2,,tt*sizeof(int));
  116. dep[]=; fc[]=v[];
  117. dfs(,d1,c1,l1,r1);
  118. work(d1,c1,l1,m1,r1);
  119. for(int i=;i<=n;++i)
  120. reverse(ch[i].begin(),ch[i].end());
  121. dfs(,d2,c2,l2,r2);
  122. work(d2,c2,l2,m2,r2);
  123. int ans=;
  124. for(int i=;i<=n;++i)
  125. {
  126. if(!good[i]) continue;
  127. int x=min(tot-dep[i],(ll)k);
  128. int*f=R(m1,d1[i]+),*g=R(m2,l2[i]+);
  129. for(int s=;s<=x;++s)
  130. cmax(ans,fc[i]+f[s]+g[x-s]);
  131. }
  132. printf("%d\n",ans);
  133. }
  134. int main()
  135. {
  136. T=gi; while(T--) sol();
  137. }

D1T3 切树游戏

这里讲一下本人常数很大的做法。首先众所周知如果有一个序列A和一个序列B,A和B做异或卷积等于C,那么fwt(A)*fwt(B)(点乘)=fwt(C)。

我们记v[i]为单点值fwt之后的数组,那么有如下的dp方程:

$s[i]=v[i]\prod_cs[c]+1$(c是i的孩子,+1是加上空子树的情况)

最后我们要求的是$\sum_{i=1}^ns[i]$。求出这玩意儿之后ifwt回去,把n个空子树扣掉就有答案了。

考虑记$g[i]=v[i]\prod_{c'}s[c']$,c'是i的轻孩子。

这玩意儿可以支持修改,只要修改的时候跳重链就好。

现在的问题就是要求出重链顶端的s值以及把一整条重链的s值求和。

我们只考虑重链的话,可以发现$s[i]=s[w]g[i]+1$,w是i的重孩子,如果我们把g预处理成矩阵(每个元素都是向量),然后这玩意儿是可以矩乘的,同时也可以顺便把s求和。然后线段树维护一下就好了。注意到矩阵有一些位置是不变的可以减小常数。

这玩意儿还是常数爆炸了,那我也没有办法,复杂度都是一样的...

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #include <stdlib.h>
  7. #include <string>
  8. #include <bitset>
  9. #include <vector>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <algorithm>
  14. #include <sstream>
  15. #include <stack>
  16. #include <iomanip>
  17. using namespace std;
  18. #define pb push_back
  19. #define mp make_pair
  20. typedef pair<int,int> pii;
  21. typedef long long ll;
  22. typedef double ld;
  23. typedef vector<int> vi;
  24. #define fi first
  25. #define se second
  26. #define fe first
  27. #define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
  28. #define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);}
  29. #define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);}
  30. #define es(x,e) (int e=fst[x];e;e=nxt[e])
  31. #define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e])
  32. #define VIZ {printf("digraph G{\n"); for(int i=1;i<=n;i++) for es(i,e) printf("%d->%d;\n",i,vb[e]); puts("}");}
  33. #define VIZ2 {printf("graph G{\n"); for(int i=1;i<=n;i++) for es(i,e) if(vb[e]>=i)printf("%d--%d;\n",i,vb[e]); puts("}");}
  34. #define SZ 66666
  35. #pragma pack(1)
  36. int n,m,q; Edg
  37. #define SZ 33333
  38. const int MOD=;
  39. int inv[MOD+];
  40. struct num
  41. {
  42. short x; short z;
  43. num() {x=z=;}
  44. num(int p) {(p%=MOD)?(x=p,z=):(x=z=);}
  45. inline operator int() const {return z?:x;}
  46. };
  47. inline num operator * (num a,num b)
  48. {a.x=int(a.x)*b.x%MOD; a.z+=b.z; return a;}
  49. inline num operator / (num a,num b)
  50. {a.x=int(a.x)*inv[b.x]%MOD; a.z-=b.z; return a;}
  51. template<class T>
  52. struct arr
  53. {
  54. T g[];
  55. arr() {for(int i=;i<m;++i) g[i]=;}
  56. void fwt()
  57. {
  58. for(int i=;i<m;i<<=)
  59. {
  60. for(int j=;j<m;++j)
  61. {
  62. if(j&i) continue;
  63. int a=g[j],b=g[j|i];
  64. g[j]=(a+b)%MOD;
  65. g[j|i]=(a+MOD-b)%MOD;
  66. }
  67. }
  68. }
  69. void ifwt() //only for <short>
  70. {
  71. fwt();
  72. for(int i=;i<m;++i)
  73. g[i]=g[i]*(int)inv[m]%MOD;
  74. }
  75. template<class T1>
  76. operator arr<T1> ()
  77. {
  78. arr<T1> r;
  79. for(int i=;i<m;++i) r.g[i]=g[i];
  80. return r;
  81. }
  82. };
  83. arr<num> one_n,zero_n;
  84. arr<short> one_i,zero_i;
  85. template<class T>
  86. arr<T> operator + (arr<T> a,arr<T> b)
  87. {
  88. for(int i=;i<m;++i)
  89. a.g[i]=(int(a.g[i])+b.g[i])%MOD;
  90. return a;
  91. }
  92. template<class T>
  93. arr<T> operator - (arr<T> a,arr<T> b)
  94. {
  95. for(int i=;i<m;++i)
  96. a.g[i]=(int(a.g[i])+MOD-b.g[i])%MOD;
  97. return a;
  98. }
  99. arr<num> operator * (arr<num> a,arr<num> b)
  100. {
  101. for(int i=;i<m;++i)
  102. a.g[i]=a.g[i]*b.g[i];
  103. return a;
  104. }
  105. arr<short> operator * (arr<short> a,arr<short> b)
  106. {
  107. for(int i=;i<m;++i)
  108. a.g[i]=a.g[i]*(int)b.g[i]%MOD;
  109. return a;
  110. }
  111. arr<num> operator / (arr<num> a,arr<num> b)
  112. {
  113. for(int i=;i<m;++i)
  114. a.g[i]=a.g[i]/b.g[i];
  115. return a;
  116. }
  117. struct mat
  118. {
  119. arr<short> g00,g01,g20,g21;
  120. /*
  121. x y 0
  122. 0 1 0
  123. z s 1
  124. */
  125. };
  126. mat operator * (mat a,mat b)
  127. {
  128. mat p;
  129. p.g00=a.g00*b.g00;
  130. p.g01=a.g00*b.g01+a.g01;
  131. p.g20=a.g20*b.g00+b.g20;
  132. p.g21=a.g20*b.g01+a.g21+b.g21;
  133. return p;
  134. }
  135. //pair(w,s)
  136. pair<arr<short>,arr<short> > cp(mat s)
  137. {
  138. return make_pair(s.g00+s.g01,s.g20+s.g21);
  139. }
  140. inline mat gs(arr<short> x)
  141. {
  142. mat s;
  143. s.g01=s.g21=one_i;
  144. s.g00=s.g20=x; return s;
  145. }
  146. arr<short> sw,isw; //sum of w[i]
  147. arr<num> v[SZ],g[SZ],w[SZ]; mat gm[SZ]; //重链顶端的w保证正确
  148. int fa[SZ],son[SZ],sz[SZ],top[SZ],fi[SZ],bt[SZ],C=;
  149. arr<num> ts[];
  150. void dfs(int x,int f=)
  151. {
  152. fa[x]=f; sz[x]=;
  153. for esb(x,e,b) if(b!=f)
  154. {
  155. dfs(b,x),sz[x]+=sz[b];
  156. if(sz[b]>sz[son[x]]) son[x]=b;
  157. }
  158. }
  159. void dfs2(int x,int t,int f=)
  160. {
  161. top[x]=t; fi[x]=++C; bt[t]=C;
  162. if(!son[x]) return;
  163. dfs2(son[x],t,x);
  164. for esb(x,e,b) if(b!=f&&b!=son[x])
  165. dfs2(b,b,x);
  166. }
  167. const int Z=;
  168. mat seg[Z+Z+],I;
  169. void dfs3(int x,int f=,int d=)
  170. {
  171. for esb(x,e,b) if(b!=f) dfs3(b,x,d+);
  172. g[x]=v[x];
  173. for esb(x,e,b) if(b!=f) g[x]=g[x]*w[b];
  174. w[x]=g[x]+one_n; if(son[x]) g[x]=g[x]/w[son[x]];
  175. seg[Z+fi[x]]=gm[x]=gs(g[x]); sw=sw+arr<short>(w[x]);
  176. }
  177. void upd(int x)
  178. {
  179. for((x+=Z)>>=;x;x>>=) seg[x]=seg[x+x]*seg[x+x+];
  180. }
  181. mat qry(int l,int r)
  182. {
  183. mat rs=I; static int st[SZ]; int sn=;
  184. for(l+=Z-,r+=Z+;l^r^;l>>=,r>>=)
  185. {
  186. if(~l&) rs=rs*seg[l^];
  187. if(r&) st[++sn]=r^;
  188. }
  189. while(sn) rs=rs*seg[st[sn--]];
  190. return rs;
  191. }
  192. int main()
  193. {
  194. inv[]=;
  195. for(int i=;i<MOD;++i)
  196. inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
  197. scanf("%d%d",&n,&m);
  198. static int a[SZ];
  199. for(int i=;i<=n;++i) scanf("%d",a+i);
  200. for(int i=;i<n;++i)
  201. {
  202. int a,b;
  203. scanf("%d%d",&a,&b);
  204. adde(a,b);
  205. }
  206. for(int i=;i<m;++i) one_n.g[i]=,zero_n.g[i]=;
  207. for(int i=;i<m;++i) one_i.g[i]=,zero_i.g[i]=;
  208. I.g00=one_i; I.g01=I.g20=I.g21=zero_i;
  209. sw=zero_i; dfs(); dfs2(,);
  210. for(int i=;i<m;++i)
  211. ts[i]=zero_n, ts[i].g[i]=, ts[i].fwt();
  212. for(int i=;i<=n;++i) v[i]=ts[a[i]];
  213. dfs3(); isw=sw; isw.ifwt();
  214. for(int i=Z-;i>=;--i)
  215. seg[i]=seg[i+i]*seg[i+i+];
  216. int q; scanf("%d",&q);
  217. while(q--)
  218. {
  219. char s[]; scanf("%s",s);
  220. if(s[]=='Q')
  221. {
  222. int a; scanf("%d",&a);
  223. ll ans=isw.g[a];
  224. if(!a) ans-=n;
  225. ans=(ans%MOD+MOD)%MOD;
  226. printf("%d\n",int(ans));
  227. }
  228. else
  229. {
  230. int x,y;
  231. scanf("%d%d",&x,&y);
  232. mat r=qry(fi[top[x]],bt[top[x]]);
  233. pair<arr<short>,arr<short> > s=cp(r); sw=sw-s.se;
  234. g[x]=g[x]/v[x]*ts[y]; v[x]=ts[y];
  235. seg[Z+fi[x]]=gm[x]=gs(g[x]); upd(fi[x]); x=top[x];
  236. r=qry(fi[top[x]],bt[top[x]]);
  237. s=cp(r); sw=sw+s.se;
  238. while(fa[x])
  239. {
  240. int y=fa[x]; g[y]=g[y]/w[x]*arr<num>(s.fi);
  241. w[x]=s.fi; x=y;
  242. r=qry(fi[top[x]],bt[top[x]]);
  243. s=cp(r); sw=sw-s.se;
  244. seg[Z+fi[x]]=gm[x]=gs(g[x]); upd(fi[x]); x=top[x];
  245. r=qry(fi[top[x]],bt[top[x]]);
  246. s=cp(r); sw=sw+s.se;
  247. }
  248. w[x]=s.fi; isw=sw; isw.ifwt();
  249. }
  250. }
  251. }

D2T1 天才黑客

好像这种做法不是最优的,比标解多了一个log的样子。

考虑把边拆点,拆成入点和出点,中间连边权。然后1号点连上入点,出点连上边另一个端点。接下来我们要做的就是把同一个点的入边的出点 和 出边的入点 之间连边。

考虑把这些点提取出来在字典树上建个虚树,然后连边的话考虑lca为一个点的有哪些点对,要么是子树之间的,要么是自己和整棵树之间的,在dfs序上建两棵线段树辅助一下连边就好了。

代码难度还是挺高的...

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #include <stdlib.h>
  7. #include <string>
  8. #include <bitset>
  9. #include <vector>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <algorithm>
  14. #include <sstream>
  15. #include <stack>
  16. #include <iomanip>
  17. using namespace std;
  18. #define pb push_back
  19. #define mp make_pair
  20. typedef long long ll;
  21. typedef double ld;
  22. typedef vector<int> vi;
  23. #define fi first
  24. #define se second
  25. #define fe first
  26. #define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
  27. #define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);}
  28. #define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);}
  29. #define es(x,e) (int e=fst[x];e;e=nxt[e])
  30. #define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e])
  31. #define VIZ {printf("digraph G{\n"); for(int i=1;i<=n;i++) for es(i,e) printf("%d->%d;\n",i,vb[e]); puts("}");}
  32. #define VIZ2 {printf("graph G{\n"); for(int i=1;i<=n;i++) for es(i,e) if(vb[e]>=i)printf("%d--%d;\n",i,vb[e]); puts("}");}
  33. #define SZ 2000000
  34. int N=;
  35. #define SS 3500000
  36. int M=,fst[SS],vb[SS],nxt[SS],vc[SS];
  37. void ad_de(int a,int b,int c=){if(a&&b);else return;
  38. //cout<<a<<"->"<<b<<"[label="<<c<<"]\n";
  39. ++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b; vc[M]=c;}
  40. void ad_fe(int a,int b,int c=) {ad_de(b,a,c);}
  41. typedef pair<ll,int> pii;
  42. ll dist[SS];
  43. #define fi first
  44. #define se second
  45. void dj()
  46. {
  47. priority_queue<pii,vector<pii>,greater<pii> > pq;
  48. for(int i=;i<=N;++i) dist[i]=1e18;
  49. dist[]=; pq.push(pii(,));
  50. while(!pq.empty())
  51. {
  52. pii t=pq.top(); pq.pop();
  53. if(t.fi!=dist[t.se]) continue;
  54. int x=t.se;
  55. for(int e=fst[x];e;e=nxt[e])
  56. {
  57. int b=vb[e];
  58. if(dist[b]<=dist[x]+vc[e])
  59. continue;
  60. dist[b]=dist[x]+vc[e];
  61. pq.push(pii(dist[b],b));
  62. }
  63. }
  64. }
  65. template<void f(int,int,int)>
  66. struct seg
  67. {
  68. int Z,s[SZ];
  69. void init(int n)
  70. {
  71. Z=; while(Z<=n+) Z<<=;
  72. for(int i=;i<=Z+Z;++i) s[i]=++N;
  73. for(int i=Z-;i>=;--i)
  74. f(s[i],s[i+i],),f(s[i],s[i+i+],);
  75. }
  76. int gr(int l,int r)
  77. {
  78. int p=++N;
  79. if(l>r) return p;
  80. for(l+=Z-,r+=Z+;l^r^;l>>=,r>>=)
  81. {
  82. if(~l&) f(p,s[l^],);
  83. if(r&) f(p,s[r^],);
  84. }
  85. return p;
  86. }
  87. };
  88. seg<ad_de> zs;
  89. seg<ad_fe> fs;
  90. int fl[SZ];
  91. namespace vt
  92. {
  93. Edg
  94. int C,df[SZ],ls[SZ];
  95. void dfs(int x)
  96. {
  97. df[x]=++C;
  98. for esb(x,e,b) dfs(b);
  99. ls[x]=C;
  100. }
  101. void dfs2(int x)
  102. {
  103. int l=df[x],r=df[x];
  104. ::ad_de(fs.gr(l,r),zs.gr(l,r),fl[x]);
  105. for esb(x,e,b) dfs2(b);
  106. for esb(x,e,b)
  107. {
  108. ::ad_de(fs.gr(l,r),zs.gr(df[b],ls[b]),fl[x]),
  109. ::ad_de(fs.gr(df[b],ls[b]),zs.gr(l,r),fl[x]);
  110. r=ls[b];
  111. }
  112. }
  113. void doit(int r)
  114. {
  115. C=; dfs(r); zs.init(C);
  116. fs.init(C); dfs2(r);
  117. }
  118. }
  119. namespace rt
  120. {
  121. Edg
  122. int n,dfn[SZ],C=,sz[SZ],son[SZ];
  123. void dfs(int x,int f=)
  124. {
  125. if(f) fl[x]=fl[f]+; dfn[x]=++C; sz[x]=; son[x]=;
  126. for esb(x,e,b)
  127. {
  128. dfs(b,x); sz[x]+=sz[b];
  129. if(sz[b]>sz[son[x]]) son[x]=b;
  130. }
  131. }
  132. int top[SZ],fa[SZ];
  133. void dfs2(int x,int t,int f=)
  134. {
  135. fa[x]=f; top[x]=t;
  136. if(!son[x]) return;
  137. dfs2(son[x],t,x);
  138. for esb(x,e,b) if(b!=son[x]) dfs2(b,b,x);
  139. }
  140. int lca(int a,int b)
  141. {
  142. while(top[a]!=top[b])
  143. if(fl[top[a]]<fl[top[b]]) b=fa[top[b]];
  144. else a=fa[top[a]];
  145. return (fl[a]<fl[b])?a:b;
  146. }
  147. bool cmp(int a,int b) {return dfn[a]<dfn[b];}
  148. void init()
  149. {
  150. C=M=;
  151. for(int i=;i<=n;++i) fst[i]=;
  152. for(int i=;i<n;++i)
  153. {
  154. int a,b,c;
  155. scanf("%d%d%d",&a,&b,&c);
  156. ad_de(a,b);
  157. }
  158. dfs();dfs2(,);
  159. }
  160. int vs[SZ],st[SZ],vn=,stn=,vfa[SZ];
  161. void buildrt(int*g,int gn)
  162. {
  163. sort(g+,g++gn,cmp);
  164. gn=unique(g+,g++gn)-g-;
  165. vn=stn=;
  166. for(int i=;i<=gn;i++) vs[++vn]=g[i],vfa[g[i]]=;
  167. for(int i=;i<=gn;i++)
  168. {
  169. int x=g[i];
  170. if(!stn) {st[++stn]=x; vfa[x]=; continue;}
  171. int lca=rt::lca(x,st[stn]);
  172. for(;fl[st[stn]]>fl[lca];--stn)
  173. if(fl[st[stn-]]<=fl[lca])
  174. vfa[st[stn]]=lca;
  175. if(st[stn]!=lca)
  176. {
  177. vs[++vn]=lca;
  178. vfa[lca]=st[stn];
  179. st[++stn]=lca;
  180. }
  181. vfa[x]=lca; st[++stn]=x;
  182. }
  183. int ro=; vt::M=;
  184. for(int i=;i<=vn;++i)
  185. vt::fst[vs[i]]=;
  186. for(int i=;i<=vn;++i)
  187. if(vfa[vs[i]]) vt::ad_de(vfa[vs[i]],vs[i]); else ro=vs[i];
  188. vt::doit(ro);
  189. }
  190. }
  191. namespace Sol
  192. {
  193. int n,m,k,ea[SZ],eb[SZ],ec[SZ],ed[SZ],i1[SZ],i2[SZ];
  194. namespace Z{Edgc}
  195. namespace F{Edgc}
  196. void sol()
  197. {
  198. scanf("%d%d%d",&n,&m,&k); Z::M=F::M=;
  199. ::M=; ::N=n; memset(::fst,,sizeof ::fst);
  200. for(int i=;i<=n;++i) Z::fst[i]=F::fst[i]=;
  201. for(int i=;i<=m;++i)
  202. {
  203. scanf("%d%d%d%d",ea+i,eb+i,ec+i,ed+i);
  204. Z::ad_de(ea[i],eb[i],i);
  205. F::ad_de(eb[i],ea[i],i);
  206. i1[i]=++N; i2[i]=++N;
  207. ad_de(i1[i],i2[i],ec[i]);
  208. if(ea[i]==) ad_de(,i1[i]);
  209. ad_de(i2[i],eb[i]);
  210. }
  211. rt::n=k; rt::init();
  212. for(int i=;i<=n;++i)
  213. {
  214. static int tmp[SZ]; int tn=;
  215. for(int e=Z::fst[i];e;e=Z::nxt[e])
  216. tmp[++tn]=ed[Z::vc[e]];
  217. for(int e=F::fst[i];e;e=F::nxt[e])
  218. tmp[++tn]=ed[F::vc[e]];
  219. rt::buildrt(tmp,tn);
  220. for(int e=F::fst[i];e;e=F::nxt[e])
  221. ad_de(i2[F::vc[e]],fs.s[vt::df[ed[F::vc[e]]]+fs.Z]);
  222. for(int e=Z::fst[i];e;e=Z::nxt[e])
  223. ad_de(zs.s[zs.Z+vt::df[ed[Z::vc[e]]]],i1[Z::vc[e]]);
  224. }
  225. dj();
  226. for(int i=;i<=n;++i)
  227. printf("%lld\n",dist[i]);
  228. }
  229. }
  230. int main()
  231. {
  232. int T; scanf("%d",&T);
  233. for(int i=;i<=T;++i) Sol::sol();
  234. }

D2T2 遗忘的集合

euler transform裸题,详见 http://l0nl1f3.leanote.com/post/Euler-Transform-discussion

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #include <stdlib.h>
  7. #include <string>
  8. #include <bitset>
  9. #include <vector>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <algorithm>
  14. #include <sstream>
  15. #include <stack>
  16. #include <iomanip>
  17. using namespace std;
  18. #define pb push_back
  19. #define mp make_pair
  20. typedef pair<int,int> pii;
  21. typedef long long ll;
  22. typedef double ld;
  23. typedef vector<int> vi;
  24. #define fi first
  25. #define se second
  26. #define fe first
  27. #define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
  28. #define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);}
  29. #define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);}
  30. #define es(x,e) (int e=fst[x];e;e=nxt[e])
  31. #define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e])
  32. #define VIZ {printf("digraph G{\n"); for(int i=1;i<=n;i++) for es(i,e) printf("%d->%d;\n",i,vb[e]); puts("}");}
  33. #define VIZ2 {printf("graph G{\n"); for(int i=1;i<=n;i++) for es(i,e) if(vb[e]>=i)printf("%d--%d;\n",i,vb[e]); puts("}");}
  34. #define SZ 666666
  35.  
  36. //mtt
  37. #define REP(i, a, b) for (int i = (a), _end_ = (b); i < _end_; ++i)
  38. #define debug(...) fprintf(stderr, __VA_ARGS__)
  39. #define mp make_pair
  40. #define x first
  41. #define y second
  42. #define pb push_back
  43. #define ALL(x) (x).begin(), (x).end()
  44.  
  45. template<typename T> inline bool chkmin(T &a, const T &b) { return a > b ? a = b, : ; }
  46. template<typename T> inline bool chkmax(T &a, const T &b) { return a < b ? a = b, : ; }
  47.  
  48. typedef long long LL;
  49.  
  50. const int oo = 0x3f3f3f3f;
  51.  
  52. int Mod = 1e9 + ;
  53. #define MOD Mod
  54. ll qp(ll a,ll b)
  55. {
  56. ll x=;
  57. while(b)
  58. {
  59. if(b&) x=x*a%MOD;
  60. a=a*a%MOD; b>>=;
  61. }
  62. return x;
  63. }
  64. const int max0 = ;
  65.  
  66. struct comp
  67. {
  68. double x, y;
  69.  
  70. comp(): x(), y() { }
  71. comp(const double &_x, const double &_y): x(_x), y(_y) { }
  72.  
  73. };
  74.  
  75. inline comp operator+(const comp &a, const comp &b) { return comp(a.x + b.x, a.y + b.y); }
  76. inline comp operator-(const comp &a, const comp &b) { return comp(a.x - b.x, a.y - b.y); }
  77. inline comp operator*(const comp &a, const comp &b) { return comp(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x); }
  78. inline comp conj(const comp &a) { return comp(a.x, -a.y); }
  79.  
  80. const double PI = acos(-);
  81.  
  82. int N,L;
  83.  
  84. comp w[max0 + ];
  85. int bitrev[max0 + ];
  86.  
  87. void fft(comp *a, const int &n)
  88. {
  89. REP(i, , n) if (i < bitrev[i]) swap(a[i], a[bitrev[i]]);
  90. for (int i = , lyc = n >> ; i <= n; i <<= , lyc >>= )
  91. for (int j = ; j < n; j += i)
  92. {
  93. comp *l = a + j, *r = a + j + (i >> ), *p = w;
  94. REP(k, , i >> )
  95. {
  96. comp tmp = *r * *p;
  97. *r = *l - tmp, *l = *l + tmp;
  98. ++l, ++r, p += lyc;
  99. }
  100. }
  101. }
  102.  
  103. inline void fft_prepare()
  104. {
  105. REP(i, , N) bitrev[i] = bitrev[i >> ] >> | ((i & ) << (L - ));
  106. REP(i, , N) w[i] = comp(cos( * PI * i / N), sin( * PI * i / N));
  107. }
  108.  
  109. inline void conv(int *x, int *y, int *z)
  110. {
  111. REP(i, , N) (x[i] += Mod) %= Mod, (y[i] += Mod) %= Mod;
  112. static comp a[max0 + ], b[max0 + ];
  113. static comp dfta[max0 + ], dftb[max0 + ], dftc[max0 + ], dftd[max0 + ];
  114.  
  115. REP(i, , N) a[i] = comp(x[i] & , x[i] >> );
  116. REP(i, , N) b[i] = comp(y[i] & , y[i] >> );
  117. fft(a, N), fft(b, N);
  118. REP(i, , N)
  119. {
  120. int j = (N - i) & (N - );
  121. static comp da, db, dc, dd;
  122. da = (a[i] + conj(a[j])) * comp(0.5, );
  123. db = (a[i] - conj(a[j])) * comp(, -0.5);
  124. dc = (b[i] + conj(b[j])) * comp(0.5, );
  125. dd = (b[i] - conj(b[j])) * comp(, -0.5);
  126. dfta[j] = da * dc;
  127. dftb[j] = da * dd;
  128. dftc[j] = db * dc;
  129. dftd[j] = db * dd;
  130. }
  131. REP(i, , N) a[i] = dfta[i] + dftb[i] * comp(, );
  132. REP(i, , N) b[i] = dftc[i] + dftd[i] * comp(, );
  133. fft(a, N), fft(b, N);
  134. REP(i, , N)
  135. {
  136. int da = (LL)(a[i].x / N + 0.5) % Mod;
  137. int db = (LL)(a[i].y / N + 0.5) % Mod;
  138. int dc = (LL)(b[i].x / N + 0.5) % Mod;
  139. int dd = (LL)(b[i].y / N + 0.5) % Mod;
  140. z[i] = (da + ((LL)(db + dc) << ) + ((LL)dd << )) % Mod;
  141. }
  142. }
  143. int x[SZ],g[SZ],tmp[SZ],tx[SZ],d[SZ],r[SZ];
  144. void ginv(int s)
  145. {
  146. if(s==)
  147. {
  148. g[]=qp(x[],Mod-);
  149. return;
  150. }
  151. ginv(s-);
  152. L=s+; N=1LL<<L; fft_prepare();
  153. for(int i=N/;i<N;++i) g[i]=;
  154. for(int i=;i<N/;++i) tx[i]=x[i];
  155. conv(tx,g,tmp);
  156. for(int i=N/;i<N;++i) tmp[i]=;
  157. for(int i=;i<N;++i) tmp[i]=((i?:)-tmp[i]+MOD)%MOD;
  158. conv(g,tmp,g);
  159. for(int i=N/;i<N;++i) g[i]=;
  160. }
  161. int n,rs[SZ];
  162. int main()
  163. {
  164. scanf("%d%d",&n,&MOD); ++n; x[]=;
  165. for(int i=;i<n;++i) scanf("%d",x+i);
  166. int s=;
  167. while(n>(<<s)) ++s;
  168. ginv(s);
  169. L=s+; N=<<L; fft_prepare();
  170. for(int i=;i<n;++i) d[i-]=x[i]*ll(i)%MOD;
  171. conv(d,g,r);
  172. vector<int> ans;
  173. for(int i=;i<n;++i)
  174. {
  175. rs[i]=(r[i-]-rs[i]+MOD)%MOD;
  176. for(int j=i+i;j<=n;j+=i) (rs[j]+=rs[i])%=MOD;
  177. if(rs[i]) ans.pb(i);
  178. }
  179. printf("%d\n",int(ans.size()));
  180. for(unsigned j=;j<ans.size();++j)
  181. printf("%d ",ans[j]);puts("");
  182. }

D2T3 文本校正

假设把原串切成123,那么有以下拼合方法:

123 (那可真蠢)

231、312 (枚举个切分点切开,然后哈希判一判)

213:枚举3的位置,然后可以发现1和2的长度的可能取值必须是两个前缀的最大匹配之一,证明参见相关题目题解,kmp+hash即可。

132:把上面一个倒过来。

321:考虑把两个串做C变换(C(a,b)=a[1]b[n]a[2]b[n-1]...a[n]b[1]),然后就是要判断这个玩意儿是不是一个三偶回文串。枚举一个切分点,就是要看后缀是不是双偶回文串,两个回文串中至少有一个可以是最长回文前缀/最长回文后缀,最长回文后缀直接暴力判,最长回文前缀跑完manacher之后更新一遍。(我们需要知道以每个下标作为左端点的最长回文串。从右到左扫描,维护一下当前的左边界,做第i位时我们只要更新当前i-p[i]~左边界-1这一段,然后更新左边界。正确性显然。)

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #include <stdlib.h>
  7. #include <string>
  8. #include <bitset>
  9. #include <vector>
  10. #include <set>
  11. #include <map>
  12. #include <queue>
  13. #include <algorithm>
  14. #include <sstream>
  15. #include <stack>
  16. #include <iomanip>
  17. using namespace std;
  18. #define pb push_back
  19. #define mp make_pair
  20. typedef pair<int,int> pii;
  21. typedef long long ll;
  22. typedef double ld;
  23. typedef vector<int> vi;
  24. #define fi first
  25. #define se second
  26. #define fe first
  27. #define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
  28. #define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);}
  29. #define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);}
  30. #define es(x,e) (int e=fst[x];e;e=nxt[e])
  31. #define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e])
  32. #define VIZ {printf("digraph G{\n"); for(int i=1;i<=n;i++) for es(i,e) printf("%d->%d;\n",i,vb[e]); puts("}");}
  33. #define VIZ2 {printf("graph G{\n"); for(int i=1;i<=n;i++) for es(i,e) if(vb[e]>=i)printf("%d--%d;\n",i,vb[e]); puts("}");}
  34. #define SZ 4444444
  35. int l[],r[];
  36. int T,n,m;
  37. const int MOD=,S=;
  38. ll po[SZ];
  39. template<const int G>
  40. struct str
  41. {
  42. int s[G],n;
  43. ll qz[G];
  44. int fail[G],pal[G],sp[G];
  45. void mlc() //malache
  46. {
  47. int ml=,p=; s[n+]=-;s[]=-;
  48. for(int i=;i<=n;++i)
  49. {
  50. if(i<=ml) pal[i]=min(pal[p+p-i],ml-i);
  51. else pal[i]=;
  52. while(i>=pal[i]+&&
  53. s[i-pal[i]-]==s[i+pal[i]+])
  54. ++pal[i];
  55. if(i+pal[i]>ml)
  56. ml=i+pal[i],p=i;
  57. }
  58. for(int i=n;i>=;--i) sp[i]=;
  59. int cl=n+;
  60. for(int i=n;i>=;--i)
  61. {
  62. for(int j=min(cl-,i);j>=i-pal[i];--j)
  63. cl=j,sp[j]=max(sp[j],i-j);
  64. }
  65. }
  66. void init()
  67. {
  68. for(int i=;i<=n;++i)
  69. qz[i]=(qz[i-]*S+s[i])%MOD;
  70. fail[]=;
  71. for(int i=,j=;i<=n;++i)
  72. {
  73. while(j&&s[j+]!=s[i]) j=fail[j];
  74. if(s[j+]==s[i]) ++j; fail[i]=j;
  75. }
  76. }
  77. inline ll hsh(int l,int r)
  78. {
  79. ll rs=qz[r]-qz[l-]*po[r-l+];
  80. rs%=MOD; return (rs<)?(rs+MOD):rs;
  81. }
  82. void r()
  83. {
  84. reverse(s+,s++n);
  85. }
  86. const str& operator = (const str<G>& b)
  87. {
  88. n=b.n; memcpy(s,b.s,sizeof(int)*(n+));
  89. }
  90. };
  91. str<> a,b,ra,rb;
  92. bool w213(str<>&a,str<>&b)
  93. {
  94. int o=n+;
  95. for(int i=n;i>=&&a.s[i]==b.s[i];--i) o=i;
  96. for(int i=,j=;i<n;++i)
  97. {
  98. while(j&&a.s[j+]!=b.s[i]) j=a.fail[j];
  99. if(a.s[j+]==b.s[i]) ++j;
  100. if(i+<o||!j) continue;
  101. if(a.hsh(j+,i)==b.hsh(,i-j))
  102. {
  103. l[]=; r[]=j;
  104. l[]=j+; r[]=i;
  105. l[]=i+; r[]=n;
  106. return ;
  107. }
  108. }
  109. for(int i=,j=;i<n;++i)
  110. {
  111. while(j&&b.s[j+]!=a.s[i]) j=b.fail[j];
  112. if(b.s[j+]==a.s[i]) ++j;
  113. if(i+<o||!j) continue;
  114. if(b.hsh(j+,i)==a.hsh(,i-j))
  115. {
  116. l[]=; r[]=i-j;
  117. l[]=i-j+; r[]=i;
  118. l[]=i+; r[]=n;
  119. return ;
  120. }
  121. }
  122. return ;
  123. }
  124. str<> t,rt;
  125. str<> tt;
  126. bool w321()
  127. {
  128. t.n=;
  129. for(int i=;i<=n;++i)
  130. t.s[++t.n]=a.s[i],
  131. t.s[++t.n]=b.s[n+-i];
  132. rt=t; rt.r(); t.init(); rt.init();
  133. tt.n=; tt.s[++tt.n]=m+;
  134. for(int i=;i<=t.n;++i)
  135. tt.s[++tt.n]=t.s[i],tt.s[++tt.n]=m+;
  136. tt.mlc();
  137. int rm=;
  138. for(int r=n+n;r>=;--r)
  139. {
  140. if(t.hsh(r,n+n)==rt.hsh(,n+n-r+)) rm=n+n-r+;
  141. int gs=tt.sp[r*-]/*;
  142. if(r&);else continue;
  143. //case1: r-1|...|rm
  144. {
  145. int a=r-,c=rm,b=n+n-a-c;
  146. if(a>&&b>&&c>&&a%==&&b%==&&c%==&&
  147. t.hsh(,a)==rt.hsh(n+n-a+,n+n)
  148. &&t.hsh(a+,a+b)==rt.hsh(n+n-a-b+,n+n-a)
  149. //&&t.hsh(n+n-c+1,n+n)==rt.hsh(1,c)
  150. )
  151. {
  152. a/=,b/=,c/=;
  153. l[]=; ::r[]=a;
  154. l[]=a+; ::r[]=a+b;
  155. l[]=a+b+; ::r[]=n;
  156. return ;
  157. }
  158. }
  159. //case2: r-1|gs|...
  160. {
  161. int a=r-,b=gs,c=n+n-a-b;
  162. if(a>&&b>&&c>&&a%==&&b%==&&c%==&&
  163. t.hsh(,a)==rt.hsh(n+n-a+,n+n)
  164. &&t.hsh(a+,a+b)==rt.hsh(n+n-a-b+,n+n-a)
  165. &&t.hsh(n+n-c+,n+n)==rt.hsh(,c)
  166. )
  167. {
  168. a/=,b/=,c/=;
  169. l[]=; ::r[]=a;
  170. l[]=a+; ::r[]=a+b;
  171. l[]=a+b+; ::r[]=n;
  172. return ;
  173. }
  174. }
  175. }
  176. return ;
  177. }
  178. namespace FF
  179. {
  180. char ch,B[<<],*S=B,*T=B;
  181. #define getc() (S==T&&(T=(S=B)+fread(B,1,1<<20,stdin),S==T)?0:*S++)
  182. #define isd(c) (c>='0'&&c<='9')
  183. int aa,bb;int F(){
  184. while(ch=getc(),!isd(ch)&&ch!='-');ch=='-'?aa=bb=:(aa=ch-'',bb=);
  185. while(ch=getc(),isd(ch))aa=aa*+ch-'';return bb?aa:-aa;
  186. }
  187. }
  188. #define gi FF::F()
  189. void sol()
  190. {
  191. n=gi,m=gi; a.n=b.n=ra.n=rb.n=n;
  192. for(int i=;i<=n;++i) b.s[i]=gi;
  193. for(int i=;i<=n;++i) a.s[i]=gi;
  194. ra=a; rb=b; ra.r(); rb.r();
  195. a.init(); b.init(); ra.init(); rb.init();
  196. l[]=r[]=-;
  197. if(n<)
  198. {
  199. puts("NO");
  200. return;
  201. }
  202. bool s=;
  203. for(int i=;i<=n;++i) s&=a.s[i]==b.s[i];
  204. if(s)
  205. {
  206. puts("YES");
  207. puts("1 1");
  208. puts("2 2");
  209. printf("3 %d\n",n);
  210. return;
  211. }
  212. for(int i=;i<n;++i)
  213. {
  214. if(a.hsh(,i)==b.hsh(n-i+,n)&&
  215. a.hsh(i+,n)==b.hsh(,n-i))
  216. {
  217. if(i!=)
  218. {
  219. puts("YES");
  220. printf("%d %d\n",i+,n);
  221. puts("1 1");
  222. printf("2 %d\n",i);
  223. return;
  224. }
  225. else
  226. {
  227. puts("YES");
  228. printf("%d %d\n",i+,i+);
  229. printf("%d %d\n",i+,n);
  230. puts("1 1");
  231. return;
  232. }
  233. }
  234. }
  235. bool f=w213(a,b);
  236. if(f)
  237. {
  238. puts("YES");
  239. printf("%d %d\n",l[],r[]);
  240. printf("%d %d\n",l[],r[]);
  241. printf("%d %d\n",l[],r[]);
  242. return;
  243. }
  244. f=w213(ra,rb);
  245. if(f)
  246. {
  247. for(int i=;i<;++i)
  248. l[i]=n+-l[i],r[i]=n+-r[i],
  249. swap(l[i],r[i]);
  250. puts("YES");
  251. printf("%d %d\n",l[],r[]);
  252. printf("%d %d\n",l[],r[]);
  253. printf("%d %d\n",l[],r[]);
  254. return;
  255. }
  256. f=w321();
  257. if(f)
  258. {
  259. puts("YES");
  260. printf("%d %d\n",l[],r[]);
  261. printf("%d %d\n",l[],r[]);
  262. printf("%d %d\n",l[],r[]);
  263. return;
  264. }
  265. puts("NO");
  266. }
  267. int main()
  268. {
  269. po[]=;
  270. for(int i=;i<SZ;++i)
  271. po[i]=po[i-]*S%MOD;
  272. T=gi;
  273. while(T--) sol();
  274. }

完结撒花

SDOI2017 R2泛做的更多相关文章

  1. Sdoi2017试题泛做

    Day1 [Sdoi2017]数字表格 推式子的莫比乌斯反演题. #include <cstdio> #include <algorithm> #include <cst ...

  2. codeforces泛做..

    前面说点什么.. 为了完成日常积累,傻逼呵呵的我决定来一发codeforces 挑水题 泛做.. 嗯对,就是泛做.. 主要就是把codeforces Div.1的ABCD都尝试一下吧0.0.. 挖坑0 ...

  3. 学记笔记 $\times$ 巩固 · 期望泛做$Junior$

    最近泛做了期望的相关题目,大概\(Luogu\)上提供的比较简单的题都做了吧\(233\) 好吧其实是好几天之前做的了,不过因为太颓废一直没有整理-- \(Task1\) 期望的定义 在概率论和统计学 ...

  4. 「美团 CodeM 初赛 Round A」试题泛做

    最长树链 树形DP.我们发现gcd是多少其实并不重要,只要不是1就好了,此外只要有一个公共的质数就好了.计f[i][j]表示i子树内含有j因子的最长链是多少.因为一个数的不同的质因子个数是log级别的 ...

  5. Shoi2017试题泛做

    一口气做完六个省的省选(误) Day1 [Shoi2017]期末考试 枚举最大的天数,然后代价贪心地O(1)计算. #include <cstdio> #include <algor ...

  6. 历年NOIP水题泛做

    快noip了就乱做一下历年的noip题目咯.. noip2014 飞扬的小鸟 其实这道题并不是很难,但是就有点难搞 听说男神错了一个小时.. 就是$f_{i,j}$表示在第$i$个位置高度为$j$的时 ...

  7. HAOI2015 泛做

    T1 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的 ...

  8. LCT裸题泛做

    ①洞穴勘测 bzoj2049 题意:由若干个操作,每次加入/删除两点间的一条边,询问某两点是否连通.保证任意时刻图都是一个森林.(两点之间至多只有一条路径) 这就是个link+cut+find roo ...

  9. 基尔霍夫矩阵题目泛做(AD第二轮)

    题目1: SPOJ 2832 题目大意: 求一个矩阵行列式模一个数P后的值.p不一定是质数. 算法讨论: 因为有除法而且p不一定是质数,不一定有逆元,所以我们用辗转相除法. #include < ...

随机推荐

  1. Java IO详解(七)------随机访问文件流

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  2. C3P0配置实战

    C3P0: 一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. 默认情况下(即没有配置连接池的 ...

  3. solr服务器搭建与Tomact整合及使用

    一:solr服务器的搭建 1:搭建全新的为solr专用的solr服务器: 在自己电脑上搭建两台Tomact服务器,一台仍为应用服务器,一台作为solr服务器,应用服务器按照正常Tomact服务器搭建即 ...

  4. 翻译 | The Principles of OOD 面向对象设计原则

    本文首发于vivo互联网技术微信公众号 https://mp.weixin.qq.com/s/Q_pziBUhKRywafKeY2T7YQ 作者:Robert C. Martin 翻译:张硕 本文由来 ...

  5. C指针乱谈(1)

    写了几年的C指针几乎没怎么用过,因为感觉没什么用.不过在听了一位老师讲课之后,我改变的我的想法. 在此稍做总结,希望能帮到一些和我有同样想法的人,希望看完这篇文章后能改变您的想法. 首先,说说概念,指 ...

  6. MFC 如何为控件关联变量

    所关联的变量常见有两种,一种就是控件变量,一种就是数字变量. 为控件关联变量的方法也有两种,一种是通过软件工具添加,一种是手动添加代码. 软件工具添加,方便简单,但是根据软件的版本不同,以及不同的空间 ...

  7. 学习JAVA第一章的心得

    我抱着万分期待的心情开始了我第一天的JAVA学习课程,其实在第一开始的时候我对计算机行业便有很高地兴趣了.这主要归功于我真的从很小开始就就接触了电脑.进入学校以来,我就很期待老师会怎样教我们,会怎样带 ...

  8. 软件工程第三次作业(One who wants to wear the crown, Bears the crown.)

    最大连续子数组和 题目 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时定义子段和 ...

  9. centos6 和centos7 安装git 的区别

    centos6 和centos7 安装git 的区别 centos6安装git yum install curl-devel expat-devel gettext-devel openssl-dev ...

  10. Altium CAED 国际认证操作题例题(含下载)

    官网介绍页面 https://www.altium.com.cn/certification 共五套操作题 含资料 蓝奏云:https://www.lanzous.com/i2lj1ng 百度网盘:h ...