原文链接 https://www.cnblogs.com/zhouzhendong/p/CF1071C.html

题目传送门 - CF1071C

题意

  给定一个长度为 n 的 01 数列,限定你在 $\left \lfloor \frac n 3 \right \rfloor +12$ 次操作内将所有的数字都变成 0 。

  操作定义为:选择三个数 $x,y,z(x<y<z, y-x=z-y)$ ,使得 a[x],a[y],a[z] 翻转 (0 变 1 ,1 变 0)

  如果不能完成,那么输出 NO ,否则输出 YES 并输出方案。

  $n\leq 10^5$

题解

  首先我们很容易找到一个可以将一个 1 变成 0 的操作:

0 0 0 0 0 0 1
1 0 0 1 0 0 0
1 1 1 0 0 0 0
0 0 0 0 0 0 0

  

  然后考虑如何高效简化局面。

  假设当前局面中只有区间 [L,R] 中有 1 。我们需要以平均每次将区间压缩 3 单位长度的效率来操作。

  接下来就是分类讨论:

  1.  a[L]=0  直接 L++

  2.  a[R]=0  直接 R--

  3.  a[L]=a[L+1]=a[L+2]=1  直接翻转他们,消耗一次操作,效率为 3 。

  4.  a[R]=a[R-1]=a[R-2]=1  同理,效率为 3 。

  5.  a[L]=1,a[L+1]=0  找到 a[L] 之后的第一个 1 ,假设位置为 p ,并使得 x=L,y=p,z=2p-L,消耗一次操作,效率 至少为 3 。

  6.  a[R]=1,a[R-1]=0  类似于第 5 种。

(后面那个是没用的,因为数据水,所以比赛的时候直接可以过,为了想这个续了我好久qaq)

  7.  a[L]=a[L+1]=a[R]=a[R-1]=1,a[L+2]=0,a[R-2]=0  这个是最难想到的。

      如果 (L+R) mod  2 = 0 ,设 m = (L+R)/2 ,那么消耗两次操作:(L,m,R) 和 (L+1,m,R-1)

      如果 (L+R) mod  2 = 1 ,设 m = (L+R-1)/2 ,那么消耗两次操作:(L,m,R-1) 和 (L+1,m+1,R)

      这样做两步,由于 a[L+2]=a[R-2]=0,所以至少效率为 3 。

  保证效率为 3 之后。最终我们要面对的是小范围情况。

  我们现在只有 2 个 1 了。我们首先要把他们移到一起。这个很容易。

  然后将他们转化成一个 1 然后变成 0 就好了。

  我们还要注意一种特殊情况:

0 0 0 0 0 0 1 1

  我们不能鲁莽地把后面两个 1 变成一个 1 放到第 6 个位置上,这样显然不行,应该直接做两次 1 变成 0 的操作。

  当然具体实现的时候还需要注意许多细节问题。我的代码写的比较丑。

  另外,这里再提供 1 组 hack 数据。这是我对着某分十分短的AC代码学习之后马上造出来的hack数据。

125
1 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100005;
LL read(){LL x=0,f=1;char ch=getchar();while (!isdigit(ch)&&ch!='-')ch=getchar();if (ch=='-')f=-1,ch=getchar();while (isdigit(ch))x=(x<<1)+(x<<3)+ch-48,ch=getchar();return x*f;
}
int n;
int a[N];
int m=0;
struct Perf{int x,y,z;Perf(){}Perf(int _x,int _y,int _z){x=_x,y=_y,z=_z;}
}p[N];
int find(int x,int dx){while (!a[x]&&1<=x&&x<=n)x+=dx;return x;
}
void pef(int x,int y,int z){a[x]^=1,a[y]^=1,a[z]^=1;p[++m]=Perf(x,y,z);
}
int gettot(){int tot=0;for (int i=1;i<=n;i++)tot+=a[i];return tot;
}
void del(int x){pef(x-6,x-3,x);pef(x-5,x-4,x-3);pef(x-6,x-5,x-4);
}
int main(){n=read();for (int i=1;i<=n;i++)a[i]=read();int L=1,R=n;while (L+2<=R){if (a[L]&&a[L+1]&&a[L+2]){pef(L,L+1,L+2);L+=3;continue;}if (a[R]&&a[R-1]&&a[R-2]){pef(R-2,R-1,R);a[R-2]=a[R-1]=a[R]=0;R-=3;}if (!a[L]){L++;continue;}if (!a[R]){R--;continue;}int l=find(L+1,1);int r=find(R-1,-1);if (l==R)break;if (l!=L+1&&2*l-L<=R){pef(L,l,l*2-L);continue;}else if (r!=R-1&&2*r-R>=L){pef(2*r-R,r,R);continue;}else if (l==L+1&&r==R-1){if ((R-L)%2==0){int m=(L+R)/2;pef(L,m,R);pef(L+1,m,R-1);continue;}else {int m1=(L+R)/2,m2=m1+1;pef(L,m1,R-1);pef(L+1,m2,R);continue;}}else if (l==L+1&&2*r-R>=L){pef(2*r-R,r,R);continue;}else if (r==R-1&&2*l-L<=R){pef(L,l,l*2-L);continue;}else if (l==L+1)pef(L,l,l+1);else if (r==R-1)pef(r-1,r,R);elsebreak;}if (gettot()>0){int l=find(1,1);int r=find(n,-1);if (l!=r){while (r+3<=min(9,n)){pef(r,r+1,r+2);pef(r+1,r+2,r+3);r+=3;}while (l+3<=min(9,n)){pef(l,l+1,l+2);pef(l+1,l+2,l+3);l+=3;}if (gettot()){if (l>=7&&r>=7){del(l);del(r);}else {if ((l+r)%2==0)return puts("NO"),0;if (l+1!=r)pef(l+1,(l+r+1)/2,r);if (l+2<=n)pef(l,l+1,l+2),l=r=l+2;elsepef(l-1,l,l+1),l=r=l-1;}}}if (gettot()){while (l+3<=min(9,n)){pef(l,l+1,l+2);pef(l+1,l+2,l+3);l+=3;}if (l<7)return puts("NO"),0;del(l);}}puts("YES");printf("%d\n",m);for (int i=1;i<=m;i++)printf("%d %d %d\n",p[i].x,p[i].y,p[i].z);return 0;
}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/CF1071C.html

