题解:CF1835C Twin Clusters
Petit_Souris · · 题解
这啥啊,我是真不会做。
设
发现我们如果选出一组左端点和右端点都不相同的区间,那么一定可以构造出解:如果不交直接作为答案,否则把相交部分同时删掉不影响异或值相等。
把值域分成高
考虑怎样找到这样的两个区间:设
#include<bits/stdc++.h>
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define pii pair<ll,ll>
#define rep(i,a,b) for(ll i=(a);i<=(b);++i)
#define per(i,a,b) for(ll i=(a);i>=(b);--i)
using namespace std;
bool Mbe;
ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void write(ll x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
const ll N=1e6+9;
ll T,k,n,a[N],bin[N],pl[N],pr[N];
void solve(){
k=read(),n=(2<<k);
rep(i,1,n)a[i]=read();
a[0]=0;
rep(i,1,n)a[i]^=a[i-1];
rep(i,0,n)bin[i]=pl[i]=pr[i]=-1;
bin[0]=0;
rep(i,1,n){
if(~bin[a[i]>>k]){
ll l=bin[a[i]>>k]+1,r=i,s=a[r]^a[l-1];
if(!~pl[s])pl[s]=l,pr[s]=r;
else {
if(pr[s]<l)write(pl[s]),putchar(' '),write(pr[s]),putchar(' '),write(l),putchar(' '),write(r);
else write(min(l,pl[s])),putchar(' '),write(max(l,pl[s])-1),putchar(' '),write(pr[s]+1),putchar(' '),write(r);
putchar('\n');
return ;
}
}
bin[a[i]>>k]=i;
}
}
bool Med;
int main(){
cerr<<fabs(&Med-&Mbe)/1048576.0<<"MB\n";
T=read();
while(T--)solve();
cerr<<"\n"<<clock()*1.0/CLOCKS_PER_SEC*1000<<"ms\n";
return 0;
}