2018.8.10 正睿暑期集训营 Day7

时间:2.5h(实际)(不行太闲了)

期望得分:...

实际得分:...

比赛链接

总结

倍增!之前还记得怎么又忘了。。

如果可以任意互换位置 具体什么样我们是不关心的。

A 花园(思路)

题目链接

只保留两条边,会剩下一个类似基环内向树的图。

每个点到达P的情况有三种可能:1.永远到不了P;2.只会到1次P;3.在某时刻t到达P,然后每隔时间l到达一次P。2是P在环外,3是P在环上。

对每个点分走最长边和次长边DFS两次,记录它到P的时间dis和到P时朝哪(下一次走最长边还是次长边dir)。可以在O(n)时间内预处理。

然后枚举每个点可以得到某一时刻朝哪到达P的有多少点cnt[t][0/1],这个用每个点走最长边时算的dis和dir更新。

然后再用P相邻两点的dis,dir得到从P走最长边/次长边多长时间f[0/1]会回到P,及回到P时朝哪g[0/1]。

环长最长应该不超过2n,一个点到P开始循环的时间也不超过2n,所以预处理4n时间内的 某一时刻朝哪到达P的有多少点。可以通过类似DP用f[0/1],g[0/1]转移。

其实只求P所在的那个环或是能到P的点就可以了,建个反图,把每个点的两条出边改成两条入边。

DFS的时候记一下之前走的是最长边还是次长边(原图中x下一步要走最长边还是次长边),如果是次长边则x只能是从最长边来的(还得会走这条边,即连接点要有这条边);否则如果dgr[x]>1则可以任意从非x的最长边的边来。

当之前走的是最长边时用此时到P的距离更新cnt[t][0/1]。0/1是确定的,只从P DFS我们可以确定到达P时是朝哪的(下次走最长边还是次长边)。

记环长f[0/1]为len,输出的时候时刻应是。。k%len然后一直加len直到>=2n?。。

但是可以直接 \(k%len+[2n/len]*len\)。。我知道后面是\(n<x\leq 2n\)的,但是如果有个点最初需要\(>[2n/len]*len\)的时间到P,K很大的话不是会算不上这个点吗。。

不懂。。神特么看了1天这个题。

  1. //109ms 13392kb
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. //#define gc() getchar()
  6. #define MAXIN 300000
  7. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  8. const int N=150005,M=N<<1;
  9. int n,m,P,Enum,H[N],nxt[M],to[M],dir[M],fir[N],dgr[N],len[2],cnt[N<<2][2],sum[N<<2][2];
  10. char IN[MAXIN],*SS=IN,*TT=IN;
  11. inline int read()
  12. {
  13. int now=0;register char c=gc();
  14. for(;!isdigit(c);c=gc());
  15. for(;isdigit(c);now=now*10+c-'0',c=gc());
  16. return now;
  17. }
  18. #define AddEdge(u,v,d) to[++Enum]=v,nxt[Enum]=H[u],H[u]=Enum,dir[Enum]=d
  19. void DFS(int x,int dis,bool las,bool direct)//las=0:从x的最长边来(原图中x下一步走最长边),那么到x的不是x最长边连的点
  20. {
  21. if(!las) ++cnt[dis][direct];
  22. for(int v,i=H[x]; i; i=nxt[i])
  23. if((!las&&((v=to[i])!=fir[x]||dgr[x]==1))||(las&&(v=to[i])==fir[x]))
  24. {
  25. if(v==P && dir[i]==direct)//以direct的方向回到P
  26. len[direct]=dis+1;//不能return,还有其它到x的点要统计!
  27. else DFS(v,dis+1,dir[i],direct);
  28. }
  29. }
  30. int main()
  31. {
  32. n=read(), m=read(), P=read();
  33. for(int u,v; m--; )
  34. {
  35. u=read(), v=read();
  36. if(!dgr[u]) AddEdge(v,u,0), fir[u]=v, ++dgr[u];
  37. else if(dgr[u]==1) AddEdge(v,u,1), ++dgr[u];
  38. if(!dgr[v]) AddEdge(u,v,0), fir[v]=u, ++dgr[v];
  39. else if(dgr[v]==1) AddEdge(u,v,1), ++dgr[v];
  40. }
  41. DFS(P,0,0,0);
  42. if(dgr[P]>1) DFS(P,0,1,1);
  43. int tot=n<<2, l0=len[0], l1=len[1];
  44. for(int i=0; i<tot; ++i)
  45. {
  46. sum[i][0]+=cnt[i][0], sum[i][1]+=cnt[i][1];
  47. if(l0 && i+l0<tot) sum[i+l0][0]+=sum[i][0];
  48. if(l1 && i+l1<tot) sum[i+l1][1]+=sum[i][1];
  49. }
  50. for(int Q=read(),K,t0=l0?2*n/l0*l0:0,t1=l1?2*n/l1*l1:0; Q--; )
  51. {
  52. if((K=read())<tot) printf("%d ",sum[K][0]+sum[K][1]);
  53. else printf("%d ",(t0?sum[K%l0+t0][0]:0)+(t1?sum[K%l1+t1][1]:0));
  54. }
  55. return 0;
  56. }

