期望得分:100+30+60=190

实际得分:10+0+55=65

到了233 2是奇数位 或223 第2个2是偶数位就会223 、233 循环

  1. #include<cstdio>
  2.  
  3. #define N 1000001
  4.  
  5. using namespace std;
  6.  
  7. char s[N+];
  8.  
  9. int main()
  10. {
  11. freopen("trans.in","r",stdin);
  12. freopen("trans.out","w",stdout);
  13. int n,k; bool ok;
  14. while(scanf("%d%d",&n,&k)!=EOF)
  15. {
  16. scanf("%s",s+);
  17. ok=false;
  18. for(int i=;i<n;i++)
  19. {
  20. if(s[i]=='' && s[i+]=='')
  21. {
  22. k--;
  23. if(s[i-]=='')
  24. {
  25. if(i&) s[i+]='';
  26. else
  27. {
  28. for(int j=;j<i;j++) printf("%c",s[j]);
  29. if(k&) printf("");
  30. else printf("");
  31. for(int j=i+;j<=n;j++) printf("%c",s[j]);
  32. ok=true; break;
  33. }
  34. }
  35. else if(s[i+]=='')
  36. {
  37. if(i&)
  38. {
  39. for(int j=;j<=i;j++) printf("%c",s[j]);
  40. if(k&) printf("");
  41. else printf("");
  42. for(int j=i+;j<=n;j++) printf("%c",s[j]);
  43. ok=true; break;
  44. }
  45. else s[i]='';
  46. }
  47. else
  48. {
  49. if(i&) s[i+]='';
  50. else s[i]='';
  51. }
  52. if(!k) break;
  53. }
  54. }
  55. if(!ok)
  56. for(int i=;i<=n;i++) printf("%c",s[i]);
  57. printf("\n");
  58. }
  59. return ;
  60. }

注:不能向上走

因为蛇可以在一行内任意移动

他最终在一行内的移动范围是一段连续的区间

所以本题可以用区间DP解决

f[i][j][k] 表示 前i行,长度为j,从第k列离开第i行的最大得分

g[j][l][r] 表示当前长度为j,在区间[l,r]内移动,没有死亡的最大得分

开始时 ,对于每一个i,f[i][j][k]=g[j][k][k]=f[i-1][g-a[i][k]][k]+max(-a[i][k],0)

然后,区间由内向外更新, g[j][l][r]=max(g[j-a[i][l]][l+1][r]+a[i][l],g[j-a[i][r]][l][r-1]+a[i][r])

最后 更新f f[i][j][k]=max(g[j][l][r]) k∈[l,r]

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5.  
  6. #define N 201
  7.  
  8. using namespace std;
  9.  
  10. int a[N][];
  11.  
  12. int f[N][N*][],g[N*][][];
  13.  
  14. bool can[N][];
  15.  
  16. void read(int &x)
  17. {
  18. x=; int f=; char c=getchar();
  19. while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
  20. while(isdigit(c)) { x=x*+c-''; c=getchar(); }
  21. x*=f;
  22. }
  23.  
  24. int main()
  25. {
  26. freopen("snakevsblock.in","r",stdin);
  27. freopen("snakevsblock.out","w",stdout);
  28. int n,sum=;
  29. read(n);
  30. for(int i=;i<=n;i++)
  31. for(int j=;j<=;j++)
  32. {
  33. read(a[i][j]);
  34. if(a[i][j]>) sum+=a[i][j];
  35. }
  36. int m,x,y;
  37. read(m);
  38. for(int i=;i<=m;i++)
  39. {
  40. read(x); read(y);
  41. can[x][y]=true;
  42. }
  43. memset(f,-,sizeof(f));
  44. f[][][]=;
  45. int r;
  46. for(int i=;i<=n;i++)
  47. {
  48. memset(g,-,sizeof(g));
  49. for(int j=;j<=sum;j++)
  50. for(int k=;k<=;k++)
  51. if(j-a[i][k]>=) f[i][j][k]=g[j][k][k]=f[i-][j-a[i][k]][k]+max(-a[i][k],);
  52. for(int len=;len<=;len++)
  53. for(int l=;l+len-<=;l++)
  54. for(int j=;j<=sum;j++)
  55. {
  56. r=l+len-;
  57. if(!can[i][l] && j-a[i][l]>=) g[j][l][r]=g[j-a[i][l]][l+][r]+max(-a[i][l],);
  58. if(!can[i][r-] && j-a[i][r]>=) g[j][l][r]=max(g[j][l][r],g[j-a[i][r]][l][r-]+max(-a[i][r],));
  59. for(int k=l;k<=r;k++) f[i][j][k]=max(f[i][j][k],g[j][l][r]);
  60. }
  61. }
  62. int ans=;
  63. for(int i=;i<=n;i++)
  64. for(int j=;j<=sum;j++)
  65. for(int k=;k<=;k++)
  66. ans=max(ans,f[i][j][k]);
  67. printf("%d",ans);
  68. }

