A. Chrome Tabs

当$n=1$时答案为$0$,当$k=1$或$k=n$时答案为$1$,否则答案为$2$。

  1. #include<cstdio>
  2. int T,n,k;
  3. int main(){
  4. freopen("tabs.in","r",stdin);
  5. scanf("%d",&T);
  6. while(T--){
  7. scanf("%d%d",&n,&k);
  8. if(n==1)puts("0");
  9. else if(k==1||k==n)puts("1");
  10. else puts("2");
  11. }
  12. }

  

B. OverCode

按题意模拟即可。

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<string.h>
  4. #include<string>
  5. #include<ctype.h>
  6. #include<math.h>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. #include<bitset>
  12. #include<algorithm>
  13. #include<time.h>
  14. using namespace std;
  15. void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
  16. #define MS(x, y) memset(x, y, sizeof(x))
  17. #define ls o<<1
  18. #define rs o<<1|1
  19. typedef long long LL;
  20. typedef unsigned long long UL;
  21. typedef unsigned int UI;
  22. template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
  23. template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
  24. const int N = 0, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
  25. template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
  26. int casenum, casei;
  27. int n;
  28. int a[505];
  29. int main()
  30. {
  31. freopen("overcode.in","r",stdin);
  32. scanf("%d", &casenum);
  33. for (casei = 1; casei <= casenum; ++casei)
  34. {
  35. scanf("%d", &n);
  36. for(int i = 1; i <= n; ++i)scanf("%d", &a[i]);
  37. sort(a + 1, a + n + 1);
  38. int p = 1;
  39. int ans = 0;
  40. while(p <= n - 5)
  41. {
  42. if(a[p + 5] - a[p] <= 1000)
  43. {
  44. ++ans;
  45. p += 6;
  46. }
  47. else p += 1;
  48. }
  49. printf("%d\n", ans);
  50. }
  51. return 0;
  52. }
  53. /*
  54. 【trick&&吐槽】
  55.  
  56. 【题意】
  57.  
  58. 【分析】
  59.  
  60. 【时间复杂度&&优化】
  61.  
  62. */

  

C. A message for you!

按题意模拟即可。

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<string.h>
  4. #include<string>
  5. #include<ctype.h>
  6. #include<math.h>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. #include<bitset>
  12. #include<algorithm>
  13. #include<time.h>
  14. using namespace std;
  15. void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
  16. #define MS(x, y) memset(x, y, sizeof(x))
  17. #define ls o<<1
  18. #define rs o<<1|1
  19. typedef long long LL;
  20. typedef unsigned long long UL;
  21. typedef unsigned int UI;
  22. template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
  23. template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
  24. const int N = 0, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
  25. template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
  26. int casenum, casei;
  27. int n;
  28. char s[20];
  29. int a[20];
  30. bool e[20];
  31. int main()
  32. {
  33. freopen("scoreboard.in","r",stdin);
  34. scanf("%d", &casenum);
  35. for (casei = 1; casei <= casenum; ++casei)
  36. {
  37. scanf("%d", &n);
  38. scanf("%s", s);
  39. MS(e, 0);
  40. for(int i = 0; i < n; i ++){
  41. e[s[i] - 'A' + 1] = 1;
  42. }
  43. for(int i = 1; i <= 13; ++i)scanf("%d", &a[i]);
  44. int ans = 0, tmp = 0;
  45. for(int i = 1; i <= 13; i ++){
  46. if(e[i] == 0 && a[i] > tmp){
  47. tmp = a[i];
  48. ans = i;
  49. }
  50. }
  51. printf("%c\n", ans + 'A' - 1);
  52. }
  53. return 0;
  54. }
  55. /*
  56. 【trick&&吐槽】
  57.  
  58. 【题意】
  59.  
  60. 【分析】
  61.  
  62. 【时间复杂度&&优化】
  63.  
  64. */

  

D. Test Cases

枚举左端点,往右枚举右端点,同时维护每个数字出现次数的奇偶性。

