首页 > 其他分享 >CF1863F Divide, XOR, and Conquer 题解

CF1863F Divide, XOR, and Conquer 题解

时间:2024-02-08 20:15:45浏览次数:23  
标签:XOR int 题解 ll highbit Conquer bigoplus operatorname neq

简要题意

你有两个指针 \(l,r\) 初始时 \(l=1,r=n\)。

你可以操作若干次知道 \(l=r\)。

每次操作你可以选择一个整数 \(k \in [l,r)\),记 \(x=\bigoplus_{i=l}^k a_i,y=\bigoplus_{i=k+1}^r a_i\)。

  • 如果 \(x \leq y\),你可以令 \(l=k+1\)。
  • 如果 \(x \geq y\),你可以令 \(r=k\)。

现在你需要对于每一个整数 \(i \in [1,n]\),求最后能否使 \(l=r=i\)。

\(n \leq 10000\),\(0 \leq a_i < 2^{60}\)。

做法

我们设 \(f_{x,y}\) 表示是否可以令 \(l=x,r=y\)。

首先我们考虑一个区间 \([x,y]\) 可以到达,那么什么样的区间可以被它转移到。

设 \(q=\bigoplus_{i=l}^r a_i\)。

  1. 如果 \(q=0\),那么区间 \([x,y]\) 可以转移到 \([x,x],[x,x+1]\dots [x,y-1]\) 和 \([x+1,y],[x+2,y]\dots [y,y]\)。
  2. 如果 \(q \neq 0\),我们设 \(h=\operatorname{highbit}(q)\)。
    • 考虑左端点右移转移到 \([t,y]\),那么必然有 \(\bigoplus_{i=t}^y a_i \operatorname{and} h \neq 0\)。
    • 考虑右端点左移转移到 \([x,t]\),那么必然有 \(\bigoplus_{i=x}^t a_i \operatorname{and}h \neq 0\)。

考虑按照区间长度从大到小枚举 \(x,y\),然后看 \(f_{x,y}\) 是否可以被转移到。

首先一个区间 \([l,r]\) 能转移到 \([x,y]\) 首先要有 \(l=x\) 或者 \(r=y\)。

然后就是 \(\operatorname{highbit}(\bigoplus_{i=l}^r a_i) \operatorname{and} (\bigoplus_{i=x}^ya_i) \neq 0\)。

我们记录两个辅助转移的数组 \(L,R\),分别表示用来转移 \(l=x\) 和 \(r=y\) 的情况。

看一个区间 \([x,y]\) 是否可以被转移到只需要看 \(\operatorname{highbit}(\bigoplus_{i=l}^r a_i) \operatorname{and} L_x \neq 0\) 和 \(\operatorname{highbit}(\bigoplus_{i=l}^r a_i) \operatorname{and} R_y \neq 0\) 就行,两者满足其一即可转移。

如果求出了一个区间 \([x,y]\) 可以到达,那么我们只需要令 \(L_x=L_x \operatorname{or} \operatorname{highbit}(\bigoplus_{i=l}^r a_i)\),\(R_y=R_y \operatorname{or} \operatorname{highbit}(\bigoplus_{i=l}^r a_i)\) 即可。

放个代码可能好理解一些。

#include<bits/stdc++.h>

#define ll long long

using namespace std;

const int MAXN = 1e5+5;
const int mod = 200003;

int n;
int c[MAXN], tot;

ll stateL[MAXN], stateR[MAXN];

bool dp[10002][10002];

ll a[MAXN], pre[MAXN];

inline ll rebuild(ll x){
	tot=0;
	while(x){
		c[++tot]=x&1;
		x>>=1;
	}
	while(tot<=60) c[++tot]=0;
	reverse(c+1,c+1+tot); x=0;
	for(int i=1;i<=tot;++i) x+=(ll)c[i]<<(i-1);
	return x;
}

inline ll lowbit(ll x){return x & -x;}

inline void solve(){	
	cin >> n; ll v;
	for(int i=1;i<=n;++i) stateL[i]=stateR[i]=0;
	for(int i=1;i<=n;++i) cin >> a[i], a[i]=rebuild(a[i]), pre[i]=pre[i-1]^a[i];
	for(int i=1;i<=n;++i) for(int j=i;j<=n;++j) dp[i][j]=0; dp[1][n]=1;
	for(int len=n;len>=1;--len){
		for(int l=1, r=l+len-1;r<=n;++l, ++r){
			v=pre[r]^pre[l-1]; v|=1ll<<61;
			dp[l][r]|=((stateL[l]&v)!=0);
			dp[l][r]|=((stateR[r]&v)!=0);
			if(dp[l][r]) stateL[l]|=lowbit(v), stateR[r]|=lowbit(v);
		}
	}	
	for(int i=1;i<=n;++i) putchar('0'+dp[i][i]); putchar(10);
	return ;
}

