记得去年这个时候,大概刚接触OI。没想到时间这么快,第一次2017NOIP之旅已经结束。初测成绩出来了,100+100+95+50=345,有浙江三十几名(@Cptraser 机房370大佬)。总体感觉还可以吧,也发挥的不错。但有些地方还是有点可惜。学校里的学长(@Cptraser)让我开个博客,我也想谨以此记录一下自己的点滴吧。

  贴的都是比赛时的原码

T1 太搞笑的一题,虽然有很多人因为精度爆60(还好手动整数除)

CODE

  1. #include<cstdio>
  2. using namespace std;
  3. int a,b,c;
  4. int main()
  5. {
  6. freopen("score.in","r",stdin); freopen("score.out","w",stdout);
  7. scanf("%d%d%d",&a,&b,&c);
  8. printf("%d",a/+b*/+c/);
  9. return ;
  10. }

T2 感觉今年PJ前两题今年来算是最水的吧,刚开始想打字符串的,后来仔细一想%%%一下就水了

CODE

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. inline void read(int &x)
  5. {
  6. x=; char ch=getchar();
  7. while (ch<''||ch>'') ch=getchar();
  8. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  9. }
  10. const int N=;
  11. int n,q,i,j,x,s[N],w;
  12. inline int Pow_10(int k)
  13. {
  14. int tot=;
  15. for (int i=;i<=k;++i)
  16. tot*=;
  17. return tot;
  18. }
  19. int main()
  20. {
  21. freopen("librarian.in","r",stdin); freopen("librarian.out","w",stdout);
  22. read(n); read(q);
  23. for (i=;i<=n;++i)
  24. read(s[i]);
  25. sort(s+,s+n+);
  26. for (i=;i<=q;++i)
  27. {
  28. bool flag=;
  29. read(w); read(x);
  30. for (j=;j<=n;++j)
  31. if (s[j]%Pow_10(w)==x) { printf("%d\n",s[j]); flag=; break; }
  32. if (!flag) puts("-1");
  33. }
  34. return ;
  35. }

T3 从T3开始难度就有提升。BFS很简单;SPFA很简单; 然而我考试时都没想到,对着一个记搜调了2个半小时,导致我T4最后想到了单调队列优化然后没时间了