时间复杂度$O(n^2)$。

  1. #include<cstdio>
  2. int T,n,i,j,odd,ans,v[1000010],a[5555];
  3. int main(){
  4. freopen("cases.in","r",stdin);
  5. scanf("%d",&T);
  6. while(T--){
  7. scanf("%d",&n);
  8. for(i=1;i<=n;i++)scanf("%d",&a[i]);
  9. ans=0;
  10. for(i=1;i<=n;i++){
  11. for(j=i;j<=n;j++)v[a[j]]=0;
  12. odd=0;
  13. for(j=i;j<=n;j++){
  14. v[a[j]]?odd--:odd++;
  15. v[a[j]]^=1;
  16. if(odd==1)ans++;
  17. }
  18. }
  19. printf("%d\n",ans);
  20. }
  21. }

  

E. Robot I - Instruction Reduction

按题意模拟即可。

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<string.h>
  4. #include<string>
  5. #include<ctype.h>
  6. #include<math.h>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. #include<bitset>
  12. #include<algorithm>
  13. #include<time.h>
  14. using namespace std;
  15. void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
  16. #define MS(x, y) memset(x, y, sizeof(x))
  17. #define ls o<<1
  18. #define rs o<<1|1
  19. typedef long long LL;
  20. typedef unsigned long long UL;
  21. typedef unsigned int UI;
  22. template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
  23. template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
  24. const int N = 505, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
  25. template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
  26. int casenum, casei;
  27. int n, m, q;
  28. int y, x; char dir;
  29. char s[N][N];
  30. int f[N][N][4]; //real way
  31. const int dy[4] = {-1,0,1,0};
  32. const int dx[4] = {0,1,0,-1};
  33. int a[1010 * 1010];
  34. int Y, X, D;
  35. pair<int,int> ord[1010];
  36. int main()
  37. {
  38. freopen("reduce.in","r",stdin);
  39. scanf("%d", &casenum);
  40. for (casei = 1; casei <= casenum; ++casei)
  41. {
  42. char dir;
  43. scanf("%d%d%d", &n, &m, &q);
  44. scanf("%d%d %c", &Y, &X, &dir);
  45. if(dir == 'U')D = 0;
  46. else if(dir == 'R')D = 1;
  47. else if(dir == 'D')D = 2;
  48. else D = 3;
  49. int sty = Y, stx = X, stdir = D;
  50. for(int i = 1; i <= n; ++i)
  51. {
  52. scanf("%s", s[i] + 1);
  53. }
  54. for(int i = 2; i < n; ++i)
  55. {
  56. for(int j = 2; j < m; ++j)if(s[i][j] == '.')
  57. {
  58. for(int d = 0; d < 4; ++d)
  59. {
  60. for(int k = 0; k < 4; ++k)
  61. {
  62. int dd = (d + k) % 4;
  63. if(s[i + dy[dd]][j + dx[dd]] == '.')
  64. {
  65. f[i][j][d] = dd;
  66. break;
  67. }
  68. }
  69. }
  70. }
  71. }
  72. //printf("f:%d\n", f[3][2][1]);
  73. int g = 0;
  74. for(int i = 1; i <= q; ++i)
  75. {
  76. char op; scanf(" %c", &op);
  77. if(op == 'R')
  78. {
  79. D = (D + 1) % 4;
  80. }
  81. else
  82. {
  83. int step;
  84. scanf("%d", &step);
  85. while(step--)
  86. {
  87. D = f[Y][X][D];
  88. Y += dy[D];
  89. X += dx[D];
  90. a[++g] = D;
  91. }
  92. }
  93. }
  94. Y = sty, X = stx, D = stdir;
  95.  
  96. //Y X D
  97. int o = 0;
  98. for(int i = 1; i <= g; ++i)
  99. {
  100. /*
  101. printf("step = %d, status = %d %d %d, aimdir = %d\n", i, Y, X, D, a[i]);
  102. printf("f[%d][%d][%d] = %d, a[i] = %d\n", Y, X, D, f[Y][X][D], a[i]);
  103. getchar();
  104. */
  105. for(int k = 0; k < 4; ++k)
  106. {
  107. if(f[Y][X][D] == a[i])
  108. {
  109. D = a[i];
  110. Y += dy[D]; X += dx[D];
  111. if(o && ord[o].first == 1)
  112. {
  113. ++ord[o].second;
  114. }
  115. else ord[++o] = {1, 1};
  116. break;
  117. }
  118. else
  119. {
  120. ord[++o] = {2, -99999999};
  121. D = (D + 1) % 4;
  122. }
  123. }
  124. }
  125. printf("%d\n", o);
  126. }
  127. return 0;
  128. }
  129. /*
  130. 【trick&&吐槽】
  131.  
  132. 【题意】
  133.  
  134. 【分析】
  135.  
  136. 【时间复杂度&&优化】
  137.  
  138. */

  