int main(){
	int t; cin >> t;
	while(t--) solve();
	return 0;
}

标签:XOR,int,题解,ll,highbit,Conquer,bigoplus,operatorname,neq
From: https://www.cnblogs.com/OccasionalDreamer/p/18012085

相关文章

  • P9663 Permutation on Tree 题解
    考虑枚举一个\(x\in[1,n)\),将\(\leqx\)的看作\(0\),\(>x\)的看作\(1\),那么一个排列的贡献实际上就是\(\sum_{x=1}^{n-1}\sum[[p_i\leqx]+[p_{i+1}>x]=1]\)。那么问题转变为一个给定一棵树,每一个点有权值\(0\)或\(1\),求所有排布方案的贡献之和。设\(f_x\)表示......
  • P9697 Canvas 题解
    首先观察到有一个关键性质是\(1\leqx_i,y_i\leq2\)。那么我们贪心的考虑我们肯定会将\((x,y)=(1,1)\)的在一开始操作,\((x,y)=(2,2)\)的最后操作。也就是说现在没有固定的是\((x,y)=(1,2)\)和\((x,y)=(2,1)\)的。我们不妨令\((x,y)=(1,2)\),然后连边\((l,r)\)。然......
  • P10013 Tree Topological Order Counting 题解
    首先题目里面写了每一个数都有权值,一般这种题只能去想求出每一个的具体方案数,那么也就是我们得求出\(h_{i,j}\)表示在所有合法拓扑序中\(a_i=j\)的方案数。一颗树的拓扑序数量是\(\dfrac{n!}{\prodsiz_i}\),相信大家都知道。因为我们需要保证这一棵树满足拓扑排序的条件,不......
  • P10068 [CCO2023] Line Town 题解
    好题,但是感觉写起来有点屎。题目大意给定一个序列\(a\),你每次可以选择\(i\in[1,n-1]\),交换\(a_i,a_{i+1}\),并且给\(a_i,a_{i+1}\)取相反数。问你最少需要多少次交换才能使得序列非降,可能无解。做法首先考虑给偶数位置初始乘上\(-1\),然后操作变成交换相邻两个数,下面提......
  • CF1706E 题解
    你谷题目传送门CF题目传送门题目大意给定一个\(n\)个点\(m\)条边的无向图,询问\(q\)次,每次询问会指定两个正整数\(l,r\),问要使对于\(l\leqa\leqb\leqr\)的所有\(a,b\)均有路径可以互相到达,最少需要加入前多少条边。思路考虑到每一次询问实质上就是问你在按......
  • [COCI2007-2008#1] ZAPIS 题解
    题目传送门前置知识区间型动态规划思考过程这题也算是一道很经典的问题了(?)。看见\(n\leq200\),不难想到复杂度为\(O(n^3)\)的区间型动态规划。题面中有这么一段话。空串是规则括号序列。如果\(\textttA\)是规则括号序列,那么\(\texttt{(A)[A]{A}}\)都是规则括号......
  • CF1735D Meta-set 题解
    题目大意给定\(n\)张卡牌,每张卡牌有\(k\)个属性,第\(i\)张卡牌的第\(j\)个属性为\(c_{i,j}\)。一个由\(3\)张卡牌\(x,y,z\)组成的集合被称作好的,当且仅当对于\(1\leqi\leqk\)均有\(c_{x,i}=c_{y,i}=c_{z,i}\)或者\(c_{x,i},c_{y,i},c_{z,i}\)两两不相等。......
  • CF1793E Velepin and Marketing 题解
    题目大意有\(n\)个读者,第\(i\)年他们要一起读\(k_i\)本书,每一本书至少要让一个人读,每一个人也只能读恰好一本书。如果某一个人\(j\),如果有\(a_j\)个人这一年里和他读了同一本书,那么他就会感到满足。对于所有的\(q\)组询问,每组给定一个\(k_i\),求感到满足的人数的最......
  • CF1735E House Planning 题解
    题目大意一条直线上有\(n\)个房子和两个人,房子的坐标\(d_1,d_2,d_3\dotsd_n\),以及两个人坐标为\(p_1,p_2\)。现在会告诉你两个集合\(S_1=\{|p_1-d_i|,1\leqi\leqn\}\)以及\(S_2=\{|p_2-d_i|,1\leqi\leqn\}\)。这个写法可能不是很规范,但为了美观就写成这样了。......
  • CF1847E Triangle Platinum? 题解
    感谢@swiftc管理反馈的信息,对于题目大意确定的东西进行了完善。交互题。题目大意有一个长度为\(n\)的序列\(a\)满足\(1\leqa_i\leq4\),现在你可以进行不超过\(5500\)次询问,每次询问询问三个数\(1\leqi<j<k\leqn\),你将会得到\(a_i,a_j,a_k\)构成的三角形......