题目分析:

这种题目显然可以先考虑哪些无解。我们发现我们不考虑操作次数的时候,我们可以选择连续的三个进行异或操作。

这样我们总能使得一个序列转化为$000...000xy$的形式。换句话说,对于$000...0001$,$000...0010$,$000...0011$考虑无解条件即可。

这时候写一个暴力程序,用$O(n^2*2^n)$的算法可以发现其中一个是总长小于$7$无解,另外两个是小于$8$无解。

然后观察题目要求的操作次数与$n/3$有关,不难想到每$3$个分成一组,然后在组内调成$0$,允许利用组外信息,每组只允许用一次操作。但这样操作数会超过($011 or 110$)。

那我们放宽一下限制,每$6$个分成一组,在组内调成$0$,允许利用组外信息,每组只允许操作两次。这样就可以了(我一开始以为$110111$是不行的,写了一个暴力后后来发现我脑残了)。

这样我们考虑Four Russians,预处理出来每$6$组怎么走,最后对剩余的暴力就行了。

代码:

 #include<bits/stdc++.h>
using namespace std; const int maxn = ; int n,a[maxn],f[<<];
struct node{int x,y,z;};
vector <node> des[]; void init(){
queue<int> q;
int N = ;
memset(f,0x3f,sizeof(f));
f[] = ; q.push();
while(!q.empty()){
int k = q.front();q.pop();
for(int i=;i<N;i++){
if(f[k^(<<i)] > f[k] + ){
for(int j=;j<des[k].size();j++)
des[k^(<<i)].push_back(des[k][j]);
des[k^(<<i)].push_back((node){i,,-i});
f[k^(<<i)] = f[k]+;
q.push(k^(<<i));
}
for(int j=i+;j<N;j++){
int z = (<<i)+(<<j);
if(j+(j-i) < N) z |= (<<*j-i);
if(f[k^z] > f[k]+){
for(int fr=;fr<des[k].size();fr++)
des[k^z].push_back(des[k][fr]);
des[k^z].push_back((node){i,j,*j-i});
f[k^z] = f[k]+;
q.push(k^z);
}
}
}
}
} node opt[maxn];
int num; node lst[maxn]; void Remain(){
queue<int> q;
memset(f,0x3f,sizeof(f));
//for(int i=0;i<64;i++) des[i].clear();
f[] = ;q.push();
int N = min(n,);
while(!q.empty()){
int k = q.front();q.pop();
for(int i=;i<N;i++){
for(int j=i+;j<N;j++){
if(j+(j-i) >= N) break;
int z = (<<i)+(<<j)+(<<*j-i);
if(f[k^z] > f[k]+){
f[k^z] = f[k]+;
lst[k^z] = (node){i,j,*j-i};
q.push(k^z);
}
}
}
}
int z = ;
for(int i=n-N+;i<=n;i++){z = (z<<)+a[i];}
if(f[z] > 1e8){puts("NO");}
else{
puts("YES");
printf("%d\n",num+f[z]);
for(int i=;i<=num;i++){
printf("%d %d %d\n",opt[i].x,opt[i].y,opt[i].z);
}
while(z){
printf("%d %d %d\n",n-lst[z].z,n-lst[z].y,n-lst[z].x);
int pp = z;
z ^= (<<lst[pp].x); z ^= (<<lst[pp].y); z^= (<<lst[pp].z);
}
}
} void work(){
for(int i=;i<=n;i+=){
if(i+ > n) break;
int z = (a[i+]<<)+(a[i+]<<)+(a[i+]<<)+(a[i+]<<)+(a[i+]<<)+a[i];
for(int j=;j<des[z].size();j++){
opt[++num] = des[z][j];
opt[num].x += i; opt[num].y += i; opt[num].z += i;
a[opt[num].x] ^= ; a[opt[num].y] ^= ; a[opt[num].z] ^= ;
}
}
Remain();
} int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
init();
work();
return ;
}