F. Robot II - Colorful Grid

留坑。

G. WiFi Password

枚举区间$OR$本质不同的$O(n\log w)$段区间,更新答案即可。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int N=100010;
  5. int T,n,lim,i,j,v[N],a[N],l[N],ans;
  6. inline int fun(int a,int b){return a|b;}
  7. int main(){
  8. freopen("wifi.in","r",stdin);
  9. scanf("%d",&T);
  10. while(T--){
  11. scanf("%d%d",&n,&lim);
  12. ans=0;
  13. for(i=1;i<=n;i++)scanf("%d",&a[i]);
  14. for(i=1;i<=n;i++)for(v[i]=a[i],j=l[i]=i;j;j=l[j]-1){
  15. v[j]=fun(v[j],a[i]);
  16. while(l[j]>1&&fun(a[i],v[l[j]-1])==fun(a[i],v[j]))l[j]=l[l[j]-1];
  17. if(v[j]<=lim)ans=max(ans,i-l[j]+1);
  18. }
  19. printf("%d\n",ans);
  20. }
  21. }

  

H. Gas Stations

枚举去掉哪一个加油站,那么最优策略要么是在一开始插入,要么是在末尾插入,要么是将间隔最大的空段劈成两半,维护前$4$大即可快速询问。

时间复杂度$O(n)$。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. typedef long long ll;
  5. const int N=100010;
  6. int bestside[N];
  7. int T,n,m,ans,i,j,q[N];
  8. int pre[N],nxt[N];
  9. char a[N];
  10. int w[N],cnt;
  11. int now[N],tmp;
  12. inline bool cmp(int x,int y){return x>y;}
  13. inline int cal(int l,int r){
  14. int dis=r-l-1;
  15. if(l==0||r==n+1)return dis;
  16. return (dis+1)/2;
  17. }
  18. inline int calleft(int mark){
  19. for(int i=2;i<=m;i++)if(mark!=q[i])return q[i]-1;
  20. }
  21. inline int calright(int mark){
  22. for(int i=m-1;i;i--)if(mark!=q[i])return n-q[i];
  23. }
  24. inline void gao(int l,int r){
  25. if(l==0||r==n+1)return;
  26. w[++cnt]=r-l-1;
  27. }
  28. inline void del(int l,int r){
  29. if(l==0||r==n+1)return;
  30. int dis=r-l-1;
  31. int i;
  32. for(i=1;i<=tmp;i++)if(now[i]==dis)break;
  33. if(i>tmp)return;
  34. for(;i<tmp;i++)now[i]=now[i+1];
  35. tmp--;
  36. }
  37. inline void add(int l,int r){
  38. if(l==0||r==n+1)return;
  39. int dis=r-l-1;
  40. int i;
  41. now[++tmp]=dis;
  42. sort(now+1,now+tmp+1,cmp);
  43. if(tmp>4)tmp--;
  44. }
  45. inline void work(int x){
  46. int i=pre[x],j=nxt[x];//i x j
  47. tmp=cnt;
  48. for(int _=1;_<=cnt;_++)now[_]=w[_];
  49. del(i,x);
  50. del(x,j);
  51. add(i,j);
  52. int left=calleft(x),right=calright(x);
  53. int maxgap=0,secgap=0;
  54. if(tmp>=1)maxgap=now[1];
  55. if(tmp>=2)secgap=now[2];
  56. //case 1 add one in left
  57. ans=min(ans,max(bestside[left],max(right,(maxgap+1)/2)));
  58. //case 2 add one in right
  59. ans=min(ans,max(left,max(bestside[right],(maxgap+1)/2)));
  60. //case 3 add one in maxgap
  61. ans=min(ans,max(max(left,right),max((maxgap/2+1)/2,(secgap+1)/2)));
  62. }
  63. int main(){
  64. freopen("stations.in","r",stdin);
  65.  
  66. for(i=j=1;i<N;i++){
  67. while(j<i&&max(j-1,(i-j+1)/2)>max(j,(i-(j+1)+1)/2))j++;
  68. bestside[i]=max(j-1,(i-j+1)/2);
  69. //i=3 |___+
  70. }
  71.  
  72. scanf("%d",&T);
  73. while(T--){
  74. scanf("%d%s",&n,a+1);
  75. ans=n;
  76. q[m=1]=0;
  77. for(i=1;i<=n;i++)if(a[i]=='+')q[++m]=i;
  78. q[++m]=n+1;
  79.  
  80. if(m==3){
  81. for(i=1;i<=n;i++)ans=min(ans,max(cal(0,i),cal(i,n+1)));
  82. printf("%d\n",ans);
  83. continue;
  84. }
  85.  
  86. pre[0]=0;
  87. nxt[n+1]=0;
  88. for(i=1;i<=m;i++){
  89. if(i>1)pre[q[i]]=q[i-1];
  90. if(i<m)nxt[q[i]]=q[i+1];
  91. }
  92. cnt=0;
  93. for(i=1;i<m;i++)gao(q[i],q[i+1]);
  94. sort(w+1,w+cnt+1,cmp);
  95. cnt=min(cnt,4);
  96. for(i=2;i<m;i++)work(q[i]);
  97. printf("%d\n",ans);
  98. }
  99. }

  

