28分神奇错误求调
查看原帖
28分神奇错误求调
554862
WSB662211楼主2024/12/3 19:33

在循环内输出正确,放dy数组里就会输出奇怪数字

#include<bits/stdc++.h>
using namespace std;
vector<int>wz[1000086];
int t[1000086];
struct xy{
	int x,y,i;
	bool operator<(const xy&a)const
	{
		return x!=a.x?x<a.x:y<a.y;
	}
}oppo[1000086];
int s[1000086];
int c[1000086];
int a[1000086];
int op[1000086];
void mk(int l,int r,int x)
{
	if(l==r){
		op[x]=s[l];
		return;
	}
	int md=l+r>>1;
	mk(l,md,x<<1);
	mk(md+1,r,x<<1|1);
	op[x]=op[x<<1]+op[x<<1|1];
}
void ist(int l,int r,int k,int s,int x)
{
	if(l==r){
		op[x]=s;
		return;
	}
	int md=l+r>>1;
	if(md>=k)ist(l,md,k,s,x<<1);
	else ist(md+1,r,k,s,x<<1|1);
	op[x]=op[x<<1]+op[x<<1|1];
}
int qst(int o,int p,int l,int r,int x)
{
	if(l<=o&&p<=r){
		return op[x];
	}
	int md=o+p>>1;
	int s=0;
	if(l<=md)s+=qst(o,md,l,r,x<<1);
	if(r>md)s+=qst(md+1,p,l,r,x<<1|1);
	return s;
}
int dy[1000086];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		wz[a[i]].push_back(i);
		if(++c[a[i]]==1){
			s[i]=1;
		}
	}
	mk(1,n,1);
	int m;
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&oppo[i].x,&oppo[i].y);
		oppo[i].i=i;
	}
	sort(oppo+1,oppo+m+1);
	int hd=1;
	for(int i=1;i<=m;i++)
	{
		while(hd<oppo[i].x){
			ist(1,n,hd,0,1);
			if(t[a[hd]]+1<wz[a[hd]].size()){
				ist(1,n,wz[a[hd]][t[a[hd]]+1],1,1);
				t[a[hd]]++;
			}
			hd++;
		}
		dy[oppo[i].i]=qst(1,n,oppo[i].x,oppo[i].y,1);
	}
	for(int i=1;i<=m;i++)
	{
		cout<<dy[i]<<endl;
	}
	return 0;
}
2024/12/3 19:33
加载中...