A.Movie

  题意是给n个线段,要求求出是否存在三个不相交的线段,是的话输出yes,否则输出no。根据贪心的想法,可以先找出右端点r'最小的线段,他是三条线段中最左的那条,再找出左端点l'最大的线段,他是三条线段中最右的那条,这样我们只需要找出是否存在一条线段可以放在中间,即区间[l,r],l>r',r<l'。

  代码

  1. #include<cstdio>
  2. int n;
  3. long long L,R,l,r,a,b,c,d,mi,mx,flag,u,v,i;
  4. int main()
  5. {
  6. int test;
  7. long long P=;
  8. scanf("%d",&test);
  9. while(test--)
  10. {flag=;
  11. scanf("%d%I64d%I64d%I64d%I64d%I64d%I64d",&n,&l,&r,&a,&b,&c,&d);
  12. L=l;R=r;
  13. u=L;v=R;
  14. mi=P;mx=;
  15. if (u>v) u^=v^=u^=v;
  16. if (v<mi) mi=v;
  17. if (u>mx) mx=u;
  18. for (i=;i<=n;i++)
  19. {
  20. L=(L*a+b)%P;
  21. R=(R*c+d)%P;
  22. u=L;v=R;
  23. if (u>v) u^=v^=u^=v;
  24. if (v<mi) mi=v;
  25. if (u>mx) mx=u;
  26. }
  27. L=l;R=r;
  28. u=l;v=r;if (u>v) u^=v^=u^=v;
  29. if ((u>mi)&&(v<mx)) flag=;
  30. for (i=;i<=n;i++)
  31. {
  32. if (flag) break;
  33. L=(L*a+b)%P;
  34. R=(R*c+d)%P;
  35. u=L;v=R;if (u>v) u^=v^=u^=v;
  36. if ((u>mi)&&(v<mx)) flag=;
  37. }
  38. if (flag) printf("YES\n");else printf("NO\n");}
  39. }

B.Cycle

  题意是问给一张无向图,是否存在一个奇环或者偶环,环可以经过同样的点,做法是需要先求出dfs求出一颗树,一些边为树边,一些边为非树边,首先一条非树边和一些树边可以构成一些环,我们可以先判断这些环长度的奇偶性,然后如果一个环可能由多条非树边构成,需要怎么求,也很简单,如果存多个由一条非树边构成的环,他们交集非空,那么有他们复合成环的长度的奇偶性即为这些环的奇偶性的和,即使这些环的交集可能经过一些边,也不要紧,因为构成的环的边是否存在,是根据有多少个环包含这条边所决定,若存在奇数个环包含该边,则该边存在,否则不存在,因而复合环的奇偶性等价于这些环的奇偶性的和。

  代码

  1. #pragma comment(linker, "/STACK:102400000,102400000")
  2. #include<cstdio>
  3. const int M = ;
  4. const int N = ;
  5. int vis[N],deep[N],jump[N][],i,a[N],b[N],v[N][];
  6. int dp,p[N],pre[M],tt[M],id[M],flag[N],n,m,Flag[],s[N][];
  7. void link(int x,int y,int z)
  8. {
  9. dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;id[dp]=z;
  10. }
  11. void dfs(int x,int fa)
  12. {
  13. vis[x]=;
  14. deep[x]=deep[fa]+;
  15. jump[x][]=fa;
  16. int i;
  17. for (i=;i<=;i++)
  18. jump[x][i]=jump[jump[x][i-]][i-];
  19. i=p[x];
  20. while (i)
  21. {
  22. if (!vis[tt[i]])
  23. {
  24. dfs(tt[i],x);
  25. flag[id[i]]=;
  26. }
  27. i=pre[i];
  28. }
  29. }
  30. int lca(int a,int b)
  31. {
  32. if (deep[a]<deep[b]) a^=b^=a^=b;
  33. int i;
  34. for (i=;i>=;i--)
  35. if (deep[jump[a][i]]>=deep[b]) a=jump[a][i];
  36. if (a==b) return a;
  37. for (i=;i>=;i--)
  38. if (jump[a][i]!=jump[b][i])
  39. {
  40. a=jump[a][i];b=jump[b][i];
  41. }
  42. return jump[a][];
  43. }
  44. void gao(int x)
  45. {
  46. int i;
  47. s[x][]+=v[x][];
  48. s[x][]+=v[x][];
  49. i=p[x];
  50. while (i)
  51. {
  52. if (jump[tt[i]][]==x)
  53. {
  54. gao(tt[i]);
  55. s[x][]+=s[tt[i]][];
  56. s[x][]+=s[tt[i]][];
  57. }
  58. i=pre[i];
  59. }
  60. if (s[x][]) Flag[]=;
  61. if (s[x][]) Flag[]=;
  62. if (s[x][]>=) Flag[]=;
  63. }
  64. int main()
  65. {
  66. int test;
  67. scanf("%d",&test);
  68. while (test--)
  69. {
  70. scanf("%d%d",&n,&m);
  71. dp=;
  72. for (i=;i<=n;i++)
  73. p[i]=vis[i]=v[i][]=v[i][]=s[i][]=s[i][]=;
  74. Flag[]=Flag[]=;
  75. for (i=;i<=m;i++)
  76. {
  77. flag[i]=;
  78. scanf("%d%d",&a[i],&b[i]);
  79. link(a[i],b[i],i);
  80. link(b[i],a[i],i);
  81. }
  82. for (i=;i<=n;i++)
  83. if (vis[i]==) dfs(i,);
  84. for (i=;i<=m;i++)
  85. if (!flag[i])
  86. {
  87. int c=lca(a[i],b[i]);
  88. int dis=(deep[a[i]]+deep[b[i]]-*deep[c]+)%;
  89. v[jump[c][]][dis]--;
  90. v[c][dis]--;
  91. v[a[i]][dis]++;
  92. v[b[i]][dis]++;
  93. }
  94. for (i=;i<=n;i++)
  95. if (jump[i][]==) gao(i);
  96. if (Flag[])
  97. printf("YES\n");else printf("NO\n");
  98. if (Flag[])
  99. printf("YES\n");else printf("NO\n");
  100. }
  101. }

