社区讨论
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 条回复,欢迎继续交流。
正在加载回复...