B 归来(Tarjan 拓扑)

题目链接

将每种状态转移暴力连边,得到一张有向图,最长路就是答案。

同一强连通分量的点是可以任意转移的,对其缩点后得到DAG,拓扑/记忆化都可以求。\(O(4^n*m)\),期望得分30~50.

注意到交换是任意的,所以只需要关心当前串每种字符的个数。

对于分别有a,b,c,d个A,B,C,D的串,其个数/排列数为\(\frac{n!}{a!b!c!d!}\),但是直接算阶乘是爆longlong的。

最大的时候是\(\frac{n!}{7!7!8!8!}\approx 6e15\),所以直接用组合数\(C_n^a*C_{n-a}^b*C_{n-a-b}^c\)是不会爆longlong的。

总点数是\(C_{30+4-1}^{4-1}=5456\)。同样对状态连边,缩点求最长路。

复杂度\(O(n^3m)\)。

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <cstring>
  5. #include <algorithm>
  6. #define gc() getchar()
  7. #define MAXIN 10000
  8. //#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  9. #define ID(a,b,c) (((a)*nn+(b))*nn+(c))//括号啊!!
  10. typedef long long LL;
  11. const int N=30005,M=810005;//n^3m
  12. int n,nn,tot,m,cnt,top,sk[N],Index,dfn[N],low[N],bel[N];
  13. bool ins[N];
  14. LL val[N],sz[N],f[N];
  15. std::queue<int> q;
  16. char IN[MAXIN],*SS=IN,*TT=IN;
  17. struct Graph
  18. {
  19. int Enum,H[N],nxt[M],to[M],dgr[N];
  20. inline void AddEdge(int u,int v)
  21. {
  22. ++dgr[v], to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
  23. }
  24. }G,D;
  25. inline int read()
  26. {
  27. int now=0;register char c=gc();
  28. for(;!isdigit(c);c=gc());
  29. for(;isdigit(c);now=now*10+c-'0',c=gc());
  30. return now;
  31. }
  32. inline void Get(int *num)
  33. {
  34. register char c=gc();
  35. for(; !isalpha(c); c=gc());
  36. for(; isalpha(c); ++num[c-'A'],c=gc());
  37. }
  38. void Init_val()
  39. {
  40. static LL C[35][35];
  41. C[0][0]=1;
  42. for(int i=1; i<=n; ++i)
  43. {
  44. C[i][0]=C[i][i]=1;
  45. for(int j=1; j<i; ++j) C[i][j]=C[i-1][j]+C[i-1][j-1];
  46. }
  47. for(int a=0; a<=n; ++a)
  48. for(int b=0; a+b<=n; ++b)
  49. for(int c=0; a+b+c<=n; ++c)
  50. val[ID(a,b,c)]=C[n][a]*C[n-a][b]*C[n-a-b][c];
  51. }
  52. void Tarjan(int x)
  53. {
  54. dfn[x]=low[x]=++Index, sk[++top]=x, ins[x]=1;
  55. for(int i=G.H[x],v; i; i=G.nxt[i])
  56. if(!dfn[v=G.to[i]]) Tarjan(v), low[x]=std::min(low[x],low[v]);
  57. else if(ins[v]) low[x]=std::min(low[x],dfn[v]);
  58. if(dfn[x]==low[x])
  59. {
  60. ++cnt; int tmp;
  61. do
  62. {
  63. tmp=sk[top--];
  64. sz[cnt]+=val[tmp], ins[tmp]=0, bel[tmp]=cnt;
  65. }while(tmp!=x);
  66. }
  67. }
  68. void Toposort()
  69. {
  70. LL ans=0;
  71. for(int i=1; i<=cnt; ++i) if(!D.dgr[i]) q.push(i);
  72. while(!q.empty())
  73. {
  74. int x=q.front(); q.pop();
  75. f[x]+=sz[x], ans=std::max(ans,f[x]);
  76. for(int i=D.H[x],v; i; i=D.nxt[i])
  77. {
  78. f[v=D.to[i]]=std::max(f[v],f[x]);
  79. if(!--D.dgr[v]) q.push(v);
  80. }
  81. }
  82. printf("%lld\n",ans);
  83. }
  84. int main()
  85. {
  86. // freopen("ex_return3.in","r",stdin);
  87. n=read(), m=read(), nn=n+1, tot=n*nn*nn;
  88. for(int i=1; i<=m; ++i)
  89. {
  90. int num1[4]={0,0,0,0},num2[4]={0,0,0,0};
  91. Get(num1), Get(num2);
  92. if(num1[0]==num2[0]&&num1[1]==num2[1]&&num1[2]==num2[2]) continue;
  93. for(int a=num1[0]; a<=n; ++a)//枚举所有含Ai的串啊
  94. for(int b=num1[1]; a+b<=n; ++b)
  95. for(int c=num1[2]; a+b+c<=n; ++c)
  96. {
  97. if(n-a-b-c<num1[3]) break;
  98. G.AddEdge(ID(a,b,c),ID(a-num1[0]+num2[0],b-num1[1]+num2[1],c-num1[2]+num2[2]));
  99. }
  100. }
  101. Init_val();
  102. for(int i=0; i<=tot; ++i) if(!dfn[i]) Tarjan(i);//从0开始!(全D)
  103. for(int x=0,now=bel[x]; x<=tot; now=bel[++x])
  104. for(int i=G.H[x],v; i; i=G.nxt[i])
  105. if(now!=bel[G.to[i]]) D.AddEdge(now,bel[G.to[i]]);//正反当然没关系啊
  106. Toposort();
  107. return 0;
  108. }