C.Segment

  假设对于一个可行的方案,若Ai<Aj,且Bpi>Bpj,那么[Ai,Bpi]∩[Aj,Bpj]与[Ai,Bpj]∩[Aj,Bpi]是等价的,因此我们可以一直将这样的pi和pj进行交换,直到不存在这样的方案,也就是说对于所有的可行方案,经过这样的交换后,配对都会变成一样的,因此可以将A与B进行排序。若存在Ai>Bi则不存在可行方案,否则找一个最长的输出即可。

  代码

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<math.h>
  4. #include<string.h>
  5. #include<stdlib.h>
  6. #include<algorithm>
  7. using namespace std;
  8. const int N= ;
  9. int n,m,i,a[N],b[N],f[N],j,flag,cnt,ans;
  10. int main()
  11. {
  12. int test;
  13. scanf("%d",&test);
  14. while (test--)
  15. {
  16. ans=;cnt=;flag=;
  17. scanf("%d%d",&n,&m);
  18. for (i=;i<=n;i++) f[i]=;
  19. for (i=;i<=m;i++)
  20. scanf("%d",&a[i]);
  21. for (i=;i<=m;i++)
  22. scanf("%d",&b[i]);
  23. sort(a+,a++m);
  24. sort(b+,b++m);
  25. for (i=;i<=m;i++)
  26. {
  27. for (j=a[i];j<=b[i];j++)
  28. f[j]=;
  29. if (a[i]>b[i])
  30. {
  31. flag=;break;
  32. }
  33. }
  34. for (i=;i<=n;i++)
  35. if (f[i]==) cnt++;else
  36. {
  37. if (cnt>ans) ans=cnt;cnt=;
  38. }
  39. if (cnt>ans) ans=cnt;
  40. if (flag) printf("Stupid BrotherK!\n");
  41. else
  42. printf("%d.000000\n",ans);
  43. }
  44. }