先贴比赛CODE(158行)

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. inline void read(int &x)
  5. {
  6. x=; char ch=getchar();
  7. while (ch<''||ch>'') ch=getchar();
  8. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  9. }
  10. const int M=,fx[]={,,,-},fy[]={,,-,},INF=1e9;
  11. int map[M][M],n,m,i,j,x,y,z,ans=1e9,f[M][M][],vis[M][M];
  12. inline int min(int a,int b) { return a<b?a:b; }
  13. void dfs(int x,int y)
  14. {
  15. bool flag=;
  16. if (map[x][y]==) flag=;
  17. for (int i=;i<;++i)
  18. {
  19. int xx=fx[i]+x,yy=fy[i]+y;
  20. if (xx>&&xx<=m&&yy>&&yy<=m&&vis[xx][yy])
  21. {
  22. if (map[xx][yy])
  23. {
  24. if (f[xx][yy][]!=INF)
  25. {
  26. if (flag)
  27. {
  28. int add;
  29. if (map[xx][yy]==) add=; else add=;
  30. f[x][y][]=min(f[x][y][],f[xx][yy][]+add+);
  31. if (map[xx][yy]==) add=; else add=;
  32. f[x][y][]=min(f[x][y][],f[xx][yy][]+add+);
  33. } else
  34. {
  35. int add;
  36. if (map[x][y]==map[xx][yy]) add=; else add=;
  37. f[x][y][]=min(f[x][y][],f[xx][yy][]+add);
  38. }
  39. } else
  40. {
  41. vis[xx][yy]=;
  42. dfs(xx,yy);
  43. vis[xx][yy]=;
  44. if (flag)
  45. {
  46. int add;
  47. if (map[xx][yy]==) add=; else add=;
  48. f[x][y][]=min(f[x][y][],f[xx][yy][]+add+);
  49. if (map[xx][yy]==) add=; else add=;
  50. f[x][y][]=min(f[x][y][],f[xx][yy][]+add+);
  51. } else
  52. {
  53. int add;
  54. if (map[x][y]==map[xx][yy]) add=; else add=;
  55. f[x][y][]=min(f[x][y][],f[xx][yy][]+add);
  56. }
  57. }
  58. } else
  59. {
  60. if (f[xx][yy][]!=INF&&f[xx][yy][]!=INF)
  61. {
  62. if (!flag)
  63. {
  64. int add;
  65. if (map[x][y]==) add=; else add=;
  66. f[x][y][]=min(f[x][y][],f[xx][yy][]+add);
  67. if (map[x][y]==) add=; else add=;
  68. f[x][y][]=min(f[x][y][],f[xx][yy][]+add);
  69. }
  70. } else
  71. {
  72. if (!flag)
  73. {
  74. vis[xx][yy]=;
  75. dfs(xx,yy);
  76. vis[xx][yy]=;
  77. int add;
  78. if (map[x][y]==) add=; else add=;
  79. f[x][y][]=min(f[x][y][],f[xx][yy][]+add);
  80. if (map[x][y]==) add=; else add=;
  81. f[x][y][]=min(f[x][y][],f[xx][yy][]+add);
  82. }
  83. }
  84. }
  85. }
  86. }
  87. }
  88. void xz()
  89. {
  90. for (int i=;i<=m;++i)
  91. for (int j=;j<=m;++j)
  92. {
  93. if (map[i][j])
  94. {
  95. for (int k=;k<;++k)
  96. {
  97. int x=fx[k]+i,y=fy[k]+j;
  98. if (x>&&x<=m&&y>&&y<=m)
  99. {
  100. if (map[x][y])
  101. {
  102. int add;
  103. if (map[x][y]==map[i][j]) add=; else add=;
  104. f[i][j][]=min(f[i][j][],f[x][y][]+add);
  105. } else
  106. {
  107. int add;
  108. if (map[i][j]==) add=; else add=;
  109. f[i][j][]=min(f[i][j][],f[x][y][]+add);
  110. if (map[i][j]==) add=; else add=;
  111. f[i][j][]=min(f[i][j][],f[x][y][]+add);
  112. }
  113. }
  114. }
  115. } else
  116. {
  117. for (int k=;k<;++k)
  118. {
  119. int x=fx[k]+i,y=fy[k]+j;
  120. if (x>&&x<=m&&y>&&y<=m)
  121. {
  122. if (map[x][y])
  123. {
  124. int add;
  125. if (map[x][y]==) add=; else add=;
  126. f[i][j][]=min(f[i][j][],f[x][y][]+add+);
  127. if (map[x][y]==) add=; else add=;
  128. f[i][j][]=min(f[i][j][],f[x][y][]+add+);
  129. }
  130. }
  131. }
  132. }
  133. }
  134. }
  135. int main()
  136. {
  137. freopen("chess.in","r",stdin); freopen("chess.out","w",stdout);
  138. memset(map,,sizeof(map));
  139. memset(vis,true,sizeof(vis));
  140. read(m); read(n);
  141. for (i=;i<=m;++i)
  142. for (j=;j<=m;++j)
  143. f[i][j][]=f[i][j][]=f[i][j][]=INF;
  144. f[][][]=;
  145. for (i=;i<=n;++i)
  146. {
  147. read(x); read(y); read(z);
  148. map[x][y]=z+;
  149. }
  150. vis[m][m]=;
  151. dfs(m,m);
  152. xz();
  153. bool flag=;
  154. if (map[m][m]==) flag=;
  155. if (flag) { if (min(f[m][m][],f[m][m][])==INF) puts("-1"); else printf("%d",min(f[m][m][],f[m][m][])); }
  156. else { if (f[m][m][]==INF) puts("-1"); else printf("%d",f[m][m][]); }
  157. return ;
  158. }

上面的dfs其实在搞笑,真正得(骗)了95分的是那个最后10分钟加上去的xz(),%%%%%%

回来后仔细想了想,打了个SPFA,就是建边的过程有点烦

对于每个有颜色的点

距离为1的有颜色的点颜色相同连1条0的边;颜色不同连一条1的边;

距离为2的有颜色的点颜色相同连1条2的边;颜色不同连一条3的边;

最后对于(m,m)有无颜色的问题特判一下就过了,代码量明显减少

