题目分析:

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

这样我们总能使得一个序列转化为$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. Redis中单机数据库的实现

    1. 内存操作层 zmalloc 系接口 redis为了优化内存操作, 封装了一层内存操作接口. 默认情况下, 其底层实现就是最简朴的libc中的malloc系列接口. 如果有定制化需求, 可以通过配 ...

  2. Node.js api接口和SQL数据库关联

    数据库表创建 服务器环境配置.连接 .操作.数据库 API接口  原则:

  3. Django之admin中管理models中的表格

    Django之admin中管理models中的表格 django中使用admin管理models中的表格时,如何将表格注册到admin中呢? 具体操作就是在项目文件夹中的app文件夹中的admin中注 ...

  4. c# Mongodb两个字段不相等 MongoDB原生查询

    var document = new BsonDocument{ { "$where","this.StarTime!=this.EndTime"}, { }, ...

  5. Svn基本操作

    日常开发中使用到的Svn基本操作 svn      https://tortoisesvn.net/ https://www.visualsvn.com/server/download/   1. 检 ...

  6. Oracle SQL优化原则

    原文:http://bbs.landingbj.com/t-0-240353-1.html 1.选用适合的 ORACLE 优化器 2.访问 Table 的方式 3.共享SQL语句 共享的语句必须满足三 ...

  7. Python3练习题 022:用递归函数反转字符串

    方法一 str = input('请输入若干字符:')   def f(x):     if x == -1:         return ''     else:         return s ...

  8. vue组件封装选项卡

    <template> <myMenu :arr='arr' :arrcontent='content'></myMenu> </template> &l ...

  9. Appscanner实验还原code3

    # Author: Baozi #-*- codeing:utf-8 -*- import _pickle as pickle from sklearn import ensemble import ...

  10. python之路--内置常用模块

    一 . 简单的了解模块 你写的每一个py文件都是一个模块. 还有一些我们一直在使用的模块. buildins  内置模块. print, input. random  主要是和随机相关的的内容 ran ...