D.Brackets

   题意是给一个括号序列,支持两种操作,第一种是修改一个位置的括号,第二种是查询区间[L,R]中,第k个未匹配括号是哪一个,输出下标。若无解输出-1

   首先考虑有无解的判断,若一个序列中消除了已匹配的括号,那么未匹配括号必定是这种形式)))....)))(((((....((,我们可以根据前缀和来判断有无解,做法如下:

  先将'(’视为1,')'视为-1,维护括号序列每个位置的的前缀和sum,那么在区间[L,R]中,未匹配括号的个数即为sum[L-1]+sum[R]-2*min(sum[i])(L<=i<=R),区间最小的前缀和可以用线段树维护一下。

   然后考虑有解情况,若k<=sum[L-1]-sum[i],则答案为区间[l,r]中最靠左边的前缀和为sum[L-1]-k的括号的位置。否则为区间中最靠右边的,且前缀和为min(sum[i])+(k-(sum[L-1]-min(sum[i])))的括号的位置+1。

用线段树维护一下前缀和最小值,即可进行上面解决方法的所有操作,复杂度O(nlogn)

  代码

  1. #include<cstdio>
  2. #include<set>
  3. #define fi first
  4. #define sc second
  5. using namespace std;
  6. typedef pair<int,int> P;
  7. const int N = ;
  8. int v[N],e[N],n,m,i,o;
  9. P s[N];
  10. char ch[N];
  11. P min(P a,P b)
  12. {
  13. if (a.fi==b.fi)
  14. {
  15. if (a.sc<b.sc) return a;return b;
  16. }
  17. if (a.fi<b.fi) return a;return b;
  18. }
  19. void clean(int x)
  20. {
  21. if (v[x])
  22. {
  23. s[x].fi+=v[x];
  24. v[*x]+=v[x];
  25. v[*x+]+=v[x];
  26. v[x]=;
  27. }
  28. }
  29. void gao(int x,int l,int r)
  30. {
  31. v[x]=;
  32. if (r-l==)
  33. {
  34. s[x].fi=e[r];
  35. s[x].sc=r;
  36. }
  37. else
  38. {
  39. int m=(l+r)>>;
  40. gao(*x,l,m);
  41. gao(*x+,m,r);
  42. s[x]=min(s[*x],s[*x+]);
  43. }
  44. }
  45. void change(int x,int a,int b,int l,int r,int c)
  46. {
  47. clean(x);
  48. if ((a<=l)&&(r<=b))
  49. {
  50. v[x]+=c;
  51. return;
  52. }
  53. int m=(l+r)>>;
  54. if (a<m) change(*x,a,b,l,m,c);
  55. if (m<b) change(*x+,a,b,m,r,c);
  56. clean(*x);clean(*x+);
  57. s[x]=min(s[*x],s[*x+]);
  58. }
  59. P query(int x,int a,int b,int l,int r)
  60. {
  61. clean(x);
  62. if ((a<=l)&&(r<=b)) return s[x];
  63. int m=(l+r)>>;
  64. P tmp;tmp.fi=;
  65. if (a<m) tmp=min(tmp,query(*x,a,b,l,m));
  66. if (m<b) tmp=min(tmp,query(*x+,a,b,m,r));
  67. return tmp;
  68. }
  69. int get(int x,int a,int b,int l,int r,int c,int typ)
  70. {
  71. clean(x);
  72. if (s[x].fi>c) return ;
  73. int m=(l+r)>>;
  74. int ans=;
  75. if (r-l==)
  76. {
  77. if (s[x].fi==c) return r;else return ;
  78. }
  79. if ((a<=l)&&(r<=b))
  80. {
  81. if (typ==)
  82. {
  83. ans=get(*x,a,b,l,m,c,typ);
  84. if (ans) return ans;
  85. ans=get(*x+,a,b,m,r,c,typ);
  86. return ans;
  87. }
  88. else
  89. {
  90. ans=get(*x+,a,b,m,r,c,typ);
  91. if (ans) return ans;
  92. ans=get(*x,a,b,l,m,c,typ);
  93. return ans;
  94. }
  95. }
  96. if (typ==)
  97. {
  98. if (a<m) ans=get(*x,a,b,l,m,c,typ);
  99. if (ans) return ans;
  100. if (m<b) ans=get(*x+,a,b,m,r,c,typ);
  101. return ans;
  102. }
  103. else
  104. {
  105. if (m<b) ans=get(*x+,a,b,m,r,c,typ);
  106. if (ans) return ans;
  107. if (a<m) ans=get(*x,a,b,l,m,c,typ);
  108. return ans;
  109. }
  110. }
  111. int main()
  112. {
  113. int test;
  114. scanf("%d",&test);
  115. while (test--)
  116. {
  117. scanf("%d%d",&n,&m);
  118. for (i=;i<=n;i++)
  119. scanf(" %c",&ch[i]);
  120. for (i=;i<=n;i++)
  121. if (ch[i]=='(') e[i+]=e[i]+;else e[i+]=e[i]-;
  122. gao(,,n+);
  123. for (i=;i<=m;i++)
  124. {
  125. int typ,a,b,c;
  126. scanf("%d",&typ);
  127. if (typ==)
  128. {
  129. scanf("%d",&a);
  130. if (ch[a]=='(')
  131. {
  132. ch[a]=')';
  133. a++;
  134. change(,a-,n+,,n+,-);
  135. }
  136. else
  137. {
  138. ch[a]='(';
  139. a++;
  140. change(,a-,n+,,n+,);
  141. }
  142. }
  143. else
  144. {
  145. scanf("%d%d%d",&a,&b,&c);
  146. a++;b++;
  147. P tmp=query(,a-,b,,n+);
  148.  
  149. int p=,q=;
  150. p=query(,a-,a-,,n+).fi;
  151. q=query(,b-,b,,n+).fi;
  152.  
  153. if (p-tmp.fi+q-tmp.fi<c)
  154. printf("-1\n");
  155. else
  156. if (c<=p-tmp.fi)
  157. printf("%d\n",get(,a-,n+,,n+,p-c,)-);
  158. else
  159. printf("%d\n",get(,,b,,n+,tmp.fi+c-(p-tmp.fi)-,));
  160. }
  161. }
  162. }
  163. }

E.Game

题意是有n个人站成环,有一个集合S,每次从集合S中随机选出一个数字s,然后依次报数,报道s的人从环中出去,问n轮后有哪些人有获胜的可能性。经典的约瑟夫问题,可以O(N^3)dp解决。

代码

  1. #include<cstdio>
  2. const int N = ;
  3. int n,m,i,j,k,t,a[N],f[N][N],ans;
  4. int main()
  5. {
  6. int test;
  7. scanf("%d",&test);
  8. while (test--)
  9. {
  10. scanf("%d%d",&n,&m);
  11. for (i=;i<=m;i++)
  12. scanf("%d",&a[i]);
  13. for (i=;i<=n;i++)
  14. for (j=;j<=n;j++)
  15. f[i][j]=;
  16. f[][]=;
  17. for (i=;i<=n;i++)
  18. {
  19. for (j=;j<=m;j++)
  20. {
  21. t=(a[j]-)%i;
  22. for (k=;k<i;k++)
  23. if (f[i-][k])
  24. f[i][(t++k)%i]=;
  25. }
  26. }
  27. ans=;
  28. for (i=;i<n;i++)
  29. if (f[n][i]) ans++;
  30. printf("%d\n",ans);
  31. int flag=;
  32. for (i=;i<n;i++)
  33. if (f[n][i])
  34. {
  35. if (flag) printf(" ");
  36. flag=;
  37. printf("%d",i+);
  38. }
  39. printf("\n");
  40. }
  41. }

  

F.

G.

H.Occupation

  题意是给一棵树,树上每个点都有一个权值,有三类操作,1.取一条路径上所有的没被取的点,2.如果x点被取了,则将其变为未取的状态,3.去以x为根的子树上所有没被取的点,每次操作后求出被取点的价值总和。

  裸的树链剖分。。。

  代码

  1. #include<cstdio>
  2. const int N = ;
  3. int dp,pre[N],p[N],tt[N],size[N],id[N],f[N],deep[N],go[N],L[N],R[N];
  4. int cnt,gf[N],i,n,e[N],a,b,v[N],s[N],sum[N];
  5. void link(int x,int y)
  6. {
  7. dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
  8. }
  9. void dfs1(int x,int y)
  10. {
  11. size[x]=;
  12. int i=p[x];
  13. while (i)
  14. {
  15. if (tt[i]!=y)
  16. {
  17. f[tt[i]]=x;
  18. deep[tt[i]]=deep[x]+;
  19. dfs1(tt[i],x);
  20. size[x]+=size[tt[i]];
  21. if (size[tt[i]]>size[go[x]]) go[x]=tt[i];
  22. }
  23. i=pre[i];
  24. }
  25. }
  26. void dfs2(int x,int y)
  27. {
  28. L[x]=++cnt;
  29. id[cnt]=x;
  30. gf[x]=y;
  31. if (go[x]) dfs2(go[x],y);
  32. int i=p[x];
  33. while (i)
  34. {
  35. if (deep[tt[i]]>deep[x])
  36. if (tt[i]!=go[x])
  37. dfs2(tt[i],tt[i]);
  38. i=pre[i];
  39. }
  40. R[x]=cnt;
  41. }
  42. void clean(int x)
  43. {
  44. if (v[x])
  45. {
  46. v[x]=;
  47. s[x]=sum[x];
  48. v[*x]=;
  49. v[*x+]=;
  50. }
  51. }
  52. void change(int x,int a,int b,int l,int r,int c)
  53. {
  54. clean(x);
  55. if ((a<=l)&&(r<=b))
  56. {
  57. if (c) v[x]=;else s[x]=;
  58. return;
  59. }
  60. int m=(l+r)>>;
  61. if (a<m) change(*x,a,b,l,m,c);
  62. if (m<b) change(*x+,a,b,m,r,c);
  63. clean(*x);clean(*x+);
  64. s[x]=s[*x]+s[*x+];
  65. }
  66. void gao(int a,int b)
  67. {
  68. while ()
  69. {
  70. if (deep[gf[a]]<deep[gf[b]]) a^=b^=a^=b;
  71. if (gf[a]==gf[b])
  72. {
  73. if (deep[a]<deep[b]) a^=b^=a^=b;
  74. change(,L[b]-,L[a],,n,);
  75. return;
  76. }
  77. else
  78. {
  79. change(,L[gf[a]]-,L[a],,n,);
  80. a=f[gf[a]];
  81. }
  82. }
  83. }
  84. void get(int x,int l,int r)
  85. {
  86. v[x]=s[x]=;
  87. if (r-l==)
  88. {
  89. sum[x]=e[id[r]];
  90. return;
  91. }
  92. int m=(l+r)>>;
  93. get(*x,l,m);
  94. get(*x+,m,r);
  95. sum[x]=sum[*x]+sum[*x+];
  96. }
  97. int main()
  98. {
  99. int test;
  100. scanf("%d",&test);
  101. while (test--)
  102. {
  103. scanf("%d",&n);dp=cnt=;
  104. for (i=;i<=n;i++)
  105. {
  106. scanf("%d",&e[i]);
  107. p[i]=go[i]=deep[i]=gf[i]=f[i]=;
  108. }
  109. for (i=;i<n;i++)
  110. {
  111. scanf("%d%d",&a,&b);
  112. link(a,b);link(b,a);
  113. }
  114. dfs1(,);
  115. dfs2(,);
  116. get(,,n);
  117. int m;
  118. scanf("%d",&m);
  119. for (i=;i<=m;i++)
  120. {
  121. int typ;
  122. scanf("%d",&typ);
  123. if (typ==)
  124. {
  125. scanf("%d%d",&a,&b);
  126. gao(a,b);
  127. }
  128. else
  129. {
  130. scanf("%d",&a);
  131. if (typ==)
  132. change(,L[a]-,L[a],,n,);
  133. else
  134. change(,L[a]-,R[a],,n,);
  135. }
  136. clean();
  137. printf("%d\n",s[]);
  138. }
  139. }
  140. }

I.Exploration

  题意是给一张图,其中有一些边为双向,有一些为单向,问是否存在一个起点,其能走出一条路径,至少能到达一个起点以外的点,且最终能回到起点,注意路一旦经过,就会坍塌。

  可以先将双向边连接的点用并查集并起来,如果一个集合中的点不构成一颗树,则说明存在环,那么这个环就可以视为答案,输出YES,如果所有集合都是生成树,那么接着考虑有向边,如果有向边连接的两个点属于同一集合,则存在环经过该有向边,可以直接输出YES,否则则将两端点所在的集合连边,最后进行一边拓扑排序,判断是否存在环,如果存在环输出YES,否则输出NO

代码

  1. #include<cstdio>
  2. #include<queue>
  3. using namespace std;
  4. const int N = ;
  5. int f[N],n,m1,m2,l[N],r[N],i,a,b,id[N],cnt,rd[N];
  6. int dp,pre[N],p[N],tt[N],vis[N];
  7. queue<int> Q;
  8. int gf(int x)
  9. {
  10. int t,p;
  11. p=x;
  12. while (p!=f[p]) p=f[p];
  13. while (x!=p)
  14. {
  15. t=f[x];
  16. f[x]=p;
  17. x=t;
  18. }
  19. return p;
  20. }
  21. void link(int x,int y)
  22. {
  23. dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
  24. }
  25. int main()
  26. {
  27. int test;
  28. scanf("%d",&test);
  29. while (test--)
  30. {
  31. scanf("%d%d%d",&n,&m1,&m2);
  32. for (i=;i<=m1;i++)
  33. scanf("%d%d",&l[i],&r[i]);
  34. for (i=;i<=m2;i++)
  35. scanf("%d%d",&l[m1+i],&r[m1+i]);
  36. dp=;
  37. for (i=;i<=n;i++) f[i]=i,id[i]=rd[i]=p[i]=vis[i]=;
  38. for (i=;i<=m1;i++)
  39. {
  40. if (l[i]==r[i]) continue;
  41. a=gf(l[i]);b=gf(r[i]);
  42. if (a==b) break;
  43. f[a]=b;
  44. }
  45. if (i<=m1)
  46. {
  47. printf("YES\n");
  48. continue;
  49. }
  50. cnt=;
  51. for (i=;i<=n;i++)
  52. {
  53. if (id[gf(i)]==) id[gf(i)]=++cnt;
  54. id[i]=id[gf(i)];
  55. }
  56. for (i=m1+;i<=m1+m2;i++)
  57. {
  58. if (l[i]==r[i]) continue;
  59. if (id[l[i]]==id[r[i]]) break;
  60. link(id[l[i]],id[r[i]]);
  61. rd[id[r[i]]]++;
  62. }
  63. if(i<=m1+m2)
  64. {
  65. printf("YES\n");
  66. continue;
  67. }
  68. for (i=;i<=cnt;i++)
  69. if (rd[i]==) Q.push(i);
  70. while (!Q.empty())
  71. {
  72. int x=Q.front();Q.pop();
  73. i=p[x];
  74. while (i)
  75. {
  76. rd[tt[i]]--;
  77. if (!rd[tt[i]]) Q.push(tt[i]);
  78. i=pre[i];
  79. }
  80. }
  81. for (i=;i<=cnt;i++)
  82. if (rd[i]) break;
  83. if (i<=cnt) printf("YES\n");else printf("NO\n");
  84. }
  85. }

J.GCD

题意是给一些询问,每次询问区间[L,R]的gcd是多少,且得到的答案为w,问能否构造出一个使得所有询问都满足的答案,如果存在多个方案,输出一个序列和最小的方案。

一开始设序列所有数字为1,对于一个询问[L,R]我们可以把区间[L,R]中的数字ai变为lcm(ai,w),这样就可以构造出一个序列,最后用询问来验证一下这个序列是否合法,如果合法,那么该序列即为最小方案,若不合法即为无解。

  代码

  1. #include<cstdio>
  2. const int N = ;
  3. int n,m,i,j,l[N],r[N],w[N],test,tmp;
  4. long long a[N];
  5. long long gcd(long long a,long long b)
  6. {
  7. if (b==) return a;
  8. return gcd(b,a%b);
  9. }
  10. int main()
  11. {
  12. scanf("%d",&test);
  13. while (test--)
  14. {
  15. scanf("%d%d",&n,&m);
  16. for (i=;i<=m;i++)
  17. scanf("%d%d%d",&l[i],&r[i],&w[i]);
  18. for (i=;i<=n;i++)
  19. {
  20. a[i]=;
  21. for (j=;j<=m;j++)
  22. if ((l[j]<=i)&&(i<=r[j]))
  23. {
  24. a[i]=(a[i]*w[j])/gcd(a[i],w[j]);
  25. if (a[i]>) break;
  26. }
  27. if (a[i]>) break;
  28. }
  29. if (i<=n)
  30. printf("Stupid BrotherK!\n");
  31. else
  32. {
  33. for (i=;i<=m;i++)
  34. {
  35. tmp=;
  36. for (j=l[i];j<=r[i];j++)
  37. tmp=gcd(tmp,a[j]);
  38. if (tmp!=w[i]) break;
  39. }
  40. if (i<=m) printf("Stupid BrotherK!\n");
  41. else
  42. {
  43. for (i=;i<n;i++)
  44. printf("%I64d ",a[i]);printf("%I64d\n",a[n]);
  45. }
  46. }
  47. }
  48. }

个人训练记录-赛码"bestcoder"杯中国大学生程序设计冠军赛的更多相关文章

  1. ACM 五一杭电赛码"BestCoder"杯中国大学生程序设计冠军赛小记

    对于这项曾经热爱的竞赛,不得不说这是我最后一年参加ACM比赛了,所以要珍惜每一次比赛的机会. 五一去杭电参加了赛码"BestCoder"杯中国大学生程序设计冠军赛,去的队伍包括了今 ...

  2. HDU 5215 BestCoder"杯中国大学生程序设计冠军赛” 边双连通分量取出子图+二分染色判图内奇偶环

    Cycle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Sub ...

  3. 赛码网算法: 军训队列( python实现 )

    军训队列 题目描述某大学开学进行军训队列训练,将学生从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列剩下的依次向前靠拢,再从头开始进行一至三报数,凡报到三的出 ...

  4. 赛码网算法: 上台阶 ( python3实现 、c实现)

    上台阶 题目描述 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?注:规定从一级到一级有0种走法. 输入输入数据首先包含一个整数n(1<=n<=1 ...

  5. 台州学院maximum cow训练记录

    前队名太过晦气,故启用最大牛 我们的组队大概就是18年初,组队阵容是17级生詹志龙.陶源和16级的黄睿博. 三人大学前均无接触过此类竞赛,队伍十分年轻.我可能是我们队最菜的,我只是知道的内容最多,靠我 ...

  6. 并查集+拓扑排序 赛码 1009 Exploration

    题目传送门 /* 题意:无向图和有向图的混合图判环: 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前, 两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为 ...

  7. 递推DP 赛码 1005 Game

    题目传送门 /* 递推DP:官方题解 令Fi,j代表剩下i个人时,若BrotherK的位置是1,那么位置为j的人是否可能获胜 转移的时候可以枚举当前轮指定的数是什么,那么就可以计算出当前位置j的人在剩 ...

  8. 数学 赛码 1010 GCD

    题目传送门 /* 数学:官方题解 首先,数组中每个元素至少是1 然后对于任意一个询问Li, Ri, Ansi, 说明Li ~ Ri中的元素必定是Ansi的倍数,那么只需将其与Ansi取最小公倍数即可 ...

  9. 贪心 赛码 1001 Movie

    题目传送门 /* 贪心:官方题解: 首先我们考虑如何选择最左边的一个区间 假设最左边的区间标号是i, 那选择的另外两个区间的左端点必定要大于Ri 若存在i之外的j, 满足Rj<Ri, 那么另外两 ...

随机推荐

  1. Python中的dict和set

    1.dict定义: Python写一个dict如下: >>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} >>> d[' ...

  2. BICEP单元测试——随机四则运算升级版

    一.测试方法 6个值得测试的具体部位: Right-结果是否正确? B-是否所有的边界条件都是正确的? I-能查一下反向关联吗? C-能用其他手段交叉检查一下结果吗? E-你是否可以强制错误条件发生? ...

  3. HTML—marquee

    滚动标签 支持的属性: 1.align 2.behavior: alternate: 表示在两端之间来回滚动.scroll: 表示由一端滚动到另一端,会重复.slide:  表示由一端滚动到另一端,不 ...

  4. EaseMode

    The following graphs demonstrate the different values of EasingMode, where f(t) represents the anima ...

  5. php 获取域名等Url

    <?php //获取域名或主机地址 echo $_SERVER['HTTP_HOST']."<br />"; //获取网页地址 echo $_SERVER['PH ...

  6. 试验删除RAC(ORA10G)节点

    1.环境概述 2.删除一个节点 本实验中以删除第二个节点为示例. 2.1删除数据库实例 在第一个节点上(存活的节点)上使用DBCA删除第二个节点的实例. 执行完以上操作可以看下crs_stat –t  ...

  7. HDU5769 Substring(后缀数组)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5769 #include <iostream> #include <stdio.h> ...

  8. SQL SERVER 数据库操作脚本

    创建数据库 create Database MYDB on ( Name=mydb_dat, FileName='c:\data\mydate.mdf',size=10,maxsize=50 ) LO ...

  9. HTML基础篇之列表相关标签和特殊字符实体

    HTML字符实体 常用的字符实体: 实体字符 字符实体 大于号 (>) > 小于号 (<) < 引号 (") " 注册商标(®) ® 版权(© ) © &a ...

  10. 配置webdriver环境

    安装环境pip install selenium,提示 Could not find a version that satisfies the requirement selenium (from v ...