\(n\)天没更博了,因为被膜你赛的毒瘤题虐哭了。。。

既然打了这次CF还是纪念一下。

看看NOIP之前,接下来几场的时间都不好。这应该是最后一场CF了,差\(4\)分上紫也是一个遗憾吧。

A

给一个矩形,每次从外面剥掉一圈,按剥去次序的奇偶分开,问最前\(k\)个奇数圈的总面积。

普及组题,直接模拟。

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define RG register
  4. #define R RG int
  5. using namespace std;
  6. int main(){
  7. LL w,h,k,ans=0;
  8. cin>>w>>h>>k;
  9. while(k--){
  10. ans+=2*(w+h-2);
  11. w-=4;h-=4;
  12. }
  13. cout<<ans<<endl;
  14. return 0;
  15. }

B

给两个长度为\(n\)的序列\(\{a\},\{b\}\),构造一个长度为\(n\)的序列\(\{t\}\)使得\(t_i|t_{i+1}=a_i,t_i\&t_{i+1}=b_i\)。

一看到题就想着乱搞,找到一个合法的就直接构造。

不想DFS了,因为感觉如果直接构造WA了的话DFS不是也会TLE么?

然后就过了。。。

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define RG register
  4. #define R RG int
  5. using namespace std;
  6. const int N=100009;
  7. int n,a[N],b[N],t[N];
  8. bool check(){
  9. for(R i=0;i<n-1;++i){
  10. for(t[i+1]=0;t[i+1]<4;++t[i+1])
  11. if((t[i]|t[i+1])==a[i]&&(t[i]&t[i+1])==b[i])break;
  12. if(t[i+1]==4)return 0;
  13. }
  14. return 1;
  15. }
  16. int main(){
  17. ios::sync_with_stdio(0);
  18. cin>>n;
  19. for(R i=0;i<n-1;++i)cin>>a[i];
  20. for(R i=0;i<n-1;++i)cin>>b[i];
  21. for(t[0]=0;t[0]<4;++t[0])
  22. if(check()){
  23. puts("YES");
  24. for(R i=0;i<n;++i)printf("%d ",t[i]);
  25. return puts(""),0;
  26. }
  27. puts("NO");
  28. return 0;
  29. }

C

给定正整数\(a,b\),找到最大的正整数\(s\),要求所有\(1-s\)的数能被分成两组,第一组的和\(\le a\),第二组的和\(\le b\)。

又是乱搞。。。

首先\(s\)有个上限,\(\frac{s(s+1)}2\le a+b\)。然后\(s\)取到上限的时候一定可以构造?

然后把数从大往小丢进\(a\)里,能丢就丢。剩下的就给\(b\)了。

然后因为\(s\)的极限值估计错了数组开小RE一发。然后就过了。如果这里少罚点时应该也能上紫了。

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define RG register
  4. #define R RG int
  5. using namespace std;
  6. bool f[70000];
  7. int main(){
  8. RG LL a,b,s,p=0;
  9. cin>>a>>b;
  10. s=(sqrt(8*(a+b)+1)-1)/2.0;
  11. for(R i=s;i;--i)
  12. if(a>=i)a-=i,f[i]=1,++p;
  13. cout<<p<<endl;
  14. for(R i=1;i<=s;++i)if( f[i])printf("%d ",i);puts("");
  15. cout<<s-p<<endl;
  16. for(R i=1;i<=s;++i)if(!f[i])printf("%d ",i);puts("");
  17. return 0;
  18. }

D

给一个\(n*n\)的字母方阵,可以把\(k\)个字母改成a,求字典序最小的从\((1,1)\)到\((n,n)\)的路径。

首先,把路径最前面不是a的换成a显然更优。那么如果\((1,1)\)到某个位置的路径上最多有不超过\(k\)个字母不为a,这个位置可以而且必须改成a。\(O(n^2)\)暴力处理一下就好了。

接着直接开始找。字典序最小怎么办?一开始我这个菜鸡脑袋短路了,问了下神仙\(\text{yyb}\),“不就是按副对角线转移么?”,瞬间懂了。。。

找字典序最小肯定要在相同长度的情况下贪心。而以同一条副对角线结尾的路径长度当然相同啦!每次字典序最小的都是一个集合,直接用这个集合的所有后继找到下一长度的字典序最小的集合。

