社区讨论

建议改为:人 傻 常 数 大

P4113[HEOI2012] 采花参与者 4已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@locydyy8
此快照首次捕获于
2023/10/30 21:46
2 年前
此快照最后确认于
2023/11/05 08:07
2 年前
查看原帖

如题

本蒟蒻莫队优化到飞起来了依旧133
CPP
#include<iostream>

#include<cstdio>

#include<cmath>

#include<algorithm>

using namespace std;

#define re register

const int N=2*1e6+100;

int num[N],col[N],ans[N];

int n,m,c,xx,sum;

struct query{

    int l,r,id,be;

}q[N];

inline int read(){

    char ch=getchar();

    int n=0 , f=1;

    while(('0' > ch || ch > '9') && (ch != '-')) ch=getchar();

    if(ch == '-') f=-1 , ch=getchar();

    while('0' <= ch && ch <= '9') n=(n << 1)+(n << 3)+(ch ^ 48) , ch=getchar();

    return f*n; 

}

bool cmp(query a,query b){

    return a.be^b.be?a.l<b.l:a.be&1?a.r<b.r:a.r>b.r;

}

inline void add(int x){

    col[x]++;

    if(col[x]==2)sum++;

}

inline void del(int x){

    col[x]--;

    if(col[x]==1)sum--;

}

int main(){

    re int l=0,r=0;

    n=read();c=read();m=read();

    xx=sqrt(n);

    for(re int i=1;i<=n;i++){

        num[i]=read();

    }

    for(re int i=1;i<=m;i++){

        q[i].l=read();q[i].r=read();

        q[i].id=i;q[i].be=q[i].l/xx+1;

    }

    sort(q+1,q+m+1,cmp);

    for(re int i=1;i<=m;i++){

        while(l<q[i].l)del(num[l++]);

        while(l>q[i].l)add(num[--l]);

        while(r<q[i].r)add(num[++r]);

        while(r>q[i].r)del(num[r--]);

        ans[q[i].id]=sum;

    }

    for(re int i=1;i<=m;i++){

        cout << ans[i] << endl;

    }

    return 0;

}

回复

7 条回复,欢迎继续交流。

正在加载回复...