社区讨论

166pts TLE #10 莫队求卡常

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mk3ltsdw
此快照首次捕获于
2026/01/07 13:55
上个月
此快照最后确认于
2026/01/10 15:10
上个月
查看原帖
真的不想写树状数组啊 qwq。
CPP
#include<bits/stdc++.h>
using namespace std;
int pos[3000005],a[3000005],cnt[3000005],res,f[3000005];
struct query
{
    int l,r,id;
}q[3000005];
inline bool cmp(const query &x,const query &y)
{
    if(pos[x.l]!=pos[y.l])
        return pos[x.l]<pos[y.l];
    if(pos[x.l]&1)
        return x.r>y.r;
    return x.r<y.r;
}
inline void del(const int &x)
{
    --cnt[a[x]];
    if(!(cnt[a[x]]-1))
        --res;
}
inline void add(const int &x)
{
    ++cnt[a[x]];
    if(cnt[a[x]]==2)
        ++res;
}
inline int read()
{
    register int num=0;
    register bool flag=1;
    register char c;
    c=getchar_unlocked();
    while(!isdigit(c))
    {
        if(c=='-')
            flag=0;
        c=getchar_unlocked();
    }
    while(isdigit(c))
    {
        num=(num<<3)+(num<<1)+(c^48);
        c=getchar_unlocked();
    }
    return (flag?num:-num);
}
inline void write(int x)
{
    if(x==0)
    {
        putchar_unlocked('0');
        return;
    }
    if(x<0)
    {
        putchar_unlocked('-');
        x=-x;
    }
    char num[50];
    register int len=0;
    while(x)
    {
        num[len++]=(x%10)+'0';
        x/=10;
    }
    while(len--)
        putchar_unlocked(num[len]);
}
int main()
{
    register int n=read(),c=read(),block=sqrt(n),i,m=read(),l=1,r=0,x,tmp=0;
    int ans[3000005];
    for(i=1;i<=n;++i)
    {
        x=read();
        if(!f[x])
            f[x]=++tmp;
        a[i]=f[x];
        pos[i]=(i-1)/block+1;
    }
    for(i=1;i<=m;++i)
    {
        q[i].l=read();
        q[i].r=read();
        q[i].id=i;
    }
    sort(q+1,q+1+m,cmp);
    register int ql,qr;
    for(i=1;i<=m;++i)
    {
        ql=q[i].l,qr=q[i].r;
        while(l<ql)
            del(l++);
        while(qr<r)
            del(r--);
        while(ql<l)
            add(--l);
        while(r<qr)
            add(++r);
        ans[q[i].id]=res;
    }
    for(i=1;i<=m;++i)
    {
        write(ans[i]);
        putchar('\n');
    }
    return 0;
}

回复

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

正在加载回复...