C - Triple Flips

思路:

小范围暴力

大范围递归构造

构造方法:

solve(l, r) 表示使l 到 r 区间全变为0的方法

为了使反转次数小于等于n/3 + 12

我们只需要保证每次反转后区间长度减少值的期望为3就可以了

如果a[l] == 0, l++

如果a[r] == 0, r--

如果a[l] == 1 && a[l+1] == 1 && a[l+2] == 1, 反转这三个就可以啦, l += 3

如果a[l] == 1 && a[l+1] == 0 && a[l+2] == 1, 反转l, l+2, l+4这三个, l += 3

如果a[l] == 1 && a[l+1] == 0 && a[l+1] == 0, 反转l, l+3, l+6这三个, l += 3

从右区间减少同理

否则只剩下这种情况了:

1 1 0 ...... 0 1 1

那么只需要根据区间长度的奇偶性

反转l , (l+r)/2, r 和 l+1 , (l+1+r-1)/2, r-1 或者 l, (l+r-1)/2, r-1 和 l+1 , (l+1+r)/2, r

然后 l += 3, r -= 3, 区间长度减少6

区间长度小于8的话就暴力

用二进制枚举所有的反转情况, 然后检查

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head#define ck(l, x, y, z) a[l]==x&&a[l+1]==y&&a[l+2]==z
#define ckk(r, x, y, z) a[r]==x&&a[r-1]==y&&a[r-2]==z
const int N = 1e5 + 10;
int a[N], tmp[N], n;
vector<piii> ans;
bool f = false;
void flip(int x, int y, int z) {a[x] ^= 1;a[y] ^= 1;a[z] ^= 1;ans.pb({{x, y}, z});
}
void fflip(int x, int y) {a[x] ^= 1;a[x+y>>1] ^= 1;a[y] ^= 1;ans.pb({{x, x+y>>1}, y});
}
void Flip(int x, int y) {tmp[x] ^= 1;tmp[x+y>>1] ^= 1;tmp[y] ^= 1;//ans.pb({{x, x+y>>1}, y});
}
void bruteforce(int l, int r) {vector<pii> vc;for (int i = l; i <= r; i++) {for (int j = i+2; j <= r; j += 2) {vc.pb({i, j});}}int sz = vc.size();for (int i = 0; i < (1<<sz); i++) {for (int j = l; j <= r; j++) tmp[j] = a[j];for (int j = 0; j < sz; j++) {if(i&(1<<j)) {Flip(vc[j].fi, vc[j].se);}}bool ff = true;for (int j = l; j <= r; j++) if(tmp[j]) {ff = false; break;}if(ff) {f = true;for (int j = 0; j < sz; j++) if(i&(1<<j))ans.pb({{vc[j].fi, vc[j].fi + vc[j].se >> 1}, vc[j].se});return ;}}
}
void solve(int l, int r) {if(r - l + 1 <= 8) {while(r-l+1 < 8 && l > 1) l--;while(r-l+1 < 8 && r < n) r++;bruteforce(l, r);return ;}if(a[l] == 0) {solve(l+1, r);return ;}if(a[r] == 0) {solve(l, r-1);return ;}if(ck(l, 1, 1, 1)) {flip(l, l+1, l+2);solve(l+3, r);return ;}if(ck(l, 1, 0, 1)) {flip(l, l+2, l+4);solve(l+3, r);return ;}if(ck(l, 1, 0, 0)) {flip(l, l+3, l+6);solve(l+3, r);return ;}if(ckk(r, 1, 1, 1)) {flip(r, r-1, r-2);solve(l, r-3);return ;}if(ckk(r, 1, 0, 1)) {flip(r, r-2, r-4);solve(l, r-3);return ;}if(ckk(r, 1, 0, 0)) {flip(r, r-3, r-6);solve(l, r-3);return ;}if((r-l+1)&1) {fflip(l, r);fflip(l+1, r-1);solve(l+3, r-3);return ;}else {fflip(l, r-1);fflip(l+1, r);solve(l+3, r-3);return ;}
}
int main() {int cnt = 0;scanf("%d", &n);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);solve(1, n);if(f) {printf("YES\n");printf("%d\n", (int)ans.size());for (piii p : ans) printf("%d %d %d\n", p.fi.fi, p.fi.se, p.se);}else printf("NO\n");return 0;
}

