题目分析:

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

这样我们总能使得一个序列转化为$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. 2017湘潭大学邀请赛G题(贪心+优先队列)

    参考博客:http://www.cnblogs.com/chendl111/p/6891770.html 题目链接:https://www.icpc.camp/contests/4mYguiUR8k0 ...

  2. Linux常用软件启动、停止、重启命令

    一.PHP 启动命令: /usr/local/php5/sbin/php-fpm 停止命令: pkill php-fpm 二.MySQL 启动命令: /etc/init.d/mysqld start ...

  3. [已解决]关于python无法显示中文的问题:SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding declared。

    想在python代码中输出汉字.但是老是出现SyntaxError: Non-ASCII character '\xe4' in file test.py on line , but no encod ...

  4. javascript中的 return false和return true

    关于javascript中的 return false和return true,return 是javascript里函数返回值的关键字,一个函数内处理的结果可以使用return 返回,这样在调用函数 ...

  5. oninput事件和onchange事件区别

    onchange事件 触发条件:在域内容更改时触发,也可用于单选框和复选框改变后触发 作用对象:select.input.textarea oninput事件 触发条件:在域内容更改时触发(严格说在用 ...

  6. php trait使用

    trait类似于基类  同样的方法优先级为 本类>trait>基类 <?php /** * Created by PhpStorm. * User: mac * Date: 2019 ...

  7. 12 Connections

    1 and 出现在两个及以上的词,词组,或者句子之间,将它们连接起来.在正式的书面英语中,and不能出现在句首.在非正式的英语中可以. We should expand our product lin ...

  8. [转帖]漫画趣解Linux内核

    漫画趣解Linux内核 https://blog.csdn.net/juS3Ve/article/details/84207142 Linux 内核漫画 今天,我来为大家解读一幅来自 TurnOff. ...

  9. ORA-12541:TNS:无监听程序 解决办法

    昨天我在一台win7笔记本中安装了oracle11g,然后打算用另一个win10的笔记本使用plsql developer局域网内连接访问oracle数据库.但是遇到ORA-12541:TNS:无监听 ...

  10. dart正则

    1.前言 API中对于正则表达式的注释是:正则表达式的规范和语义与JavaScript相同详细的规范可以参考:http://ecma-international.org/ecma-262/5.1/#s ...