Codeforces1071C Triple Flips 【构造】【Four Russians】的更多相关文章

  1. Codeforces 1071C Triple Flips 构造

    原文链接 https://www.cnblogs.com/zhouzhendong/p/CF1071C.html 题目传送门 - CF1071C 题意 给定一个长度为 n 的 01 数列,限定你在 $ ...

  2. Codeforces 1071 C - Triple Flips

    C - Triple Flips 思路: 小范围暴力 大范围递归构造 构造方法: solve(l, r) 表示使l 到 r 区间全变为0的方法 为了使反转次数小于等于n/3 + 12 我们只需要保证每 ...

  3. [CF1031E]Triple Flips

    题目大意:给你一个长度为$n$的$01$串,一次操作定义为:选取$3$个等距的元素,使其$0$变$1$,$1$变$0$,要求在$\Big\lfloor \dfrac n 3\Big\rfloor+12 ...

  4. Technocup 2019 - Elimination Round 2

    http://codeforces.com/contest/1031 (如果感觉一道题对于自己是有难度的,不要后退,懂0%的时候敲一遍,边敲边想,懂30%的时候敲一遍,边敲边想,懂60%的时候敲一遍, ...

  5. Codeforces Round #517

    传送门 A. Cram Time 你有一本书,阅读第\(i\)页需要花费\(i\)的时间.你第一天有\(a\)的时间,第二天有\(b\)的时间,问你的总阅读页数的最大值. Input: 一行包含\(2 ...

  6. Uva 120 - Stacks of Flapjacks(构造法)

    UVA - 120  Stacks of Flapjacks Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld &a ...

  7. Pythagorean Triples毕达哥斯拉三角(数学思维+构造)

    Description Katya studies in a fifth grade. Recently her class studied right triangles and the Pytha ...

  8. 3771: Triple

    3771: Triple 链接 题意 n个斧头,每个斧头的价值都不同(开始时没注意到),可以取1个,2个,3个斧头组成不同的价值,求每种价值有多少种组成方案(顺序不同算一种) 分析: 生成函数 + 容 ...

  9. 学习笔记:Maven构造版本号的方法解决浏览器缓存问题

    需要解决的问题 在做WEB系统开发时,为了提高性能会利用浏览器的缓存功能,其实即使不显式的申明缓存,现代的浏览器都会对静态文件(js.css.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...

随机推荐

  1. 使用 OpenSSL 创建私有 CA:1 根证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 OpenS ...

  2. H5 65-清除浮动方式一

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. vue的高阶组件

    探索Vue高阶组件 探索Vue高阶组件的使用 Vue高阶组件的使用方法 高阶组件应用-组件重新实例化 深入理解React 高阶组件 探索Vue高阶组件 2018-01-05 探索Vue高阶组件 Vue ...

  4. 学习yii2.0——行为

    学习yii框架的行为之前,需要先了解yii的事件,可以参考这篇博客: 怎么理解行为 yii框架的行为有点类似于trait,可以有个大体的概念: 1.有一个类A,包含一些属性和方法,很普通的一个类A. ...

  5. UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-25: ordinal not in range(128)

    python报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-25: ordinal not in ...

  6. storm问题汇总

    1.删除了本地topology导致无法启动nimbus 删除storm的自定义的库中的数据 删除zookeeper中配置的dataDir中的数据 重启服务即可

  7. mybtis逆向工程实战教程--条件查询

    mabitis逆向工程进行条件查询:

  8. node 模块化思想中index.js的重要性

    目录结构如上图 module1和modlue2.main在同一级 module1下文件: index.js var test2=require('./test2'); var sayHi=functi ...

  9. linux 下crontab -e 命令插入及保存

    由于功能需要,用到linux定时任务. 一般我们都是crontab -e 进去写好定时任务,直接保存退出就可以了,如果是第一次创建定时任务, 系统会选择默认编辑器,就不好保存文件. 在网上参考了一篇文 ...

  10. Python魔法方法(magic method)细解几个常用魔法方法(下)

    接上文,再介绍最后几个常用的魔法方法. 关于__dict__: 先上个例子: class Test(object): fly = True def __init__(self, age): self. ...