转载于:https://www.cnblogs.com/widsom/p/9964761.html

Codeforces 1071 C - Triple Flips相关推荐

  1. CodeForces - 1168B Good Triple(思维+暴力)

    题目链接:点击查看 题目大意:给出一个长度为n的01字符串,求所有满足条件的区间对数[l,r],使得在区间[l,r]内至少存在一组满足条件的答案,这里第二层的满足条件是指存在两个正整数个x和k,满足s ...

  2. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  3. 【CodeForces - 574B】Bear and Three Musketeers (枚举边,思维,优秀暴力)

    题干: Do you know a story about the three musketeers? Anyway, you will learn about its origins now. Ri ...

  4. Codeforces 1144 D

    http://codeforces.com/problemset/problem/1144/D You are given an array aa consisting of nn integers. ...

  5. Codeforces 1080E - Sonya and Matrix Beauty - Manacher

    Codeforces 1080E - Sonya and Matrix Beauty - Manacher 题解链接 https://lucien.ink 题目链接 https://codeforce ...

  6. Codeforces Round #784 (Div. 4)

    A. Division? Codeforces separates its users into 4 divisions by their rating: For Division 1: 1900≤r ...

  7. 【Codeforces Round #784 (Div. 4)】【AK题解】

    2022年4月30日19:43:21 文章目录 2022年4月30日19:43:21 A. Division? 题目描述 测试样例 题解 B. Triple 题目描述 测试样例 题解 C. Odd/E ...

  8. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  9. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  10. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

最新文章

  1. window for jdk install
  2. 控制反转(IoC)-解析与实现
  3. 是否可能存在一种不需要力的相互作用?
  4. C#与U3D中字符串尾0
  5. 启明云端分享|ESP32-C3有望三月中旬量产出货,ESP32-C3-MINI-1模块技术规格书分享
  6. jQuery-1.9.1源码分析系列(六) 延时对象应用——jQuery.ready
  7. S5 Linux信息显示与搜索文件命令
  8. 牛客网dp专题 数位dp
  9. SQL Server商业智能功能– SQL Server数据工具–商业智能
  10. 在任意目录导入自定义库
  11. 《程序员修炼之道--从小工到专家》读书笔记
  12. 2017年经典hadoop体系课程-徐培成-专题视频课程
  13. 换一种姿势:利用 PdaNet+ 实现电脑共享手机的流量
  14. 标准盒子模型和IE盒子模型
  15. Java 简单图片 马赛克,黑白画,珠纹化,油画效果等处理技术 原理及实现 (简单UI)
  16. 简单聊一聊如今火爆当下的数字孪生技术到底为何物
  17. 矩阵键盘_按键检测_按键次数检测
  18. 什么是 NullPointerException?
  19. 如何看计算机cpu的好坏,怎么看电脑的配置(如何判断cpu的好坏)
  20. 震网三代 CVE-2017-8464 关于Powershell 漏洞复现

热门文章

  1. 央行数字货币DCEP首个应用场景落地,新的支付风口领域已现!
  2. 七日杀显示服务器ip,[七日杀怎么看玩家id]七日杀管理员怎么查玩家
  3. sop流程图模板_这是一份标准作业流程SOP详解,附流程图绘制规范,不愁不会画!...
  4. 2.3.6 CSM、RMC和RSCT管理系统
  5. Windows 2000 检测系统安全进阶详解
  6. 深入解密比Guava Cache更优秀的缓存-Caffeine
  7. JAVA - 银行卡认证
  8. layui icon服务器上显示不出来,关于layui的动态图标不显示的解决方法
  9. 测试 软通动力软件测试机试_软通动力2020春招软件测试笔试题以及答案
  10. 投影html连接电脑,投影仪怎么连接电脑 电脑与投影仪的连接方法