Codeforces1071C Triple Flips 【构造】【Four Russians】
题目分析:
这种题目显然可以先考虑哪些无解。我们发现我们不考虑操作次数的时候,我们可以选择连续的三个进行异或操作。
这样我们总能使得一个序列转化为$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】的更多相关文章
- Codeforces 1071C Triple Flips 构造
原文链接 https://www.cnblogs.com/zhouzhendong/p/CF1071C.html 题目传送门 - CF1071C 题意 给定一个长度为 n 的 01 数列,限定你在 $ ...
- Codeforces 1071 C - Triple Flips
C - Triple Flips 思路: 小范围暴力 大范围递归构造 构造方法: solve(l, r) 表示使l 到 r 区间全变为0的方法 为了使反转次数小于等于n/3 + 12 我们只需要保证每 ...
- [CF1031E]Triple Flips
题目大意:给你一个长度为$n$的$01$串,一次操作定义为:选取$3$个等距的元素,使其$0$变$1$,$1$变$0$,要求在$\Big\lfloor \dfrac n 3\Big\rfloor+12 ...
- Technocup 2019 - Elimination Round 2
http://codeforces.com/contest/1031 (如果感觉一道题对于自己是有难度的,不要后退,懂0%的时候敲一遍,边敲边想,懂30%的时候敲一遍,边敲边想,懂60%的时候敲一遍, ...
- Codeforces Round #517
传送门 A. Cram Time 你有一本书,阅读第\(i\)页需要花费\(i\)的时间.你第一天有\(a\)的时间,第二天有\(b\)的时间,问你的总阅读页数的最大值. Input: 一行包含\(2 ...
- Uva 120 - Stacks of Flapjacks(构造法)
UVA - 120 Stacks of Flapjacks Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld &a ...
- Pythagorean Triples毕达哥斯拉三角(数学思维+构造)
Description Katya studies in a fifth grade. Recently her class studied right triangles and the Pytha ...
- 3771: Triple
3771: Triple 链接 题意 n个斧头,每个斧头的价值都不同(开始时没注意到),可以取1个,2个,3个斧头组成不同的价值,求每种价值有多少种组成方案(顺序不同算一种) 分析: 生成函数 + 容 ...
- 学习笔记:Maven构造版本号的方法解决浏览器缓存问题
需要解决的问题 在做WEB系统开发时,为了提高性能会利用浏览器的缓存功能,其实即使不显式的申明缓存,现代的浏览器都会对静态文件(js.css.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...
随机推荐
- [原创]Sharding-Sphere之Proxy初探
大家好,拓海(https://github.com/tuohai666)今天为大家分享Sharding-Sphere推出的重磅产品:Sharding-Proxy!在之前闪亮登场的Sharding-Sp ...
- Appium-超过60s的应用场景如何处理
前言: 最近在搞appium自动化项目,遇到超过60s的应用场景时,总是报错报错.如何解决呢?见下文. 报错信息: 2018-05-21 14:03:42:253 - [HTTP] <-- PO ...
- java高精度学习笔记
高精度基本用法 valueOf(parament) 将参数转换为指定的类型 add() 相加 subtract() 相减 multiply() 相乘 divide() ...
- asp.net core前后端分离
陆陆续续的看了两个礼拜的前端知识,把vue+vue-router+axios的知识撸了一遍,本来想加个element-ui来实现一下前后端分离,实施的时候却遇到了很多的坑.我本身不在一个软件开发公司上 ...
- angularjs4+ionic3集成搭建
1:安装一下cnpm用淘宝镜像安装npm install -g cnpm --registry=https://registry.npm.taobao.org 2:使用 cnpm命令安装(全局安装 A ...
- JavaScript lastIndexOf() 方法
<script type="text/javascript"> var str="0000.0000.0000.0000.0000.0000.0000.&qu ...
- Linux基础学习笔记6-SHELL编程
编程基础 程序:指令+数据 程序编程风格: 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心,指令服务于数据 shell程序:提供了编程能力,解释执行 编程基本概念: 顺序执行:循环执行:选 ...
- scrapy几种反反爬策略
一.浏览器代理 1.直接处理: 1.1在setting中配置浏览器的各类代理: user_agent_list=[ "Mozilla/5.0 (Windows NT 10.0; Win64; ...
- css瀏覽器私有前綴名
-webkit-:chrome,safari -o-:opera -moz-:firefox -ms-:ie
- jdbc工具类1.0
package cn.zhouzhou; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManag ...