萌新袜子求助
查看原帖
萌新袜子求助
238408
vectorwyxSD省选加油楼主2022/2/16 21:52

RT,我调试的时候把值域开成了 242^4 交上去 WA 了,改回 2142^{14} 就过了。但我第一次交的时候显示 read -,可是 VV 变小顶多会少统计一些合法对啊,为什么会出现负数?求大佬帮忙康康QAQ

//author:望远星
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sml(x,y) (x=min(x,y))
#define big(x,y) (x=max(x,y))
#define ll long long
#define ull unsigned long long
#define db double
#define fo(i,x,y) for(int i=x;i<=y;++i)
#define go(i,x,y) for(int i=x;i>=y;--i)
using namespace std;
inline int read(){int x=0,fh=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')fh=-1;ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*fh;}
inline void out(auto *a,int l,int r){fo(i,l,r) cout<<*(a+i)<<' ';puts("");}

const int N=1e5+5,V=1<<14|1;
int a[N],n,m,bel[N],k,l=1,r,b[N],B;
ll delta[N],suml[N],sumr[N],ans[N];
struct Ask{
	int l,r,num;
	bool operator<(const Ask &x)const{
		if(bel[l]!=bel[x.l]) return bel[l]<bel[x.l];
		return r<x.r;		
	} 
}A[N];
struct ChangE{ 
	int l,r,o,num;
	ChangE(){l=r=o=num=0;}
	ChangE(int x,int y,int z,int zz){l=x,r=y,o=z,num=zz;} 
};
vector<ChangE> g[N];
vector<int> qaq;

void dealR(int R,int id){//r->R
	if(R>r){
		delta[id]+=sumr[R]-sumr[r];
		g[l-1].pb(ChangE(r+1,R,-1,id));
	}else{
		delta[id]-=sumr[r]-sumr[R];
		g[l-1].pb(ChangE(R+1,r,1,id));
	}
	r=R;
}

signed main(){
	cin>>n>>m>>k;B=n/sqrt(m);
	fo(i,1,n) a[i]=read(),bel[i]=bel[i-1]+(i%B==1);
	fo(i,0,V) if(__builtin_popcount(i)==k) qaq.pb(i);
	//sumr:i到[1,i-1],用于处理挪动右端点的贡献 suml:i到[1,i],用于处理挪动左端点的贡献 
	//for(int i:qaq) cout<<i<<' ';putchar('\n');
	fo(i,1,n){
		sumr[i]=sumr[i-1]+b[a[i]];
		for(int j:qaq) b[j^a[i]]++;
		suml[i]=suml[i-1]+b[a[i]];
	}
	fo(i,1,m){
		A[i].l=read();
		A[i].r=read();
		A[i].num=i;
	}
	sort(A+1,A+1+m);
	fo(i,1,m){
		//printf("[%d,%d] %d\n",A[i].l,A[i].r,A[i].num);
		if(A[i].l<l){//l->A[i].l(扩展) 
			delta[i]-=suml[l-1]-suml[A[i].l-1];
			g[r].pb(ChangE(A[i].l,l-1,1,i));
			l=A[i].l;
			dealR(A[i].r,i); 
		}else{//蜷缩 
			dealR(A[i].r,i);
			delta[i]+=suml[A[i].l-1]-suml[l-1];
			g[r].pb(ChangE(l,A[i].l-1,-1,i));
			l=A[i].l;
		}
		//l=A[i].l,r=A[i].r;
	}
	fo(i,0,V) b[i]=0;
	fo(i,1,n){
		for(int j:qaq) b[j^a[i]]++;
		for(auto j:g[i])
			fo(w,j.l,j.r) delta[j.num]+=j.o*b[a[w]];
	}
	//out(delta,1,m);
	fo(i,1,m){
		delta[i]+=delta[i-1];
		ans[A[i].num]=delta[i];
	}
	fo(i,1,m) cout<<ans[i]<<'\n'; 
	return 0;
}
/*
-------------------------------------------------
*/


2022/2/16 21:52
加载中...