0分求调
查看原帖
0分求调
981551
DGFLSzfd楼主2024/8/20 11:56

题目:P1972 [SDOI2009] HH的项链,莫队模版

我不知为什么又wa又tle,明明就是模版。求大佬调试

#include<bits/stdc++.h>
using namespace std;
inline void write(int x){
    if(x==0){putchar('0');return;}
	int len=0,k1=x,c[10005];
	if(k1<0)k1=-k1,putchar('-');
	while(k1)c[len++]=k1%10+'0',k1/=10;
	while(len--)putchar(c[len]);
}
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
const int N=1e6+10,M=1e6+10;
int n,m;

int block_size,pos[N],v[N];

struct Q
{
	int l,r,k;
}question[M];

int ans[M],res=0;
int cnt[N]={0};
void Add(int x){ if( (++cnt[v[x]]) ==1) res++;}
void Sub(int x){ if( (--cnt[v[x]]) ==0) res--;}

int main()
{
	freopen("dm.txt","r",stdin);
	freopen("sb.txt","w",stdout);
	n=read();
	block_size=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		v[i]=read();
		pos[i]=i/block_size;
	}
	m=read();
	for(int i=1;i<=m;i++)
	{
		question[i].l=read();question[i].r=read();
		question[i].k=i;
	}
	
	sort(question+1,question+m+1, [](Q x ,Q y) 
	{
		return pos[x.l]^pos[y.l]?pos[x.l]<pos[y.l]:(pos[x.l]&1?x.r<y.r:x.r>y.r); 
		//return pos[x.l]==pos[y.l]?x.r<y.r:pos[x.l]<pos[y.l];
	});
	
	
	int l=1,r=0;
	for(int i=1;i<=m;i++)
	{
		
		while(question[i].l<l) Add(--l);
		while(question[i].r>r) Add(++r);
		while(question[i].l>l) Sub(l++);
		while(question[i].r<r) Sub(r--);
	//	cout<<question[i].k<<" "<<l<<" "<<r<<endl;
		ans[question[i].k]=res;
	}
	for(int i=1;i<=m;i++)
		cout<<ans[question[i].k]<<endl;
		
	return 0;
}

2024/8/20 11:56
加载中...