前 30%: O(2^n * n^3)

暴力枚举哪些站点损坏,floyd判断这些站点损坏时,测试的站点是否连通

另20%:O(nlogn+k)

问题转化为选择最少的点覆盖所有的线段

即留下最多的区间,使区间不相交

按右端点从小到大排序 ,删掉与当前区间有交的区间

另10%:分类讨论即可

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6.  
  7. using namespace std;
  8.  
  9. #define N 100001
  10.  
  11. int n,m,k,out=1e6;
  12.  
  13. int front[N],nxt[N<<],to[N<<],tot;
  14.  
  15. int in[N],ans[N],id[N],cnt;
  16.  
  17. int cut[N][];
  18.  
  19. bool con[][],f[];
  20.  
  21. int E[N][];
  22.  
  23. int vis[N],fa[N][];
  24.  
  25. struct node
  26. {
  27. int l,r,nl,nr;
  28. }e[N*];
  29.  
  30. queue<int>q;
  31.  
  32. void read(int &x)
  33. {
  34. x=; char c=getchar();
  35. while(!isdigit(c)) c=getchar();
  36. while(isdigit(c)) { x=x*+c-''; c=getchar(); }
  37. }
  38.  
  39. void add(int u,int v)
  40. {
  41. to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
  42. to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
  43. }
  44.  
  45. bool cmp(node p,node q)
  46. {
  47. return p.nr<q.nr;
  48. }
  49.  
  50. void bfs(int x)
  51. {
  52. id[x]=++cnt;
  53. q.push(x);
  54. int now;
  55. while(!q.empty())
  56. {
  57. now=q.front(); q.pop();
  58. for(int i=front[now];i;i=nxt[i])
  59. if(!id[to[i]]) id[to[i]]=++cnt,q.push(to[i]);
  60. }
  61. }
  62.  
  63. void solve2(int start)
  64. {
  65. bfs(start);
  66. read(k);
  67. for(int i=;i<=k;i++)
  68. {
  69. read(e[i].l),read(e[i].r);
  70. e[i].nl=id[e[i].l];
  71. e[i].nr=id[e[i].r];
  72. if(e[i].nl>e[i].nr) swap(e[i].l,e[i].r),swap(e[i].nl,e[i].nr);
  73. }
  74. sort(e+,e+k+,cmp);
  75. int sum=,last=;
  76. for(int i=;i<=k;i++)
  77. if(e[i].nl>last) last=e[i].nr,ans[++sum]=e[i].r;
  78. printf("%d\n",sum);
  79. for(int i=;i<=sum;i++) printf("%d ",ans[i]);
  80. }
  81.  
  82. void judge(int sum)
  83. {
  84. memset(con,false,sizeof(con));
  85. for(int i=;i<=n;i++) if(!f[i]) con[i][i]=true;
  86. for(int i=;i<=m;i++)
  87. if(!f[E[i][]] && !f[E[i][]]) con[E[i][]][E[i][]]=con[E[i][]][E[i][]]=true;
  88. for(int h=;h<=n;h++)
  89. for(int i=;i<=n;i++)
  90. for(int j=;j<=n;j++)
  91. if(h!=i && h!=j && i!=j && con[i][h] && con[h][j]) con[i][j]=true;
  92. for(int i=;i<=k;i++)
  93. if(con[cut[i][]][cut[i][]]) return;
  94. if(sum<out)
  95. {
  96. out=sum;
  97. for(int i=,j=;i<=n;i++) if(f[i]) ans[j++]=i;
  98. }
  99. }
  100.  
  101. void dfs(int now,int sum)
  102. {
  103. if(sum>=out) return;
  104. if(now==n+)
  105. {
  106. judge(sum);
  107. return;
  108. }
  109. dfs(now+,sum);
  110. f[now]=true; dfs(now+,sum+); f[now]=false;
  111. }
  112.  
  113. void solve1()
  114. {
  115. read(k);
  116. for(int i=;i<=k;i++) read(cut[i][]),read(cut[i][]);
  117. dfs(,);
  118. printf("%d\n",out);
  119. for(int i=;i<=out;i++) printf("%d ",ans[i]);
  120. }
  121.  
  122. void dfs2(int x,int y)
  123. {
  124. id[x]=++tot;
  125. for(int i=front[x];i;i=nxt[i])
  126. if(to[i]!=y) fa[to[i]][]=x,dfs2(to[i],x);
  127. }
  128.  
  129. int getlca(int u,int v)
  130. {
  131. if(u==v) return u;
  132. if(id[u]<id[v]) swap(u,v);
  133. for(int i=;i>=;i--)
  134. if(id[fa[u][i]]>id[v]) u=fa[u][i];
  135. return fa[u][];
  136. }
  137.  
  138. void solve3()
  139. {
  140. tot=; dfs2(,);
  141. for(int j=;j<=;j++)
  142. for(int i=;i<=n;i++)
  143. fa[i][j]=fa[fa[i][j-]][j-];
  144. read(k); int u,v,lca;
  145. for(int i=;i<k;i++)
  146. {
  147. read(u); read(v);
  148. lca=getlca(u,v);
  149. vis[u]|=<<i;
  150. for(int j=fa[u][];j!=lca;j=fa[j][]) vis[j]|=<<i;
  151. vis[v]|=<<i;
  152. for(int j=fa[v][];j!=lca;j=fa[j][])
  153. vis[j]|=<<i;
  154. vis[lca]|=<<i;
  155. }
  156. tot=(<<k)-;
  157. for(int i=;i<=n;i++)
  158. if(vis[i]==tot) { printf("1\n%d",i); return; }
  159. int s,g;
  160. int t1,t2,t3;
  161. if(k==)
  162. {
  163. bool ok=true;;
  164. for(int i=;i<=n;i++)
  165. {
  166. s=vis[i]; g=;
  167. while(s) g+=(s&),s/=;
  168. if(g!=) { ok=false; break; }
  169. if(vis[i]==) t1=i;
  170. else if(vis[i]==) t2=i;
  171. else t3=i;
  172. }
  173. if(ok)
  174. {
  175. printf("3\n%d %d %d",t1,t2,t3);
  176. return;
  177. }
  178. else
  179. {
  180. int d[];
  181. memset(d,,sizeof(d));
  182. for(int i=;i<=n;i++)
  183. {
  184. d[vis[i]]=i;
  185. if(d[tot^vis[i]])
  186. {
  187. printf("2\n%d %d",i,d[tot^vis[i]]);
  188. return;
  189. }
  190. }
  191. }
  192. }
  193. int r1=,r2=,p1;
  194. for(int i=;i<=n;i++)
  195. if(vis[i]!=r1 || vis[i]!=r2)
  196. {
  197. if(vis[i]!=r1) r1=vis[i],p1=i;
  198. else
  199. {
  200. printf("2\n%d %d",p1,i);
  201. return;
  202. }
  203. }
  204. }
  205.  
  206. void init()
  207. {
  208. read(n); read(m);
  209. int u,v;
  210. for(int i=;i<=m;i++)
  211. {
  212. read(u); read(v);
  213. add(u,v);
  214. in[u]++; in[v]++;
  215. E[i][]=u; E[i][]=v;
  216. }
  217. int sum=,fir;
  218. for(int i=;i<=n;i++) if(in[i]!=) sum++,fir=i;
  219. if(sum==) solve2(fir);
  220. else if(n<=) solve1();
  221. else if(k<=) solve3();
  222. }
  223.  
  224. int main()
  225. {
  226. freopen("ping11.in","r",stdin);
  227. // freopen("ping.out","w",stdout);
  228. init();
  229. }