CODE

  1. #include<cstdio>
  2. #include<vector>
  3. #include<cstring>
  4. using namespace std;
  5. const int fx1[]={,,,-},fy1[]={,,-,},fx2[]={,,-,,-,-,,},fy2[]={-,,,,-,,-,};
  6. const int M=;
  7. int map[M][M],INF,father[M*M+],i,x,y,z,n,m,j,dis[M*M+],q[M*M*+],f[M*M+],head,tail;
  8. vector <int> a[M*M+],l[M*M+];
  9. inline void read(int &x)
  10. {
  11. x=; char ch=getchar();
  12. while (ch<''||ch>'') ch=getchar();
  13. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  14. }
  15. void build(int x,int y)
  16. {
  17. for (int i=;i<;++i)
  18. {
  19. int xx=x+fx1[i],yy=y+fy1[i];
  20. if (map[xx][yy]!=INF&&xx>&&yy>&&xx<=m&&yy<=m)
  21. a[(x-)*m+y].push_back((xx-)*m+yy),l[(x-)*m+y].push_back(map[x][y]!=map[xx][yy]);
  22. }
  23. for (int i=;i<;++i)
  24. {
  25. int xx=x+fx2[i],yy=y+fy2[i];
  26. if (map[xx][yy]!=INF&&xx>&&yy>&&xx<=m&&yy<=m)
  27. a[(x-)*m+y].push_back((xx-)*m+yy),l[(x-)*m+y].push_back(map[x][y]==map[xx][yy]?:);
  28. }
  29. }
  30. int main()
  31. {
  32. freopen("chess.in","r",stdin); freopen("chess.out","w",stdout);
  33. read(m); read(n);
  34. memset(map,,sizeof(map));
  35. memset(dis,,sizeof(dis));
  36. for (i=;i<=n;++i)
  37. {
  38. read(x); read(y); read(z);
  39. map[x][y]=z;
  40. }
  41. INF=map[][];
  42. for (i=;i<=m;++i)
  43. for (j=;j<=m;++j)
  44. if (map[i][j]!=INF) build(i,j);
  45. dis[]=; q[]=; f[]=;
  46. head=; tail=;
  47. while (head<tail)
  48. {
  49. int now=q[++head];
  50. f[now]=;
  51. for (i=;i<a[now].size();++i)
  52. {
  53. int k=a[now][i];
  54. if (dis[k]>dis[now]+l[now][i])
  55. {
  56. dis[k]=dis[now]+l[now][i];
  57. if (!f[k])
  58. {
  59. q[++tail]=k;
  60. f[k]=;
  61. }
  62. }
  63. }
  64. }
  65. if (map[m][m]==INF)
  66. {
  67. if (map[m][m-]!=INF) dis[m*m]=min(dis[m*m],dis[m*m-]+);
  68. if (map[m-][m]!=INF) dis[m*m]=min(dis[m*m],dis[m*m-m]+);
  69. }
  70. if (dis[m*m]==INF) puts("-1"); else printf("%d",dis[m*m]);
  71. return ;
  72. }

T4 谨记机房大佬(@Cptraser)的教诲,NOIP已经很久很久没有考MST了。然而今年,一如既往的没考。

最后一题 看一眼 二分答案,check()

          再一看 二维DP也许能行 20分钟打好

然后优化第三题去了 然后再也没有回来

比赛CODE

  1. #include<cstdio>
  2. #include<cstring>
  3. typedef long long LL;
  4. using namespace std;
  5. inline void read(LL &x)
  6. {
  7. x=; char ch=getchar(); LL flag=;
  8. while (ch<''||ch>'') { if (ch=='-') flag=-; ch=getchar(); }
  9. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  10. x*=flag;
  11. }
  12. const LL N=;
  13. struct data
  14. {
  15. LL x,w;
  16. }a[N];
  17. LL n,d,k,i,j,ans=-,sum=,f[N];
  18. inline LL max(LL a,LL b) { return a>b?a:b; }
  19. bool check(LL x)
  20. {
  21. LL left=x<d?d-x:,right=d+x;
  22. for (i=;i<=n;++i)
  23. f[i]=-1e9;
  24. for (i=;i<=n;++i)
  25. for (j=;j<i;++j)
  26. if (a[i].x-a[j].x>=left&&a[i].x-a[j].x<=right)
  27. {
  28. f[i]=max(f[i],f[j]+a[i].w);
  29. if (f[i]>=k) return ;
  30. }
  31. return ;
  32. }
  33. int main()
  34. {
  35. freopen("jump.in","r",stdin); freopen("jump.out","w",stdout);
  36. read(n); read(d); read(k);
  37. for (i=;i<=n;++i)
  38. read(a[i].x),read(a[i].w),sum+=a[i].w>?a[i].w:;
  39. if (sum<k) { puts("-1"); return ; }
  40. if (d==)
  41. {
  42. sum=;
  43. for (i=;i<=n;++i)
  44. {
  45. sum+=a[i].w;
  46. if (sum>=k) { puts(""); return ; }
  47. }
  48. }
  49. a[].x=a[].w=;
  50. LL l=,r=a[n].x;
  51. while (l<=r)
  52. {
  53. LL mid=(l+r)>>;
  54. if (check(mid)) ans=mid,r=mid-; else l=mid+;
  55. }
  56. printf("%lld",ans);
  57. return ;
  58. }

