Codeforces 1071 C - Triple Flips
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相关推荐
- CodeForces - 1168B Good Triple(思维+暴力)
题目链接:点击查看 题目大意:给出一个长度为n的01字符串,求所有满足条件的区间对数[l,r],使得在区间[l,r]内至少存在一组满足条件的答案,这里第二层的满足条件是指存在两个正整数个x和k,满足s ...
- 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- 【CodeForces - 574B】Bear and Three Musketeers (枚举边,思维,优秀暴力)
题干: Do you know a story about the three musketeers? Anyway, you will learn about its origins now. Ri ...
- Codeforces 1144 D
http://codeforces.com/problemset/problem/1144/D You are given an array aa consisting of nn integers. ...
- Codeforces 1080E - Sonya and Matrix Beauty - Manacher
Codeforces 1080E - Sonya and Matrix Beauty - Manacher 题解链接 https://lucien.ink 题目链接 https://codeforce ...
- Codeforces Round #784 (Div. 4)
A. Division? Codeforces separates its users into 4 divisions by their rating: For Division 1: 1900≤r ...
- 【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 ...
- CodeForces 375D Tree and Queries
传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...
- 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)
题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...
- 【codeforces 812C】Sagheer and Nubian Market
[题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...
最新文章
- window for jdk install
- 控制反转(IoC)-解析与实现
- 是否可能存在一种不需要力的相互作用?
- C#与U3D中字符串尾0
- 启明云端分享|ESP32-C3有望三月中旬量产出货,ESP32-C3-MINI-1模块技术规格书分享
- jQuery-1.9.1源码分析系列(六) 延时对象应用——jQuery.ready
- S5 Linux信息显示与搜索文件命令
- 牛客网dp专题 数位dp
- SQL Server商业智能功能– SQL Server数据工具–商业智能
- 在任意目录导入自定义库
- 《程序员修炼之道--从小工到专家》读书笔记
- 2017年经典hadoop体系课程-徐培成-专题视频课程
- 换一种姿势:利用 PdaNet+ 实现电脑共享手机的流量
- 标准盒子模型和IE盒子模型
- Java 简单图片 马赛克,黑白画,珠纹化,油画效果等处理技术 原理及实现 (简单UI)
- 简单聊一聊如今火爆当下的数字孪生技术到底为何物
- 矩阵键盘_按键检测_按键次数检测
- 什么是 NullPointerException?
- 如何看计算机cpu的好坏,怎么看电脑的配置(如何判断cpu的好坏)
- 震网三代 CVE-2017-8464 关于Powershell 漏洞复现
热门文章
- 央行数字货币DCEP首个应用场景落地,新的支付风口领域已现!
- 七日杀显示服务器ip,[七日杀怎么看玩家id]七日杀管理员怎么查玩家
- sop流程图模板_这是一份标准作业流程SOP详解,附流程图绘制规范,不愁不会画!...
- 2.3.6 CSM、RMC和RSCT管理系统
- Windows 2000 检测系统安全进阶详解
- 深入解密比Guava Cache更优秀的缓存-Caffeine
- JAVA - 银行卡认证
- layui icon服务器上显示不出来,关于layui的动态图标不显示的解决方法
- 测试 软通动力软件测试机试_软通动力2020春招软件测试笔试题以及答案
- 投影html连接电脑,投影仪怎么连接电脑 电脑与投影仪的连接方法