IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> # CF1572B Xor of 3(构造) -> 正文阅读

[C++知识库]# CF1572B Xor of 3(构造)

解析

你CF还是你CF

省选刷到2017再往前不是很想做了,就来CF玩一玩。
再次感受到被CF浅颜色构造虐的快感
本题靠着各种乱搞特判在WA了无数次之后艹过去了。
根本没有什么正确性的玄学做法,但是看CF数据似乎把 n n n 较小的所有情况全都pia到数据里了,小数据全都能正确,这题大数据也没有什么hack的优势,那它可能真的是对的…

还是来看看优美简洁的正解吧。
不难发现操作前后异或和不变,因此如果整体异或和为1必然无解。
考虑奇数怎么做。
分别对 ( n ? 2 , n ) , ( n ? 4 , n ? 2 ) , ( n ? 6 , n ? 4 ) . . . ( 1 , 3 ) (n-2,n),(n-4,n-2),(n-6,n-4)...(1,3) (n?2,n),(n?4,n?2),(n?6,n?4)...(1,3) 操作一次,这样序列就变成了 0 a a b b c c . . . 0aabbcc... 0aabbcc... 的样子。
然后再对 ( 1 , 3 ) ( 3 , 5 ) . . . ( n ? 2 , n ) (1,3)(3,5)...(n-2,n) (1,3)(3,5)...(n?2,n) 做一次即可。

如果是偶数,就找到一段异或和为0的前缀,然后前后分别做即可。
如果找不到,序列就一定长成 10000...0001 10000...0001 10000...0001 的样子,这个时候是无解的(样例也已经给出)。

代码

尽管正解非常好写,但还是懒得写了…
贴上我艰苦奋战出的乱搞代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
using namespace std;

const int N=3e5+100;
const int M=2e5+100;
const int inf=2e9+100;

inline ll read(){
    ll x(0),f(1);char c=getchar();
    while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    return x*f;
}

int n,m;
int a[N],ans[N],num;
int s[N];
bool flag;
inline int calc(int l,int r){
	assert(r-l+1==3);
	return a[l]^a[l+1]^a[r];
}
inline void rev(int l,int r){
	int o=calc(l,r);
	for(int i=l;i<=r;i++) a[i]=o;
	ans[++num]=l;	
}

void workl(int p){
	if(p==0) return;
	if(a[p]){
		if(a[p-1]) rev(p-1,p+1);
		else if(a[p-2]) rev(p-2,p);
		else{
			rev(p-2,p);
			rev(p-1,p+1);
		}
	}
	workl(p-1);	
}
void workr(int p){
	if(p==n+1) return;
	if(a[p]){
		if(a[p+1]) rev(p-1,p+1);
		else if(a[p+2]) rev(p,p+2);
		else{
			rev(p,p+2);rev(p-1,p+1);
		}
	}
	workr(p+1);
}

bool find(int l,int r){
	if(calc(l,r)) return false;
	//debug("%d %d\n",l,r);
	if(s[l-1]%2==0){
		rev(l,r);
		workl(l-1);
		workr(r+1);
		return true;
	}
	int x=l,y=r;
	while(l>1&&a[l-1]==0) l--;
	while(r<n&&a[r+1]==0) r++;
	if((r-l+1)%2==1){
		rev(x,y);
		while(l<=r){
			rev(l-1,l+1);
			l+=2;
		}
		workl(r-2);
		workr(r+2);
		return true;
	}
	//debug("1");
	if((r-l+1)%2==0&&l-2>=1){
		if(a[l-2]==0){
			rev(l-2,l);
			l++;
		}
	}
	if((r-l+1)%2==0&&r+2<=n){
		if(a[r+2]==0){
			rev(r,r+2);
			r--;
		}
	}
	if((r-l+1)%2==1){
		while(l<=r){
			rev(l-1,l+1);
			l+=2;
		}
		workl(r-2);
		workr(r+2);
		return true;
	}
	//debug("2");
	return false;
}
void work(){
	num=0;
	flag=0;
	int cnt(0);
	n=read();
	for(int i=1;i<=n;i++){
		a[i]=read(),cnt+=a[i];
		//s[i]=s[i-1]+a[i];
		//debug("%d ",a[i]);
	}
	//debug("\n");
	if(cnt&1){
		puts("NO");return;
	}
	for(int i=1;i+2<=n;i++){
		if(find(i,i+2)){
			flag=1;break;
		}
		else if(a[i]&&!a[i+1])rev(i,i+2);
		s[i]=s[i-1]+a[i];
	}
	if(!flag){
		for(int i=1;i+2<=n;i++){
			if(find(i,i+2)){
				flag=1;break;
			}
			s[i]=s[i-1]+a[i];
		}
	}
	if(flag){
		puts("YES");
		printf("%d\n",num);
		//assert(num<=n);
		for(int i=1;i<=num;i++) printf("%d ",ans[i]);
		puts("");
	}
	else puts("NO");
}
int clo;
signed main(){
#ifndef ONLINE_JUDGE
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
#endif
    int T=read();
    while(T--){
    	//debug("%d\n",++clo);
    	work();
	}
    return 0;
}
/*
*/

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:20:07  更:2022-03-22 20:20:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:13:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码