C 机场(凸函数 点分治)

题目链接



为什么函数是凸的,是有位置使得\(f'(0)<0\)。。

判断凹凸性还是去求二次导吧。

80pts代码:

  1. /*
  2. y=x^{3/2}是凸函数,所以$f(x)=\sum_{i=1}^n w[i]dis(x,i)^{3/2}$也(应该)是凸的。
  3. 凸函数有个性质:局部最优解就是全局最优解。
  4. 所以我们从任意一个点DFS,每次走到答案最小的儿子,一定能找到最优解。
  5. 每次直接跳到子树的重心,复杂度就是O(ndlogn)了(d是点的出度)。
  6. 期望得分80(注意不要DFS太多点)。
  7. */
  8. #include <cmath>
  9. #include <cstdio>
  10. #include <cctype>
  11. #include <algorithm>
  12. //#define gc() getchar()
  13. #define MAXIN 300000
  14. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  15. const int N=2e5+5;
  16. int n,W[N],Enum,H[N],nxt[N<<1],to[N<<1],len[N<<1],dis[N],root,Min,sz[N],Cnt;
  17. double Ans,Sum,f[N];
  18. bool vis[N];
  19. char IN[MAXIN],*SS=IN,*TT=IN;
  20. inline int read()
  21. {
  22. int now=0;register char c=gc();
  23. for(;!isdigit(c);c=gc());
  24. for(;isdigit(c);now=now*10+c-'0',c=gc());
  25. return now;
  26. }
  27. inline void AddEdge(int w,int u,int v)
  28. {
  29. to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, len[Enum]=w;
  30. to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum, len[Enum]=w;
  31. }
  32. void Calc(int x,int f,int d)
  33. {
  34. Sum+=1.0*d*sqrt(d)*W[x];//pow(d,1.5)
  35. for(int i=H[x]; i; i=nxt[i])
  36. if(to[i]!=f) Calc(to[i],x,d+len[i]);
  37. }
  38. void Get_root(int x,int f,int tot)
  39. {
  40. int mx=0; sz[x]=1;
  41. for(int i=H[x],v; i; i=nxt[i])
  42. if(!vis[v=to[i]]&&v!=f)
  43. {
  44. Get_root(v,x,tot), sz[x]+=sz[v];
  45. if(sz[v]>mx) mx=sz[v];
  46. }
  47. mx=std::max(mx,tot-sz[x]);
  48. if(mx<Min) Min=mx, root=x;
  49. }
  50. void Solve(int x)
  51. {
  52. vis[x]=1; double ans=Ans; int p=0;
  53. for(int i=H[x],v; i; i=nxt[i])
  54. {
  55. if(!f[v=to[i]])
  56. if(++Cnt>700) f[v]=Ans;//全DFS要T啊
  57. else Sum=0, Calc(v,0,0), f[v]=Sum;
  58. if(ans>f[v]) ans=f[p=v];
  59. }
  60. Ans=std::min(Ans,ans);
  61. if(p) Min=N, Get_root(p,0,sz[p]), Solve(root);
  62. }
  63. int main()
  64. {
  65. // freopen("ex_airport2.in","r",stdin);
  66. n=read();
  67. for(int i=1; i<=n; ++i) W[i]=read();
  68. for(int i=1; i<n; ++i) AddEdge(read(),read(),read());
  69. Min=N, Get_root(1,0,n), Calc(root,0,0), f[root]=Ans=Sum, Solve(root);
  70. printf("%.7lf\n",Ans);
  71. return 0;
  72. }

考试代码

A

  1. #include <cstdio>
  2. #include <cctype>
  3. #include <vector>
  4. #include <algorithm>
  5. #define gc() getchar()
  6. const int N=150005;
  7. int n,m,P,Q,K[2005],dgr[N],dis[N][2],ans[N];
  8. std::vector<int> e[N];
  9. #define AddEdge(u,v) e[u].push_back(v)
  10. inline int read()
  11. {
  12. int now=0;register char c=gc();
  13. for(;!isdigit(c);c=gc());
  14. for(;isdigit(c);now=now*10+c-'0',c=gc());
  15. return now;
  16. }
  17. namespace Subtask1
  18. {
  19. int n,m,pre[N],pos[N];
  20. void Main()
  21. {
  22. for(int Q=read(); Q--; )
  23. {
  24. int K=read();
  25. for(int i=1; i<=n; ++i) pos[i]=i, pre[i]=0;
  26. while(K--)
  27. {
  28. for(int x=1,p; x<=n; ++x)
  29. {
  30. p=pos[x];
  31. if(dgr[p]==1||e[p][0]!=pre[x]) pre[x]=p, pos[x]=e[p][0];
  32. else pre[x]=p, pos[x]=e[p][1];
  33. }
  34. }
  35. int res=0;
  36. for(int i=1; i<=n; ++i) if(pos[i]==P) ++res;//printf("%d ",i-1), ++res; putchar('\n');
  37. printf("%d ",res);// putchar('\n');
  38. }
  39. }
  40. }
  41. //int DFS(int x,int f,int d,int anc,int toward)
  42. //{
  43. // if(x==P) ans[anc]=d;
  44. // if(dis[x][toward]) return d+dis[x][toward];
  45. // printf("DFS(%d,%d,%d,%d)\n",x,f,d,anc);
  46. // if(dgr[x]==1||e[x][0]!=f)
  47. // {
  48. // if(x==anc&&d) return d;
  49. // return DFS(e[x][0],x,d+1,anc,0);
  50. //// if(!dis[x][0]) dis[x][0]=DFS(e[x][0],x,d+1,x);
  51. //// return d+dis[x][0];
  52. // }
  53. // else
  54. // {
  55. // return DFS(e[x][1],x,d+1,anc,1);
  56. //// if(!dis[x][1]) dis[x][1]=DFS(e[x][1],x,d+1,x);
  57. //// return d+dis[x][1];
  58. // }
  59. //}
  60. int main()
  61. {
  62. freopen("ex_garden2.in","r",stdin);
  63. // freopen(".out","w",stdout);
  64. n=read(), m=read(), P=read()+1;
  65. for(int i=1,u,v; i<=m; ++i)
  66. {
  67. u=read()+1, v=read()+1;
  68. if(dgr[u]<2) ++dgr[u], AddEdge(u,v);
  69. if(dgr[v]<2) ++dgr[v], AddEdge(v,u);
  70. }
  71. if(n<=1000) {Subtask1::n=n, Subtask1::m=m, Subtask1::Main(); return 0;}
  72. // for(int i=1; i<=n; ++i) if(!dis[i][0]) dis[i][0]=DFS(i,i,0,i,0);
  73. // for(int i=1; i<=n; ++i) printf("dis[%d]: 0:%d 1:%d\n",i-1,dis[i][0],dis[i][1]);
  74. // for(int Q=read(),K; Q--; )
  75. // {
  76. // K=read();
  77. //
  78. // }
  79. return 0;
  80. }

B

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <cstring>
  5. #include <algorithm>
  6. #define gc() getchar()
  7. typedef long long LL;
  8. const int N=10004,M=2e6+5;
  9. int n,m,len[N];
  10. char s[N],A[N][N],B[N][N];
  11. namespace Subtask1
  12. {
  13. int cnt,Enum,H[N],nxt[M],to[M],dgr[N],val[N];
  14. char s[N];
  15. bool vis[N];
  16. std::queue<int> q;
  17. inline bool OK(int p,int l,char *t)
  18. {
  19. for(int i=1; i<=l; ++i) if(s[p+i]!=t[i]) return 0;
  20. return 1;
  21. }
  22. inline int Encode(char *s)
  23. {
  24. int res=0;
  25. for(int i=1; i<=n; ++i) res=(res<<2)+(s[i]-'A');
  26. return res;
  27. }
  28. inline void AddEdge(int u,int v)
  29. {
  30. ++dgr[u], to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
  31. }
  32. void Init_S(int now)
  33. {
  34. if(now>n)
  35. {
  36. int hs=Encode(s),hs2;
  37. // printf("%s:%d\n",s+1,hs);
  38. for(int i=1; i<n; ++i)
  39. if(s[i]!=s[i+1])
  40. std::swap(s[i],s[i+1]), hs2=Encode(s), AddEdge(hs,hs2), std::swap(s[i],s[i+1]);
  41. for(int p=0; p<n; ++p)
  42. for(int i=1; i<=m; ++i)
  43. if(p+len[i]<=n && OK(p,len[i],A[i]))
  44. {
  45. // printf("%s->",s+1);
  46. for(int j=1; j<=len[i]; ++j) s[p+j]=B[i][j];
  47. // printf("%s\n",s+1);
  48. hs2=Encode(s), AddEdge(hs,hs2);
  49. for(int j=1; j<=len[i]; ++j) s[p+j]=A[i][j];
  50. }
  51. }
  52. else for(int i=0; i<4; ++i) s[now]='A'+i, Init_S(now+1);
  53. }
  54. void DFS(int x)
  55. {
  56. vis[x]=1, ++cnt;
  57. for(int i=H[x]; i; i=nxt[i])
  58. if(!vis[to[i]]) DFS(to[i]);
  59. }
  60. void Main()
  61. {
  62. Init_S(1); char tmp[7]={"DDDDDD"};
  63. int tot=Encode(tmp);
  64. for(int i=0; i<=tot; ++i) val[i]=1;
  65. for(int i=0; i<=tot; ++i) if(!dgr[i]) q.push(i);
  66. for(int i=0; i<=tot; ++i) if(dgr[i]==1) q.push(i);
  67. int res=0;
  68. while(!q.empty())
  69. {
  70. int x=q.front(); q.pop();
  71. res=std::max(res,val[x]);
  72. // printf("now:%d\n",x);
  73. for(int v,i=H[x]; i; i=nxt[i])
  74. if(dgr[v=to[i]]>1)
  75. {
  76. val[v]=std::max(val[v],val[x]+1);
  77. res=std::max(res,val[v]);
  78. // printf("%d->%d val:%d\n",x,v,val[v]);
  79. if(!--dgr[v]||dgr[v]==1) q.push(v);
  80. }
  81. }
  82. for(int i=0; i<=tot; ++i)
  83. if(!vis[i]) cnt=0, DFS(i), res=std::max(res,cnt);
  84. printf("%d\n",res);
  85. }
  86. }
  87. int main()
  88. {
  89. // freopen("ex_return2.in","r",stdin);
  90. // freopen(".out","w",stdout);
  91. scanf("%d%d",&n,&m);
  92. for(int i=1; i<=m; ++i) scanf("%s%s",A[i]+1,B[i]+1), len[i]=strlen(A[i]+1);
  93. if(n<=5) Subtask1::Main();
  94. // printf("%lld\n",Ans);
  95. return 0;
  96. }

C

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. #define gc() getchar()
  6. #define MAXIN 300000
  7. //#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  8. const int N=2e5+5;
  9. int n,W[N],Enum,H[N],nxt[N<<1],to[N<<1],len[N<<1],dis[N];
  10. double Ans;
  11. std::pair<int,int> A[N];
  12. char IN[MAXIN],*SS=IN,*TT=IN;
  13. inline int read()
  14. {
  15. int now=0;register char c=gc();
  16. for(;!isdigit(c);c=gc());
  17. for(;isdigit(c);now=now*10+c-'0',c=gc());
  18. return now;
  19. }
  20. inline void AddEdge(int w,int u,int v)
  21. {
  22. to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, len[Enum]=w;
  23. to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum, len[Enum]=w;
  24. }
  25. void DFS(int x,int f,int d)
  26. {
  27. Ans+=1.0*pow(d,1.5)*W[x];
  28. for(int i=H[x]; i; i=nxt[i])
  29. if(to[i]!=f) DFS(to[i],x,d+len[i]);
  30. }
  31. int main()
  32. {
  33. // freopen("ex_airport2.in","r",stdin);
  34. // freopen(".out","w",stdout);
  35. n=read();
  36. for(int i=1; i<=n; ++i) W[i]=read();
  37. for(int i=1; i<n; ++i) AddEdge(read(),read(),read());
  38. double res=1e18;
  39. if(n<=5000)
  40. {
  41. for(int i=1; i<=n; ++i)
  42. Ans=0, DFS(i,i,0), res=std::min(res,Ans);
  43. }
  44. else
  45. {
  46. for(int i=1; i<=n; ++i) A[i]=std::make_pair(W[i],i);
  47. std::sort(A+1,A+1+n,std::greater<std::pair<int,int> >());
  48. for(int T=1,v; T<=250; ++T)
  49. Ans=0, DFS(A[T].second,A[T].second,0), res=std::min(res,Ans);
  50. }
  51. printf("%.7lf\n",res);
  52. return 0;
  53. }

8.10 正睿暑期集训营 Day7的更多相关文章

  1. 8.6 正睿暑期集训营 Day3

    目录 2018.8.6 正睿暑期集训营 Day3 A 亵渎(DP) B 绕口令(KMP) C 最远点(LCT) 考试代码 A B C 2018.8.6 正睿暑期集训营 Day3 时间:5h(实际) 期 ...

  2. 8.9 正睿暑期集训营 Day6

    目录 2018.8.9 正睿暑期集训营 Day6 A 萌新拆塔(状压DP) B 奇迹暖暖 C 风花雪月(DP) 考试代码 A B C 2018.8.9 正睿暑期集训营 Day6 时间:2.5h(实际) ...

  3. 8.8 正睿暑期集训营 Day5

    目录 2018.8.8 正睿暑期集训营 Day5 总结 A 友谊巨轮(线段树 动态开点) B 璀璨光滑 C 构解巨树 考试代码 A B C 2018.8.8 正睿暑期集训营 Day5 时间:3.5h( ...

  4. 8.7 正睿暑期集训营 Day4

    目录 2018.8.7 正睿暑期集训营 Day4 A 世界杯(贪心) B 数组(线段树) C 淘汰赛 考试代码 A B C 2018.8.7 正睿暑期集训营 Day4 时间:5h(实际) 期望得分:. ...

  5. 8.5 正睿暑期集训营 Day2

    目录 2018.8.5 正睿暑期集训营 Day2 总结 A.占领地区(前缀和) B.配对(组合) C 导数卷积(NTT) 考试代码 T1 T2 T3 2018.8.5 正睿暑期集训营 Day2 时间: ...

  6. 8.4 正睿暑期集训营 Day1

    目录 2018.8.4 正睿暑期集训营 Day1 A 数对子 B 逆序对 C 盖房子 考试代码 A B C 2018.8.4 正睿暑期集训营 Day1 时间:4.5h(实际) 期望得分:30+50+3 ...

  7. 7.30 正睿暑期集训营 A班训练赛

    目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...

  8. 8.9 正睿暑期集训营 Day6 C 风花雪月(DP)

    题目链接 完整比赛在这儿. 杜老师tql . 求期望要抽卡的次数,也就是求期望经历了多少不满足状态.而每个不满足的状态对答案的贡献为\(1\),所以可以直接算概率.即\(Ans=\sum_{不满足状态 ...

  9. 正睿OI集训游记

    什么嘛....就是去被虐的... 反正就是难受就是了.各种神仙知识点,神仙题目,各式各样的仙人掌..... 但是还是学会了不少东西...... 应该是OI生涯最后一次集训了吧.... 这次的感言还是好 ...

随机推荐

  1. ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Memory order

    1.前言 2.基本概念 Observer 可以发起对memory read/write访问的都是observer; Observability 是一种观察能力,通过read可以感知到别的observe ...

  2. php数据库的增删改查

    1.查询: 数据的显示,这里就可以嵌入php来进行数据的输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...

  3. 找到多个与名为“Home”的控制器匹配的类型的解决方案

    主地址:http://localhost:3412/Home/Index 区域地址:http://localhost:3412/T200/Home/Index 解决方法: 注册路由添加命名空间(nam ...

  4. 关于windows2008r2系统80端口被system进程占用的问题

    80端口被system占用的问题   今天启动tomcat的时候发现无法启动80端口被占用 通过netstat -ano查看,发现被pid=4的进程占用 检查进程发现是system进程pid=4给占用 ...

  5. 转载:使用Nginx的必备软件(1.3.2)《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19612.html 如果要使用Nginx的常用功能,那么首先需要确保该操作系统上至少安装了如下软件. (1)GCC编译器 GCC(GN ...

  6. 【gearman】学习笔记

    学习资料:http://gearman.org/manual/ 1.Gearman是跨语言的,client和worker可以用不同的语言来实现 2.client与job server之间的交互称为ta ...

  7. VIM 报错

    syntax error: unexpected end of file if 没配对 在最后加 fi 试试 环境变量用不了 export PATH=/usr/bin:/usr/sbin:/bin:/ ...

  8. cf807 c 二分好题

    能够二分判定的前提是能找到一个单调关系,有时候需要将不是单调关系的数据转换成另外的具有单调关系的数据 #include<bits/stdc++.h> using namespace std ...

  9. hdu5358 推公式+在一个区间内的尺取+枚举法

    尺取+枚举,推出公式以后就是一个枚举加尺取 但是这题的尺取不是对一个值尺取,而是在一个区间内,所以固定左边界,尺取右边界即可 #include<bits/stdc++.h> #define ...

  10. Map集合遍历的四种方式理解和简单使用

    ~Map集合是键值对形式存储值的,所以遍历Map集合无非就是获取键和值,根据实际需求,进行获取键和值 1:无非就是通过map.keySet()获取到值,然后根据键获取到值 for(String s:m ...