struct Query{
int l,r,id,block;
Query(){}
Query(int L,int R,int ID):l(L),r(R),id(ID){
block=l/len;
}
bool operator <(const Query rhs)const{
if(block==rhs.block) return r<rhs.r;
else return block<rhs.block;
}
}query[maxn];
//对块排序
sort(query+1,query+q+1);
//符合条件,区间ans就++
int l=1,r=0,ans=0;
for(int i=1;i<=q;i++){
while(r<query[i].r){
r++;
if(!num[fa[r]]++) ans++;
}
while(r>query[i].r){
if(!--num[fa[r]]) ans--;
r--;
}
while(l<query[i].l){
if(!--num[fa[l]]) ans--;
l++;
}
while(l>query[i].l){
l--;
if(!num[fa[l]]++) ans++;
}
an[query[i].id]=ans;
}
模板:莫队算法
最新推荐文章于 2023-02-10 17:48:15 发布