60分暴力

满分做法:

将链上的做法搬到树上

对所有的询问,按他们的lca排序

然后从下到上处理树上的节点,若以当前节点为lca的测试站点还连通,就把当前节点破坏

dfs序+树链剖分维护即可

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4.  
  5. using namespace std;
  6.  
  7. #define N 100001
  8.  
  9. int n,m,p;
  10.  
  11. int cut[N*][],lca[N*];
  12.  
  13. int siz[N],fa[N][];
  14.  
  15. int cnt,id[N],bl[N];
  16.  
  17. int q[N*],lr[N][];
  18.  
  19. bool f[N<<];
  20.  
  21. int ans[N];
  22.  
  23. int front[N],nxt[N<<],to[N<<],tot;
  24.  
  25. void read(int &x)
  26. {
  27. x=; char c=getchar();
  28. while(!isdigit(c)) c=getchar();
  29. while(isdigit(c)) { x=x*+c-''; c=getchar(); }
  30. }
  31.  
  32. void add(int u,int v)
  33. {
  34. to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
  35. to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
  36. }
  37.  
  38. void init()
  39. {
  40. read(n); read(m);
  41. int u,v;
  42. for(int i=;i<=m;i++)
  43. {
  44. read(u); read(v);
  45. add(u,v);
  46. }
  47. read(p);
  48. for(int i=;i<=p;i++) read(cut[i][]),read(cut[i][]);
  49. }
  50.  
  51. void dfs1(int x,int y)
  52. {
  53. fa[x][]=y; siz[x]=;
  54. for(int i=front[x];i;i=nxt[i])
  55. if(to[i]!=y) dfs1(to[i],x),siz[x]+=siz[to[i]];
  56. }
  57.  
  58. void dfs2(int x,int top)
  59. {
  60. id[x]=++cnt;
  61. bl[x]=top;
  62. int y=;
  63. for(int i=front[x];i;i=nxt[i])
  64. if(to[i]!=fa[x][] && siz[to[i]]>siz[y]) y=to[i];
  65. if(!y) return;
  66. dfs2(y,top);
  67. for(int i=front[x];i;i=nxt[i])
  68. if(to[i]!=fa[x][] && to[i]!=y) dfs2(to[i],to[i]);
  69. }
  70.  
  71. void prelca()
  72. {
  73. for(int i=;i<=;i++)
  74. for(int j=;j<=n;j++)
  75. fa[j][i]=fa[fa[j][i-]][i-];
  76. }
  77.  
  78. int getlca(int u,int v)
  79. {
  80. if(u==v) return u;
  81. if(id[u]<id[v]) swap(u,v);
  82. for(int i=;i>=;i--)
  83. if(id[fa[u][i]]>id[v]) u=fa[u][i];
  84. return fa[u][];
  85. }
  86.  
  87. bool cmp(int a,int b)
  88. {
  89. return lca[a]<lca[b];
  90. }
  91.  
  92. void modify(int k,int l,int r,int pos)
  93. {
  94. f[k]=true;
  95. if(l==r) return;
  96. int mid=l+r>>;
  97. if(pos<=mid) modify(k<<,l,mid,pos);
  98. else modify(k<<|,mid+,r,pos);
  99. }
  100.  
  101. bool query(int k,int l,int r,int opl,int opr)
  102. {
  103. if(l==opl && r==opr) return f[k];
  104. int mid=l+r>>;
  105. if(opr<=mid) return query(k<<,l,mid,opl,opr);
  106. if(opl>mid) return query(k<<|,mid+,r,opl,opr);
  107. return query(k<<,l,mid,opl,mid)|query(k<<|,mid+,r,mid+,opr);
  108. }
  109.  
  110. bool QUERY(int u,int v)
  111. {
  112. while(bl[u]!=bl[v])
  113. {
  114. if(id[u]<id[v]) swap(u,v);
  115. if(query(,,cnt,id[bl[u]],id[u])) return true;
  116. u=fa[bl[u]][];
  117. }
  118. return query(,,cnt,min(id[v],id[u]),max(id[v],id[u])) ;
  119. }
  120.  
  121. void work(int x)
  122. {
  123. for(int i=front[x];i;i=nxt[i])
  124. if(to[i]!=fa[x][]) work(to[i]);
  125. for(int i=lr[x][];i<=lr[x][];i++)
  126. if(!QUERY(cut[q[i]][],cut[q[i]][]))
  127. {
  128. modify(,,cnt,id[x]);
  129. ans[++ans[]]=x;
  130. return;
  131. }
  132. }
  133.  
  134. void solve()
  135. {
  136. for(int i=;i<=p;i++) lca[i]=getlca(cut[i][],cut[i][]),q[i]=i;
  137. sort(q+,q+p+,cmp);
  138. for(int i=;i<=n;i++) lr[i][]=p+,lr[i][]=;
  139. for(int i=;i<=p;i++)
  140. {
  141. lr[lca[q[i]]][]=min(lr[lca[q[i]]][],i);
  142. lr[lca[q[i]]][]=max(lr[lca[q[i]]][],i);
  143. }
  144. work();
  145. printf("%d\n",ans[]);
  146. for(int i=;i<=ans[];i++) printf("%d ",ans[i]);
  147. }
  148.  
  149. int main()
  150. {
  151. freopen("ping.in","r",stdin);
  152. freopen("ping.out","w",stdout);
  153. init();
  154. dfs1(,);
  155. dfs2(,);
  156. prelca();
  157. solve();
  158. }