那个 d==1 的特判其实是在搞笑

     单调队列的优化还是很好想的

在距离内的加入,距离外的弹出,为了取最大最优值只需要保持队列单调递减即可。

     借鉴了洛谷一名大佬的思路

CODE

  1. #include<cstdio>
  2. #include<cstring>
  3. typedef long long LL;
  4. using namespace std;
  5. inline void read(LL &x)
  6. {
  7. x=; char ch=getchar(); LL flag=;
  8. while (ch<''||ch>'') { if (ch=='-') flag=-; ch=getchar(); }
  9. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  10. x*=flag;
  11. }
  12. const LL N=;
  13. struct data
  14. {
  15. LL x,w;
  16. }a[N];
  17. struct dl
  18. {
  19. LL x,s;
  20. }q[N*+];
  21. LL n,d,k,i,j,ans=-,sum=,f[N],head,tail,now;
  22. inline LL max(LL a,LL b) { return a>b?a:b; }
  23. bool check(LL x)
  24. {
  25. LL left=x<d?d-x:,right=d+x;
  26. for (i=;i<=n;++i)
  27. f[i]=-1e9;
  28. q[].x=q[].s=; head=; tail=-; now=;
  29. for (i=;i<=n;++i)
  30. {
  31. for (now;(a[now].x<=a[i].x-left)&&(now<i);++now)
  32. {
  33. while (head<=tail&&q[tail].s<f[now]) --tail;
  34. if (f[now]==-1e9) continue;
  35. q[++tail].x=a[now].x; q[tail].s=f[now];
  36. }
  37. while (head<=tail&&a[i].x-q[head].x>right) head++;
  38. if (head<=tail) f[i]=q[head].s+a[i].w;
  39. if (f[i]>=k) return ;
  40. }
  41. return ;
  42. }
  43. int main()
  44. {
  45. freopen("jump.in","r",stdin); freopen("jump.out","w",stdout);
  46. read(n); read(d); read(k);
  47. for (i=;i<=n;++i)
  48. read(a[i].x),read(a[i].w),sum+=a[i].w>?a[i].w:;
  49. if (sum<k) { puts("-1"); return ; }
  50. /*if (d==1)
  51. {
  52. sum=0;
  53. for (i=1;i<=n;++i)
  54. {
  55. sum+=a[i].w;
  56. if (sum>=k) { puts("0"); return 0; }
  57. }
  58. }*/
  59. a[].x=a[].w=;
  60. LL l=,r=a[n].x;
  61. while (l<=r)
  62. {
  63. LL mid=(l+r)>>;
  64. if (check(mid)) ans=mid,r=mid-; else l=mid+;
  65. }
  66. printf("%lld",ans);
  67. return ;
  68. }

  暑假才P->C,代码有点chou

  其实今年的O气真的很足,第三题水了95

  感觉今年总体难度比去年低吧,但浙江的分数线才280(据说)……

  有点小兴奋吧,毕竟一年的付出没有白费

  明年再接再厉,准备下提高吧

  顺便宣传下大佬的博客(@Cptraser)http://www.cnblogs.com/Cptraser/

