D1. 388535 (Easy Version)

D1. 388535 (Easy Version)

题目大意:

题目意思是,给一个区间l~r(l=0),再给长度为r-l+1的数列a。

给一个序列a,0~r的一个排列要整体Xor 上一个x后可以得到给定的a,求出x。

思路和代码:

哇这道题真的麻了,题目里标红的0=l我没看见....导致坐牢...

这题题意也有点绕。他是给operated序列,去想original序列的过程。

我们写一下0到5的二进制,可以发现每一个二进制位的前缀0的数量一定大于等于前缀1的数量

哪一位违反了这个规律就要在x上加上那一位。

void solve(){
	ll l , r ; cin >> l >> r ;
	vct<vct<ll> > cnt(40 , vct<ll>(3 , 0)) ;
	
	rep(i , l , r){
		ll tmp ; cin >> tmp ;
		rep(j , 0 , 30 )
			cnt[j][(tmp >> j) & 1] ++ ;
	}
	ll ans = 0 ;
	rep(i , 0 , 30)
		if(cnt[i][1] > cnt[i][0]) ans += (1 << i) ;
	
	cout << ans << "\n" ;
	
}
小结:

二进制的题目常常需要一位一位拆分开来考虑。

这题是我第一次遇到考虑二进制位前缀的题目。

posted @ 2022-03-28 11:44  tyrii  阅读(160)  评论(0)    收藏  举报