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.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...
随机推荐
- 【C#复习总结】细说匿名方法
1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...
- Xamarin.Forms 3.0的新特性
近期因为工作关系开始使用Xamarin,翻译了两篇国外的介绍3.0新特性的文章,供大家参考. 第一篇文章来自Xamarin官网,原文地址:https://blog.xamarin.com/xamari ...
- C++与Java,C#的异同(一):值,地址,引用
Java,C#已经比较熟悉,最近在从0开始自学C++.学习过程中必然会与Java,C#进行对比,有吐槽,也有点赞. 先来讲讲最基本也是最重要的部分:参数传递的方式. 对于类型, Java分基本类型.复 ...
- Day3 Python基础之while、for循环(二)
1.数据运算 算数运算 整除运算:// 取余运算:% 指数运算:** 赋值运算 b+=a;等价于b=b+a 比较运算 >,<,==,!=,>=,<= 逻辑运算符 and .or ...
- 同步和异步概念(由DZW前端框架引发的百度地图api无法加载问题总结)
首先概念: 在计算机领域,同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去:异步是指进程不需要一直等下去,而是继续 ...
- ElasticSearch 分组查询的几个例子
facets接口可以根据query返回统计数据,其中的 terms_stats 是分组统计,根据key的情况返回value的统计数据,类似group by的意思. "terms_stats& ...
- 牛客OI周赛8-普及组
https://ac.nowcoder.com/acm/contest/543#question A. 代码: #include <bits/stdc++.h> using namespa ...
- array_filter与array_map
php数组array_filter函数和array_slice函数:<?php /* array_filter()用回调函数过滤数组中的单元 array_filter(array,functio ...
- [转帖]Runtime, Engine, VM 的区别是什么?
这就是个WiFi和WLAN关系的问题嘛.Runtime是指用于支持程序运行时的组件,它可以是个Engine和/或VM.VM是一种系统抽象,它提供代码执行所需的API环境.Engine是一种处理抽象,它 ...
- BPM与OA的区别
近年来,随着计算机技术的发展和互联网时代的到来,我们已经进入了信息时代,也称为数字化时代,在这数字化的时代里,企业的经营管理都受到了极大的挑战.从上世纪90年代起至今,企业的信息化工作开展的如火如荼, ...