Codeforces 1071 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 + ;
int a[N], tmp[N], n;
vector<piii> ans;
bool f = false;
void flip(int x, int y, int z) {
a[x] ^= ;
a[y] ^= ;
a[z] ^= ;
ans.pb({{x, y}, z});
}
void fflip(int x, int y) {
a[x] ^= ;
a[x+y>>] ^= ;
a[y] ^= ;
ans.pb({{x, x+y>>}, y});
}
void Flip(int x, int y) {
tmp[x] ^= ;
tmp[x+y>>] ^= ;
tmp[y] ^= ;
//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+; j <= r; j += ) {
vc.pb({i, j});
}
}
int sz = vc.size();
for (int i = ; i < (<<sz); i++) {
for (int j = l; j <= r; j++) tmp[j] = a[j];
for (int j = ; j < sz; j++) {
if(i&(<<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 = ; j < sz; j++) if(i&(<<j))ans.pb({{vc[j].fi, vc[j].fi + vc[j].se >> }, vc[j].se});
return ;
}
}
}
void solve(int l, int r) {
if(r - l + <= ) {
while(r-l+ < && l > ) l--;
while(r-l+ < && r < n) r++;
bruteforce(l, r);
return ;
}
if(a[l] == ) {
solve(l+, r);
return ;
}
if(a[r] == ) {
solve(l, r-);
return ;
}
if(ck(l, , , )) {
flip(l, l+, l+);
solve(l+, r);
return ;
}
if(ck(l, , , )) {
flip(l, l+, l+);
solve(l+, r);
return ;
}
if(ck(l, , , )) {
flip(l, l+, l+);
solve(l+, r);
return ;
}
if(ckk(r, , , )) {
flip(r, r-, r-);
solve(l, r-);
return ;
}
if(ckk(r, , , )) {
flip(r, r-, r-);
solve(l, r-);
return ;
}
if(ckk(r, , , )) {
flip(r, r-, r-);
solve(l, r-);
return ;
}
if((r-l+)&) {
fflip(l, r);
fflip(l+, r-);
solve(l+, r-);
return ;
}
else {
fflip(l, r-);
fflip(l+, r);
solve(l+, r-);
return ;
}
}
int main() {
int cnt = ;
scanf("%d", &n);
for (int i = ; i <= n; i++) scanf("%d", &a[i]);
solve(, 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 ;
}
Codeforces 1071 C - Triple Flips的更多相关文章
- Codeforces 1071C Triple Flips 构造
原文链接 https://www.cnblogs.com/zhouzhendong/p/CF1071C.html 题目传送门 - CF1071C 题意 给定一个长度为 n 的 01 数列,限定你在 $ ...
- Codeforces1071C Triple Flips 【构造】【Four Russians】
题目分析: 这种题目显然可以先考虑哪些无解.我们发现我们不考虑操作次数的时候,我们可以选择连续的三个进行异或操作. 这样我们总能使得一个序列转化为$000...000xy$的形式.换句话说,对于$00 ...
- [CF1031E]Triple Flips
题目大意:给你一个长度为$n$的$01$串,一次操作定义为:选取$3$个等距的元素,使其$0$变$1$,$1$变$0$,要求在$\Big\lfloor \dfrac n 3\Big\rfloor+12 ...
- Codeforces Round #517
传送门 A. Cram Time 你有一本书,阅读第\(i\)页需要花费\(i\)的时间.你第一天有\(a\)的时间,第二天有\(b\)的时间,问你的总阅读页数的最大值. Input: 一行包含\(2 ...
- Technocup 2019 - Elimination Round 2
http://codeforces.com/contest/1031 (如果感觉一道题对于自己是有难度的,不要后退,懂0%的时候敲一遍,边敲边想,懂30%的时候敲一遍,边敲边想,懂60%的时候敲一遍, ...
- Codeforces 1119H - Triple(FWT)
Codeforces 题目传送门 & 洛谷题目传送门 FWT 的 immortal tea %%% 首先我们可以写出一个朴素的 \(dp\),设 \(dp_{i,j}\) 表示考虑前 \(i\ ...
- Good Triple CodeForces - 1169D (等差子序列)
大意: 给定01字符串, 求有多少个区间$[l,r]$, 使得存在正整数$x,k$满足$1\le x,k\le n,l\le x<x+2k\le r,s_x=s_{x+k}=s_{x+2k}$. ...
- CodeForces 304C
E - E Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- Codeforces Round #368 (Div. 2) C. Pythagorean Triples(数学)
Pythagorean Triples 题目链接: http://codeforces.com/contest/707/problem/C Description Katya studies in a ...
随机推荐
- 【题解】 Luogu P4145 上帝造题的七分钟2 / 花神游历各国
原题传送门 这道题实际和GSS4是一样的,只是输入方式有点区别 GSS4传送门 这道题暴力就能过qaq(这里暴力指线段树) 数据比较水 开方修改在线段树中枚举叶节点sqrt 查询区间和线段树基本操作 ...
- linux上的文件服务
主要的文件服务vsftp.Samba.NFS对比 服务器名称 用户客户端平台 使用范围 服务端口 VSFTP Windows/linux/unix/macOS等 发布网站,文件共享 Tcp/21 Sa ...
- IDEA——找不到或无法加载主类的一种暴力解决方法
对于用maven构建的java项目,可以利用maven工具编译一下,大致上可以解决很多奇奇怪怪的问题. 具体操作如下: 首先找到项目所在的文件夹,以F:\project为例. 删除.idea文件. 在 ...
- Adobe阅读器渗透攻击
Adobe阅读器渗透攻击 实验前准备 1.两台虚拟机,其中一台为kali,一台为windows xp sp3(老师给的xp虚拟机winxpAttaker,密码:mima1234). 2.设置虚拟机网络 ...
- 正则表达式验证HTTP地址是否合法
转载:https://blog.csdn.net/fsdad/article/details/52637426 判断url是否合法 const std::regex urlpattern(" ...
- php知识点-1
global 是在函数内部 声明一个 函数外部的变量(即所谓的全局变量, 而所谓的超全局变量是指 像 $_POST, $GLOBALS等之类的自动系统变量) 的一个别名. 在函数内部使用 unset( ...
- 1823: [JSOI2010]满汉全席 2-sat
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1823 思路 建图,缩点tarjan 判断impossible 代码 #include < ...
- SpringBoot 使用Druid连接池
1.pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Kylin工作原理、体系架构
核心思想:预计算. 对多维分析可能用到的度量进行预计算,将计算好的结果保存成Cube,并存在HBase中,供查询时直接访问 将高复杂度的聚合运算.多表连接……操作转换成对预计算结果的查询.决定了Kyl ...
- 如何某个js文件中的 console
因为自己引用了别人的一个 js 文件,但里面有很多事件相关的 console 输出.自己并不想去修改别人的文件.但想屏蔽掉里面的 console . 有多个 js 文件里有 console.log . ...