调了半天,只是因为最小后继初始化的时候放错了位置。。。后面就没时间杠E了。如果这里少罚点时应该也能上紫了。

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define RG register
  4. #define R RG int
  5. using namespace std;
  6. const int N=2009;
  7. char s[N][N],ans[N];
  8. int f[N][N],X[2][N],Y[2][N];
  9. bool pr[N][N],vis[N][N];
  10. inline void chkmn(R&x,R y){if(x>y)x=y;}
  11. int main(){
  12. R n,k;
  13. RG char mn;
  14. cin>>n>>k;
  15. for(R i=1;i<=n;++i)cin>>(s[i]+1);
  16. for(R i=1;i<=n;++i)
  17. for(R j=1;j<=n;++j){
  18. f[i][j]=(i==1&&j==1?0:3*N);
  19. if(i!=1)chkmn(f[i][j],f[i-1][j]);
  20. if(j!=1)chkmn(f[i][j],f[i][j-1]);
  21. f[i][j]+=s[i][j]!='a';
  22. if(f[i][j]<=k)s[i][j]='a';
  23. }
  24. R*x1=X[0],*x2=X[1],*y1=Y[0],*y2=Y[1],p1=1,p2=0,x,y;
  25. x1[1]=y1[1]=1;
  26. for(R i=1;i<=2*n;++i){
  27. mn=127;
  28. for(;p1;--p1){
  29. x=x1[p1];y=y1[p1];
  30. if(x<n&&!vis[x+1][y]&&mn>=s[x+1][y]){
  31. if(mn>s[x+1][y])mn=s[x+1][y],p2=1;
  32. else ++p2;
  33. vis[x2[p2]=x+1][y2[p2]=y]=1;
  34. }
  35. if(y<n&&!vis[x][y+1]&&mn>=s[x][y+1]){
  36. if(mn>s[x][y+1])mn=s[x][y+1],p2=1;
  37. else ++p2;
  38. vis[x2[p2]=x][y2[p2]=y+1]=pr[x][y+1]=1;
  39. }
  40. }
  41. swap(x1,x2);swap(y1,y2);swap(p1,p2);
  42. }
  43. for(x=n,y=n;x!=1||y!=1;pr[x][y]?--y:--x)
  44. ans[x+y-2]=s[x][y];
  45. ans[0]=s[1][1];
  46. puts(ans);
  47. return 0;
  48. }

E

给一个\(01\)序列,每次可以翻转\(x,y,z\)三个位置的数位(假设\(x<y<z\),那么需满足\(y-x=z-y\) ),构造总次数不超过\(\lfloor\frac n 3\rfloor+12\)的操作序列使原序列全变成\(0\)。

赛场上以为要想fstqwq的星空那题一样异或差分还差分什么的。然后就结束了。

晚上发现了一个有用的思路:从后往前做,第\(i\)位碰到\(1\)就做一次\((i-2,i-1,i)\)的操作,最后只会剩下前\(3\)位,这时候如果还不能直接消掉,就是剩下一个或者两个\(1\),而剩两个\(1\)又可以直接转化成剩一个\(1\)。

手动模拟,假如只有第一位一个\(1\),可以通过\((1,4,7)(3,5,7)(3,4,5)\)把它消掉。这个\(1\)在第二位、第三位也是一样。那也就是说,如果序列长度大于等于\(9\),则一定有解:小于\(9\)有没有解?直接状压暴搜都够了。

现在问题在于怎样减少操作次数。既然是\(\frac n 3\),我们自然会想,可不可以只用一次操作就使最后\(3\)位都归零呢?有一个特例\(011\),尝试失败了。接着,我们只好尝试可不可以只用两次操作使最后\(6\)位归零。经过手动模拟(状态\(2^6\),慎用)、打表暴枚之后,我们可以证明尝试成功了。

然后就用打出来的表一个个归零啊,等到序列长度小于\(12\)的时候,直接开状压BFS暴搜。

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define RG register
  4. #define R RG int
  5. using namespace std;
  6. const int N=1e5+9,M=99,Q=2099;
  7. int a[N],ax[N],c[M],d[M],id1[M],id2[M],q[Q],dis[Q],pr[Q];
  8. int main(){
  9. R n,p=0,ans=0,x,y;
  10. cin>>n;
  11. for(R i=1;i<=n;++i)cin>>a[i];
  12. for(R i=0;i<6;++i)
  13. for(R j=1;i-2*j>=-6;++j){
  14. c[++p]=i;d[p]=j;
  15. x=1<<i;x|=(x>>j)|(x>>2*j);
  16. if(!id1[x])id1[x]=p;
  17. }
  18. for(R i=1;i<=p;++i)
  19. for(R j=1;j<=p;++j){
  20. x=1<<c[i];x|=(x>>d[i])|(x>>2*d[i]);
  21. y=1<<c[j];y|=(y>>d[j])|(y>>2*d[j]);
  22. if(!id1[x^=y])id1[x]=i,id2[x]=j;
  23. }
  24. id1[0]=id2[0]=0;
  25. for(R i=n-5;i>6;i-=6){
  26. x=0;for(R j=i+5;j>=i;--j)(x<<=1)|=a[j];
  27. ax[i]=x;
  28. if(id1[x]){
  29. R j=i+c[id1[x]],nd=d[id1[x]];
  30. a[j-2*nd]^=1;a[j-nd]^=1;a[j]^=1;++ans;
  31. }
  32. if(id2[x]){
  33. R j=i+c[id2[x]],nd=d[id2[x]];
  34. a[j-2*nd]^=1;a[j-nd]^=1;a[j]^=1;++ans;
  35. }
  36. }
  37. R S=1<<(p=min(n,11));
  38. memset(dis,-1,4*S);
  39. x=0;for(R j=p;j;--j)(x<<=1)|=a[j];
  40. dis[q[0]=x]=0;
  41. for(R h=0,t=0;h<=t;++h){
  42. R x=q[h];if(!x)break;
  43. for(R i=2;i<p;++i)
  44. for(R j=i>>1;j;--j){
  45. y=x^(1<<(i-2*j))^(1<<(i-j))^(1<<i);
  46. if(!~dis[y])dis[q[++t]=y]=dis[pr[y]=x]+1;
  47. }
  48. }
  49. if(!~dis[0])return puts("NO"),0;
  50. printf("YES\n%d\n",ans+dis[0]);
  51. for(x=0;pr[x];x=pr[x]){
  52. R t=0;
  53. for(y=x^pr[x];~y&1;y>>=1,++t);printf("%d ",++t);
  54. for(y>>=1 ;~y&1;y>>=1,++t);printf("%d ",++t);
  55. for(y>>=1 ;~y&1;y>>=1,++t);printf("%d\n",++t);
  56. }
  57. for(R i=n-5;i>6;i-=6){
  58. x=ax[i];
  59. if(id1[x]){
  60. R j=i+c[id1[x]],nd=d[id1[x]];
  61. printf("%d %d %d\n",j-2*nd,j-nd,j);
  62. }
  63. if(id2[x]){
  64. R j=i+c[id2[x]],nd=d[id2[x]];
  65. printf("%d %d %d\n",j-2*nd,j-nd,j);
  66. }
  67. }
  68. return 0;
  69. }