Codeforces 1071C Triple Flips 构造相关推荐

  1. CodeForces - 287C Lucky Permutation(构造)

    题目链接:点击查看 题目大意:构造一个合法的排列,满足 ppi=n−i+1p_{p_{i}}=n-i+1ppi​​=n−i+1 题目分析:因为第四个样例的存在降低了本题的难度,不然感觉还是有点难度的一 ...

  2. CodeForces - 468C Hack it!(构造+数位dp)

    题目链接:点击查看 题目大意:求出一段区间 [l,r][l,r][l,r] 的数位和对 aaa 取模后为 000.更具体的,设 f(x)f(x)f(x) 为 xxx 的数位和,本题需要求出一对 [l, ...

  3. CodeForces - 1561E Bottom-Tier Reversals(构造)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的排列,每次操作可以选择一个奇数长度的前缀然后反转,需要构造一种方案,使得在不超过 5n2\frac{5n}{2}25n​ 次操作后使得序列有序 ...

  4. CodeForces - 1494E A-Z Graph(构造+思维)

    题目链接:https://vjudge.net/problem/CodeForces-1494E 题目大意:给出一个初始时只有 nnn 个点的有向带权图,需要执行 mmm 次操作,每次操作分为下列三种 ...

  5. CodeForces - 1494D Dogeforces(贪心+构造)

    题目链接:点击查看 题目大意:给出 nnn 个叶子结点和一个 n∗nn*nn∗n 的 LCALCALCA 矩阵,其中 LCALCALCA 表示的是最近公共祖先节点的权值,现在需要构造出一棵自顶向下权值 ...

  6. CodeForces - 148C Terse princess (构造)

    题目链接:http://codeforces.com/problemset/problem/148/C点击打开链接 C. Terse princess time limit per test 1 se ...

  7. [ An Ac a Day ^_^ ] CodeForces 468A 24 Game 构造

    题意是让你用1到n的数构造24 看完题解感觉被样例骗了-- 很明显 n<4肯定不行 然后构造出来4 5的组成24的式子 把大于4(偶数)或者5(奇数)的数构造成i-(i-1)=1 之后就是无尽的 ...

  8. Codeforces 550D. Regular Bridge 构造

    求一个图,每一个点的度数都为K并且必须至少要有一个桥. 构造题: 仅仅有k为奇数的时候有解, 构造这种一个图,左边一团有 k+1 个点 , 右边一团也有 k+1 个点, 中间经过 m1 , m2 连着 ...

  9. CodeForces - 1453D Checkpoints(概率+构造)

    题目链接:点击查看 题目大意:需要设计一个游戏关卡,由 01 字符串组成,1 表示存档点,0 表示普通关卡,规定每一步可以从第 i 个关卡前进到第 i + 1 个关卡,不过有 1/2 的概率会成功,剩 ...

  10. CodeForces - 1316D Nash Matrix(构造+dfs)

    题目链接:点击查看 题目大意:给出一个 n * n 的矩阵,初始时每个格子都为空,现在要求我们自己用 ' R ' , ' L ' , ' U ' , ' D ' 和 ' X ' 填充,分别表示在每个格 ...

最新文章

  1. Office 365系列(4)------Cutover Migrate 搬迁方式至O365上来方法及步骤总结
  2. java反射 invoke详解
  3. php 输出 echo、print_r、print、var_dump 、die 区别
  4. 键盘I/O中断调用(INT 16H)和常见的int 17H、int 1A H
  5. 关于RasASM的一个编译错误
  6. php编码 js解码,浅谈php和js中json的编码和解码
  7. synchronized的理解
  8. jsp 内置对象 登录 cookie + session
  9. 先来先服务算法、运行时间最短者优先算法和最高响应比优先调度算法_Linux进程调度:完全公平调度器CFS
  10. 计算机组成原理 第一章 计算机系统概述
  11. 研究学习时用到的软件
  12. 愿码(ChainDesk.CN):EOS钱包开发 二 EOS开发环境搭建
  13. Axure教程-苹果X母版制作
  14. C语言队列单链表实现(通俗易懂),可直接使用
  15. Python菜鸟编程第十四课之正则表达式
  16. Chromium OS并行运行Linux chroot安装Linux
  17. vSphere配置NSX Edge网络
  18. 【渝粤题库】广东开放大学 物业管理实务 形成性考核
  19. 嵌入式系统 操作系统 uC/OS uClinux
  20. git错误: The requested URL returned error: 403 Forbidden while accessing https://github.com/wangz/futu

热门文章

  1. 分销商城业务逻辑设计_功能思维导图_OctShop
  2. Ubuntu16.04运行SqueezeSeg_Ros
  3. 经纬度坐标转换的方法
  4. Deecamp20 项目提交【如何用pcdet(second)跑自己的数据】
  5. 论文笔记:Composable Sparse Fine-Tuning for Cross-Lingual Transfer
  6. 批量修改图片尺寸,不用ps也可以
  7. 云计算与大数据之间的关系
  8. 用 SQL 玩转世界银行全球 GDP 数据
  9. 【小知识】Elastic Search排除某个索引后缀
  10. PS CC —— 键盘快捷键