I. Counting Votes

留坑。

J. Efficiency Test

将环倍长,设$f[i][j]$表示在$i$点按$j$步长往右会跳到哪里,可以得到一棵树的结构,在树上DFS,询问时二分即可。

常数优化:将失败的父亲合并,同时剔除子树内不含询问的点。

时间复杂度$O(nk+n\log n)$。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. typedef long long ll;
  5. const int N=200010,M=55,E=N*M;
  6. int Case,n,m,nn,i,j,cnt,s[N];
  7. int goal[N],ans[N];
  8. int g[E],nxt[E],f[E],q[E],t;
  9. bool vip[E];
  10. char a[N];
  11. inline bool canjump(int x,int y){
  12. if(x+y>nn)return 0;
  13. if(a[x+y]=='#')return 0;
  14. return s[x+y]-s[x-1]<=1;
  15. }
  16. inline void gao(int x){
  17. //printf("gao %d\n",x);
  18. //for(int i=2;i<=t;i++)printf("%d %d\n",q[i],w[i]);
  19. //[2..t]
  20. int y=goal[x];
  21. if(q[2]<y){ans[x]=-1;return;}
  22. int l=3,r=t,mid,o=2;
  23. while(l<=r){
  24. mid=(l+r)>>1;
  25. if(q[mid]>=y)l=(o=mid)+1;else r=mid-1;
  26. }
  27. ans[x]=f[t]-f[o];
  28. }
  29. void dfs(int x){
  30. //printf("dfs %d\n",x);
  31. if(!vip[x])return;
  32. int A=x/(m+1);
  33. q[++t]=A;
  34. f[t]=f[t-1];
  35. if(q[t-1]!=A)f[t]++;
  36. if(A&&A<=n&&x%(m+1)==m)gao(A);
  37. for(int i=g[x];i;i=nxt[i])dfs(i);
  38. t--;
  39. }
  40. int main(){
  41. freopen("jumps.in","r",stdin);
  42. scanf("%d",&Case);
  43. while(Case--){
  44. scanf("%d%d%s",&n,&m,a+1);
  45. //for(i=1;i<=n;i++)a[i]='.';
  46. //a[1]='#';
  47. nn=n*2;
  48. for(i=1;i<=n;i++)a[i+n]=a[i];
  49. for(i=1;i<=nn;i++)s[i]=s[i-1]+(a[i]=='#');
  50. //[2..m] is valid
  51. cnt=nn*(m+1)+m;
  52. for(i=0;i<=cnt;i++)g[i]=vip[i]=0;
  53. for(i=nn;i;i--)if(a[i]=='.'){
  54. int y=0;
  55. for(j=2;j<=m;j++){
  56. int x=i*(m+1)+j;
  57. if(canjump(i,j))y=(i+j)*(m+1)+j;
  58. f[x]=y;
  59. //printf("f[%d][%d]=%d\n",i,j,y);
  60. //nxt[x]=g[y];
  61. //g[y]=x;
  62. }
  63. int x=i*(m+1)+m;
  64. while(!vip[x]){
  65. vip[x]=1;
  66. x=f[x];
  67. }
  68. }
  69. for(i=1;i<=nn;i++)if(a[i]=='.'){
  70. for(j=2;j<=m;j++){
  71. int x=i*(m+1)+j;
  72. if(!vip[x])continue;
  73. int y=f[x];
  74. nxt[x]=g[y];
  75. g[y]=x;
  76. }
  77. }
  78. for(i=j=1;i<=n;i++){
  79. while(s[j]-s[i-1]<s[n])j++;
  80. goal[i]=j;//>=j
  81. //printf("goal[%d]=%d\n",i,j);
  82. }
  83. dfs(0);
  84. for(i=1;i<=n;i++){
  85. if(a[i]=='#')printf("0 ");
  86. else printf("%d ",ans[i]);
  87. }
  88. puts("");
  89. }
  90. }

  