F

给两个整数\(a,b\),每次操作可以对一个数乘上一个质数、或除以它的一个质因数,求使两数约数个数相等的最少操作次数。

显然跟唯一分解有关,把数分解成\(\prod p_i^{k_i}\)以后,所有的\(k_i\)就可以压进状态。然后就搜?DP?最短路?

更麻烦的是状态的上界不好控制。然后这题就咕咕了吧。。。

Div1 E

当计算几何练手题做了,题解戳这儿

Codeforces Round #517 Div. 2/Div. 1的更多相关文章

  1. Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)

    Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) #include <bits/stdc++ ...

  2. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  3. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

  4. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

  5. Educational Codeforces Round 35 (Rated for Div. 2)

    Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...

  6. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

  7. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...

  8. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

  9. Educational Codeforces Round 39 (Rated for Div. 2) G

    Educational Codeforces Round 39 (Rated for Div. 2) G 题意: 给一个序列\(a_i(1 <= a_i <= 10^{9}),2 < ...

  10. Educational Codeforces Round 48 (Rated for Div. 2) CD题解

    Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...

随机推荐

  1. python文件读和写

    fileHandle = open ( 'G:/qqfile/1.txt','w' )fileHandle.write('abcd')#写文件 地址要用反斜杠fileHandle.close() fi ...

  2. Individual Project "写一个能自动生成小学四则运算题目的程序"

    一.题目简介 写一个能自动生成小学四则运算题目的程序. 初步拟定要实现的功能后,估计一下自己需要花多长时间.编程过程中记录自己实际用了多长时间. 然后和同学们比较一下各自程序的功能.实现方法的异同等等 ...

  3. 多线程系列之十一:Two-Phase Termination模式

    一,Two-Phase Termination模式 翻译过来就是:分两阶段终止 二,示例程序 public class CountupTread extends Thread { private lo ...

  4. Java 数据库操作

    目录 Java数据库组织架构 下载驱动包 连接数据库 连接数据库的三个步骤 连接数据库的高开销 Statement接口介绍 PreparedStatement类 使用PreparedStatement ...

  5. Redis启动及密码修改

    .cmd启动Redis: redis-server.exe redis.windows.conf #注意指定配置文件来启动 .cmd登陆redis redis-cli.exe -h -a .修改密码 ...

  6. centos6 yum 安装memcached

    centos6 yum 安装memcached - 像块石头 - 博客园http://www.cnblogs.com/rockee/archive/2012/08/01/2619160.html yu ...

  7. 【转】实现Nginx代理WSS协议

    https://blog.csdn.net/chopin407/article/details/52937645 后来看到了官网的教程(http://nginx.org/en/docs/http/we ...

  8. 使用jmeter来发送json/gzip格式数据 --------笔记

    一.使用jmeter来发送gzip数据 有时候我们需要模拟在客户端将数据压缩后, 发送(post)到服务器端. 通常这种情况,会发生在移动终端上. 这样做的好处, 是可以节省流量.  当然, 服务器返 ...

  9. python3 网页下拉框和悬浮框操作基础汇总

    #悬浮定位操作 from selenium.webdrier import ActionChains #浏览器实例化 #定位移动的位置赋给一个参数 ActionChains(浏览器).move_to_ ...

  10. Day 6-1计算机网络基础&TCP/IP

    按照功能不同,人们将互联网协议分为osi七层或tcp/ip五层或tcp/ip四层(我们只需要掌握tcp/ip五层协议即可) 每层运行常见物理设备: TCP/IP协议: Transmission Con ...