头像
Leven_
发布于 2019-09-14 22:08
+ 关注

B题?

话说B题写了莫队,如果是T了可以理解,但是为什么WA了qwq?
莫非我写了个假莫队?(大佬勿喷)
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int ans=0,f=1;char chr=getchar();
	while(!isdigit(chr)){if(chr=='-')f=-1;chr=getchar();}
	while(isdigit(chr)) {ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
	return ans*f;
}const int M = 5e5+5;
struct P{int l,r,id;}q[M];
int n,a[M],pos[M],m,cnt[M],ans,Ans[M];
inline bool cmp(const P&x,const P&y){
	return pos[x.l]==pos[y.l]?x.r<y.r:pos[x.l]<pos[y.l];
}
inline void Add(int x){
	++cnt[a[x]];
	if(cnt[a[x]]==1) ans+=a[x];
}
inline void Del(int x){
	--cnt[a[x]];
	if(cnt[a[x]]==0) ans-=a[x];
}
int main(){
	n=read(),m=read();
	int block=sqrt(n*2/3);
	for(int i=1;i<=n;i++)a[i]=read(),pos[i]=i/block;
	for(int i=1,x,y;i<=m;i++)x=read(),y=read(),q[i]=(P){x,y,i};
	sort(q+1,q+m+1,cmp);
	int L=1,R=0;
	for(int i=1;i<=m;i++){
        while(L<q[i].l) Del(L++);
        while(L>q[i].l) Add(--L);
        while(R<q[i].r) Add(++R);
        while(R>q[i].r) Del(R--);
		Ans[q[i].id]=ans;
	}
	for(int i=1;i<=m;i++){
		printf("%d\n",Ans[i]);
	}
	return 0;
}


全部评论

(1) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