2017 国庆湖南 Day3的更多相关文章

  1. 2017 国庆湖南 Day5

    期望得分:76+80+30=186 实际得分:72+10+0=82 先看第一问: 本题不是求方案数,所以我们不关心 选的数是什么以及的选的顺序 只关心选了某个数后,对当前gcd的影响 预处理 cnt[ ...

  2. 2017 国庆湖南 Day6

    期望得分:100+100+60=260 实际得分:100+85+0=185 二分最后一条相交线段的位置 #include<cstdio> #include<iostream> ...

  3. 2017 国庆湖南 Day1

    卡特兰数 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ] ...

  4. 2017 国庆湖南 Day4

    期望得分:20+40+100=160 实际得分:20+20+100=140 破题关键: f(i)=i 证明:设[1,i]中与i互质的数分别为a1,a2……aφ(i) 那么 i-a1,i-a2,…… i ...

  5. 2017 国庆湖南Day2

    期望得分:100+30+100=230 实际得分:100+30+70=200 T3 数组开小了 ..... 记录 1的前缀和,0的后缀和 枚举第一个1的出现位置 #include<cstdio& ...

  6. 学大伟业 2017 国庆 Day1

    期望得分:100+100+20=220 实际得分:100+100+20=220 (好久没有期望==实际了 ,~\(≧▽≦)/~) 对于 a........a 如果 第1个a 后面出现的第1个b~z 是 ...

  7. 2017国庆 清北学堂 北京综合强化班 Day1

    期望得分:60+ +0=60+ 实际得分:30+56+0=86 时间规划极端不合理,T2忘了叉积计算,用解析几何算,还有的情况很难处理,浪费太多时间,最后gg 导致T3只剩50分钟,20分钟写完代码, ...

  8. 长乐国庆集训Day3

    T1 动态逆序对 题目 [题目描述] 给出一个长度为n的排列a(1~n这n个数在数列中各出现1次).每次交换两个数,求逆序对数%2的结果. 逆序对:对于两个数a[i],a[j](i<j),若a[ ...

  9. 2017.10.1 国庆清北 D1T1 zhx的字符串题

    题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...

随机推荐

  1. 20135208 JAVA第四次实验

    课程:Java程序与设计     班级:1352 姓名:贺邦 小组成员: 20135212池彬宁 20135208贺邦 学号:20135208 成绩:             指导教师:娄嘉鹏     ...

  2. qq浏览器的用户体验

    用户界面: qq浏览器的用户界面简介,把一些不必要的东西去点,可以很容易让用户找到自己想看的网页,很方便. 记住用户的选择: qq浏览器和QQ相连,可是用QQ账户登录,并且会记住自己访问的高频网页,以 ...

  3. Unicode和UTF-8

    作者:于洋链接:https://www.zhihu.com/question/23374078/answer/69732605来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  4. 团队Alpha冲刺(一)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内 ...

  5. HttpWebRequest下载文件,乱码问题解决方案

    写在前面 今天之所以会总结HttpWebRequest下载文件,主要是因为在使用该类下载文件的时候,有些地方需要注意一下,在实际的项目中遇到过这种问题,觉得还是有必要总结一下的.在下载文件时,最常见的 ...

  6. window redis php(必须版本>=5.4) 安装

    1.下载redis的win版客户端 下载地址: http://code.google.com/p/servicestack/wiki/RedisWindowsDownload 2.选择32bit,64 ...

  7. react-router之代码分离

    概念 无需用户下载整个应用之后才能访问访问它.即边访问边下载.因此我们设计一个组件<Bundle>当用户导航到它是来动态加载组件. import loadSomething from 'b ...

  8. python脚本批量生成50000条插入数据的sql语句

    f = open("xx.txt",'w') for i in range(1,50001): str_i = str(i) realname = "lxs"+ ...

  9. HDU4043_FXTZ II

    题目描述的意思就不说了,自己考虑的时候就是在所有的排列中,碰到大于前面最大的出现数字的时候就乘以一个二分之一,然后求和. 打表后就会发现,答案分子为1*3*5*……*(2*n-1):分母为2*4*6* ...

  10. HDU2486_A simple stone game

    这个题目是这样的,一堆石子有n个,首先第一个人开始可以去1-(n-1)个,接下来两人轮流取石子,每个人可取的石子数必须是一个不超过上一次被取的石子的K倍的整数. 现在求对于一堆数量为n的石子是否为必胜 ...