K. Running Threads

考虑费用流建图:

  • $S$向每条记录连边,流量$[0,1]$,费用$0$,表示一组的开始。
  • 记录$i$向记录$j$连边,流量$[0,1]$,费用$0$,表示一组延续。
  • 记录向线程连边,流量$[0,1]$,费用$w$,表示一组的结束。
  • 每条线程向$T$连边,流量$[0,1]$,费用$0$,表示只接受最多一组记录。
  • 每条记录拆点,中间连边,流量$[1,1]$,费用$0$。

那么两问分别对应这个有上下界的网络的最小/最大费用可行流。

  1. #include<cstdio>
  2. typedef long long ll;
  3. const int N=1000,M=1000000;
  4. const ll inf=1LL<<60;
  5. int Case,n,m,i,j,a[N],b[N];
  6. ll sum;
  7. int u[M],v[M],c[M],co[M],nxt[M],t,S,T,SS,TT,l,r,q[M];
  8. int g[N],f[N];
  9. bool vis[N];
  10. ll d[N];
  11. int in[N];
  12. int tmp;ll ans;
  13. inline void add(int x,int y,int l,int r,int zo){
  14. r-=l;
  15. in[x]-=l;
  16. in[y]+=l;
  17. if(!r)return;
  18. u[++t]=x;v[t]=y;c[t]=r;co[t]=zo;nxt[t]=g[x];g[x]=t;
  19. u[++t]=y;v[t]=x;c[t]=0;co[t]=-zo;nxt[t]=g[y];g[y]=t;
  20. }
  21. bool spfa(){
  22. int x,i;
  23. for(i=1;i<=TT;i++)d[i]=inf,vis[i]=0;
  24. d[SS]=0;
  25. vis[SS]=1;
  26. l=r=M>>1;
  27. q[l]=SS;
  28. while(l<=r){
  29. int x=q[l++];
  30. if(x==TT)continue;
  31. for(i=g[x];i;i=nxt[i])if(c[i]&&co[i]+d[x]<d[v[i]]){
  32. d[v[i]]=co[i]+d[x];f[v[i]]=i;
  33. if(!vis[v[i]]){
  34. vis[v[i]]=1;
  35. if(d[v[i]]<d[q[l]])q[--l]=v[i];else q[++r]=v[i];
  36. }
  37. }
  38. vis[x]=0;
  39. }
  40. return d[TT]<inf;
  41. }
  42. int main(){
  43. freopen("threads.in","r",stdin);
  44. scanf("%d",&Case);
  45. while(Case--){
  46. scanf("%d%d",&n,&m);
  47. sum=0;
  48. for(i=1;i<=m;i++)scanf("%d",&a[i]),sum+=a[i];
  49. for(i=1;i<=n;i++)scanf("%d",&b[i]);
  50.  
  51. S=n*2+m+1;
  52. T=S+1;
  53. SS=T+1;
  54. TT=SS+1;
  55. for(t=i=1;i<=TT;i++)g[i]=in[i]=0;
  56. add(T,S,0,N,0);
  57. for(i=1;i<=n;i++){
  58. add(i,i+n,1,1,0);
  59. add(S,i,0,1,0);
  60. for(j=1;j<=m;j++)if(b[i]<=a[j])add(i+n,j+n*2,0,1,-b[i]);
  61. for(j=i+1;j<=n;j++)if(b[i]<b[j])add(i+n,j,0,1,0);
  62. }
  63. for(i=1;i<=m;i++)add(i+n*2,T,0,1,0);
  64. for(i=1;i<=TT;i++){
  65. if(in[i]>0)add(SS,i,0,in[i],0);
  66. if(in[i]<0)add(i,TT,0,-in[i],0);
  67. }
  68. ans=0;
  69. while(spfa()){
  70. for(tmp=N,i=TT;i!=SS;i=u[f[i]])if(tmp>c[f[i]])tmp=c[f[i]];
  71. for(ans+=d[i=TT]*tmp;i!=SS;i=u[f[i]])c[f[i]]-=tmp,c[f[i]^1]+=tmp;
  72. }
  73. ans*=-1;
  74. printf("%lld ",sum-ans);
  75.  
  76. S=n*2+m+1;
  77. T=S+1;
  78. SS=T+1;
  79. TT=SS+1;
  80. for(t=i=1;i<=TT;i++)g[i]=in[i]=0;
  81. add(T,S,0,N,0);
  82. for(i=1;i<=n;i++){
  83. add(i,i+n,1,1,0);
  84. add(S,i,0,1,0);
  85. for(j=1;j<=m;j++)if(b[i]<=a[j])add(i+n,j+n*2,0,1,b[i]);
  86. for(j=i+1;j<=n;j++)if(b[i]<b[j])add(i+n,j,0,1,0);
  87. }
  88. for(i=1;i<=m;i++)add(i+n*2,T,0,1,0);
  89. for(i=1;i<=TT;i++){
  90. if(in[i]>0)add(SS,i,0,in[i],0);
  91. if(in[i]<0)add(i,TT,0,-in[i],0);
  92. }
  93. ans=0;
  94. while(spfa()){
  95. for(tmp=N,i=TT;i!=SS;i=u[f[i]])if(tmp>c[f[i]])tmp=c[f[i]];
  96. for(ans+=d[i=TT]*tmp;i!=SS;i=u[f[i]])c[f[i]]-=tmp,c[f[i]^1]+=tmp;
  97. }
  98. printf("%lld\n",sum-ans);
  99. }
  100. }
  101. /*
  102. 3
  103. 6 3
  104. 8 12 7
  105. 5
  106. 3
  107. 7
  108. 3
  109. 4
  110. 9
  111. 3 3
  112. 1000000000 999999999 999999998
  113. 1
  114. 10
  115. 1000
  116. 5 3
  117. 9 5 8
  118. 9
  119. 3
  120. 6
  121. 5
  122. 8
  123.  
  124. */

  

