TLE on #7
查看原帖
TLE on #7
398152
MinimumSpanningTree最小生成树楼主2024/3/28 18:29
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+100,M=2e6+100;
int n,m,k,p[N],block;
ll c[M],cnt,ans[N],a[N];
struct node
{
	int x,y,id;
}q[N];
void build()
{
	block=sqrt(n);
	for(int i=1;i<=n;i++) p[i]=(i-1)/block+1;
}
bool cmp(node a1,node a2)
{
	if(p[a1.id]!=p[a2.id]) return p[a1.id]<p[a2.id];
	if(p[a1.id]%2==1) return a1.y>a2.y;
	else return a1.y<a2.y;
}
void add(int mst)
{
	cnt+=c[a[mst]^k];
	c[a[mst]]++;
}
void del(int mst)
{
	c[a[mst]]--;
	cnt-=c[a[mst]^k];
}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++) 
	{
		scanf("%lld",&a[i]);
		a[i]^=a[i-1]; 
	}
	build();
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&q[i].x,&q[i].y);
		q[i].x--,q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	for(int i=1,l=1,r=0;i<=m;i++)
	{
		while(l<q[i].x) del(l++);
		while(r>q[i].y) del(r--);
		while(l>q[i].x) add(--l);
		while(r<q[i].y) add(++r);
		ans[q[i].id]=cnt;
	}
	for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
	return 0;
}
2024/3/28 18:29
加载中...