2017NOIP游记的更多相关文章

  1. 2017NOIP游记 (格式有点炸)

    NOIP游记 作者:一只小蒟蒻 时间可真快呀!还记得我第一次接触信息竞赛时,hello world都要调好久,不知不觉就考完了2017noip,自我感觉良好(虽然还是有很多不足). 这两个月的闭关,让 ...

  2. 2017Noip普及组游记

    Day0 一天都基本在休息,早上信心赛,大家都是400整. 下午一群人窝在教室里打三国杀. Day1:Before Contest 早上大约十点到了试场,在考提高组,不能进. 喝了一杯咖啡去除早起的身 ...

  3. 2017NOIP初赛游记

    前天晚上,玩三国杀,玩到了昨天凌晨2点40多分吧,我觉得初赛要爆炸了, 不得不吐槽一下,三国杀的武将太少了. 昨天是初赛的日子,上午8点多来了后看了看阅读程序和程序填空,复习了以下理论知识和wsj 然 ...

  4. 【20161203-20161208】清华集训2016滚粗记&&酱油记&&游记

    先挖坑(这个blog怎么变成游记专用了--) 已更完 #include <cstdio> using namespace std; int main(){ puts("转载请注明 ...

  5. 【20160722-20160728】NOI2016滚粗记&&酱油记&&游记

    先挖坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.c ...

  6. NOIp2016 游记

    DAY -2 不要问我为什么现在就开了一篇博客. 本来想起个NOIp2016爆零记或者NOIp2016退役记之类的,但是感觉现在不能乱立flag了.所以就叫游记算了. 前几场模拟赛崩了一场又一场,RP ...

  7. NOIP2016游记

    只是游记而已.流水账. Day0:忘了. Day1:看完T1,本以为T2一如既往很简单,结果看了半天完全没有思路.然后看了一眼T3,期望,NOIP什么时候要考期望了,于是接着看T2.一开始我推的限制条 ...

  8. CTSC2016&&APIO2016滚粗记&&酱油记&&游记<del>(持续更新)</del>

    挖一波坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs. ...

  9. 游记——noip2016

    2016.11.18 (day 0) 呆在家. 悠闲地呆在家.. 明后天可能出现的错误: 1)没打freopen.打了ctime: 2)对拍程序忘记怎么写了...忘记随机化种子怎么写了: 3)不知道厕 ...

随机推荐

  1. Linux 学习笔记之超详细基础linux命令 Part 10

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 9----------------- ...

  2. Linux笔记(二): WIN 10 Ubuntu 双系统

    (一)  说明 记录一次ubuntu安装过程及遇到的问题. 环境:WIN 10 单硬盘 (二)  ubuntu ISO文件下载 ubuntu 18.04 https://www.ubuntu.com/ ...

  3. 【Python】keras使用Lenet5识别mnist

    原始论文中的网络结构如下图: keras生成的网络结构如下图: 代码如下: import numpy as np from keras.preprocessing import image from ...

  4. ionic入门

    ionic安装 Ionic开发是依赖于Nodejs环境的,所以在开发之前我们需要安装好Nodejs.下载安装:http://nodejs.org/安装完成之后打开PowerShell输入命令node ...

  5. 谷歌浏览器javascript错误提示插件

    JavaScript-Errors-Notifier_v2.1.7 下载地址 安装方法: http://chromecj.com/utilities/2014-09/181.html 设置方式:

  6. 转:SQL Server - 使用 Merge 语句实现表数据之间的对比同步

    表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等.包括在 SSIS Package 中也可以通过 Lookup ...

  7. C#中的console类输入输出功能

    Console.WriteLine() 直接将括号内内容显示在控制台界面中(相当于C语言printf()吧) Console.ReadLine()获取控制台用户自己输入的内容(功能和C语言scanf( ...

  8. 4.92Python数据类型之(7)字典

    目录 目录 前言 (一)字典的基本知识 ==1.字典的基本格式== (二)字典的操作 ==1.字典元素的增加== ==2.字典值的查找== ==3.字典的修改== ==4.字典的删除== ==5.字典 ...

  9. python之列表的常用操作

    Python list 常用方法总结   一,创建列表  只要把逗号分隔的不同的数据项使用方括号([ ])括起来即可 下标(角标,索引)从0开始,最后一个元素的下标可以写-1 list  =  ['1 ...

  10. Hadoop2.7.6_04_HDFS的Shell操作与常见问题

    1. HDFS的shell操作 1.1. 支持的命令及参数 [yun@mini05 zhangliang]$ hadoop fs Usage: hadoop fs [generic options] ...