L. Knights

设$f[i][a][b][c][d]$表示从上到下考虑前$i$行,最后$4$行的骑士跳跃方向分别为$a,b,c,d$的方案数。

需要根据可行性将$a$压缩到$3$,$b,c$压缩到$5$,$d$压缩到$7$才能通过。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int N=550,P=1000000007;
  5. int cnt,id[3][5][5][7],p[N][4],g[N][9];
  6. int Case,n,m,w,i,j,k,a[N],f[N][N],ans;
  7. char ch[N];
  8. int v[N][N];
  9. int dx[9]={0,2,2,1,1,-1,-1,-2,-2};
  10. int dy[9]={0,-1,1,-2,2,-2,2,-1,1};
  11. inline void up(int&a,int b){
  12. a=a+b<P?a+b:a+b-P;
  13. }
  14. void init(){
  15. for(int A=0;A<3;A++)for(int B=0;B<5;B++)for(int C=0;C<5;C++)for(int D=0;D<7;D++){
  16. int now=cnt++;
  17. id[A][B][C][D]=now;
  18. p[now][0]=A;
  19. p[now][1]=B;
  20. p[now][2]=C;
  21. p[now][3]=D;
  22. }
  23. for(int A=0;A<3;A++)for(int B=0;B<5;B++)for(int C=0;C<5;C++)for(int D=0;D<7;D++){
  24. int now=id[A][B][C][D];
  25. for(int i=1;i<9;i++){
  26. int nA=B,nB=C,nC=D,nD=i;
  27. if(nA>=3)nA=0;
  28. if(nB>=5)nB=0;
  29. if(nC>=5)nC=0;
  30. if(nD>=7)nD=0;
  31. g[now][i]=id[nA][nB][nC][nD];
  32. }
  33. }
  34. }
  35. int main(){
  36. freopen("knights.in","r",stdin);
  37. init();
  38. scanf("%d",&Case);
  39. while(Case--){
  40. scanf("%d%d",&n,&m);
  41. for(i=1;i<=n;i++){
  42. scanf("%s",ch+1);
  43. for(j=1;j<=m;j++){
  44. if(ch[j]=='*')a[i]=j;
  45. v[i][j]=ch[j]!='.';
  46. }
  47. }
  48. for(i=0;i<=n;i++)for(j=0;j<cnt;j++)f[i][j]=0;
  49. f[0][0]=1;
  50. for(i=0;i<n;i++)for(j=0;j<cnt;j++)if(f[i][j]){
  51. w=f[i][j];
  52. int A=p[j][0],B=p[j][1],C=p[j][2],D=p[j][3];
  53. if(A)v[i-3+dx[A]][a[i-3]+dy[A]]++;
  54. if(B)v[i-2+dx[B]][a[i-2]+dy[B]]++;
  55. if(C)v[i-1+dx[C]][a[i-1]+dy[C]]++;
  56. if(D)v[i+dx[D]][a[i]+dy[D]]++;
  57. for(k=1;k<9;k++){
  58. int x=i+1+dx[k],y=a[i+1]+dy[k];
  59. if(x>=1&&x<=n&&y>=1&&y<=m&&!v[x][y])
  60. up(f[i+1][g[j][k]],w);
  61. }
  62. if(A)v[i-3+dx[A]][a[i-3]+dy[A]]--;
  63. if(B)v[i-2+dx[B]][a[i-2]+dy[B]]--;
  64. if(C)v[i-1+dx[C]][a[i-1]+dy[C]]--;
  65. if(D)v[i+dx[D]][a[i]+dy[D]]--;
  66. }
  67. ans=0;
  68. for(j=0;j<cnt;j++)up(ans,f[n][j]);
  69. printf("%d\n",ans);
  70. }
  71. }

  

M. Winning Cells

问题等价于两个$K-Nim$游戏,那么只要$A\bmod (K+1)\neq B\bmod (K+1)$则先手必胜。

反过来考虑计算必败态的个数,那么考虑$1$到$N$每个数模$K+1$的值,可以将这些数分成贡献不同的两组分别计算。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. typedef long long ll;
  5. const int N=100010;
  6. int T,n,k;long long ans;
  7. inline int fun(int a,int b){return a|b;}
  8. int main(){
  9. freopen("chess.in","r",stdin);
  10. scanf("%d",&T);
  11. while(T--){
  12. scanf("%d%d",&n,&k);k++;
  13. int m=n/k*k;
  14. int base=n/k;
  15. //[0..k-1] base
  16. //[1..n%k] base+1
  17. ans=1LL*n*n;
  18. int A=n%k,B=k-A;
  19. ans-=1LL*base*base*B;
  20. base++;
  21. ans-=1LL*base*base*A;
  22. printf("%lld\n",ans);
  23. }
  24. }

  

2017 ACM Jordanian Collegiate Programming Contest的更多相关文章

  1. 2017 ACM Arabella Collegiate Programming Contest(solved 11/13)

    省选考前单挑做点ACM练练细节还是很不错的嘛- 福利:http://codeforces.com/gym/101350 先来放上惨不忍睹的virtual participate成绩(中间跑去食堂吃饭于 ...

  2. 容斥 或者 单调栈 hihocoder #1476 : 矩形计数 和 G. Snake Rana 2017 ACM Arabella Collegiate Programming Contest

    先说一个简单的题目(题目大意自己看去,反正中文):hihocoder上的:http://hihocoder.com/problemset/problem/1476 然后因为这个n和m的矩阵范围是100 ...

  3. 脑洞 博弈 E. Competitive Seagulls 2017 ACM Arabella Collegiate Programming Contest

    题目链接:http://codeforces.com/gym/101350/problem/E 题目大意:给你一个长度为n的方格,方格上面都被染色成了白色.每次染色都是选择白色的,假设目前选择的这块白 ...

  4. 2017 ACM Amman Collegiate Programming Contest 题解

    [题目链接] A - Watching TV 模拟.统计一下哪个数字最多即可. #include <bits/stdc++.h> using namespace std; const in ...

  5. 2017 ACM Amman Collegiate Programming Contest

    A - Watching TV /* 题意:求出出现次数最多的数字 */ #include <cstdio> #include <algorithm> #include < ...

  6. 2017 ACM Arabella Collegiate Programming Contest(solved 9/13, complex 12/13)

    A.Sherlock Bones 题意: 给出长度为n的01串,问f(i,j)=f(j,k),(i<j<k)的i,j,k取值种数.其中f(i,j)表示[i,j]内1的个数, 且s[j]必须 ...

  7. 2017 ACM Arabella Collegiate Programming Contest div2的题,部分题目写个题解

    F. Monkeying Around   维护点在多少个线段上 http://codeforces.com/gym/101350/problem/F 题意:有m个笑话,每个笑话的区间是[L, R], ...

  8. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...

  9. ACM International Collegiate Programming Contest World Finals 2014

    ACM International Collegiate Programming Contest World Finals 2014 A - Baggage 题目描述:有\(2n\)个字符摆在编号为\ ...

随机推荐

  1. tensorflow 语音识别报错

    cuDnn由7.1版本改为7.4.2.24版本,成功

  2. Mock6 moco框架中如何加入header

    新建一个 startupWithHeader.json,这次在request里面添加了headers属性 [ { "description": "这是一个带header的 ...

  3. MySQL_表锁_lock tables tableName read

    pre.环境准备 1.建立两个表S,T,并插入一些数据 --创建表S create table S(d int) engine=innodb; ); --创建表T create table T(c i ...

  4. maven 构建参数和命令

    mvn常用参数 mvn -e 显示详细错误 mvn -U 强制更新snapshot类型的插件或依赖库(否则maven一天只会更新一次snapshot依赖) mvn -o 运行offline模式,不联网 ...

  5. BOM:浏览器对象模型之浏览器剖析入门

    BOM简介 BOM与DOM的关系 BOM对象包含的内容 重新认识浏览器 一.分裂的BOM和被收服的DOM BOM定义:是browser object model的缩写,简称浏览器对象模型. 主要处理浏 ...

  6. ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(记忆化搜索)

    https://nanti.jisuanke.com/t/31454 题意 两个人玩游戏,最初数字为m,有n轮,每轮三个操作给出a b c,a>0表示可以让当前数字加上a,b>0表示可以让 ...

  7. [物理学与PDEs]第2章第1节 理想流体力学方程组 1.1 预备知识

    1.  理想流体: 指忽略粘性及热传导的流体. 2.  流体的状态 (运动状态及热力学状态) 的描述 (1)   速度向量 $\bbu=(u_1,u_2,u_3)$: 流体微元的宏观运动速度. (2) ...

  8. SSRF漏洞挖掘经验

    SSRF概述 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问 ...

  9. PageUtil.java分页工具类

    package com.chabansheng.util; /** * 分页工具类 * @author Administrator * */ public class PageUtil { /** * ...

  10. AC的故事大结局山寨版(下)

    AC的故事大结局山寨版(下) TimeLimit:2000MS  MemoryLimit:128MB 64-bit integer IO format:%lld   Problem Descripti ...