首页 > 代码库 > BZOJ 1878 HH的项链
BZOJ 1878 HH的项链
不能分块(显然复杂度会炸啊。。。。。)
离线+BIT。每个颜色在每个询问中只出现一次。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define maxn 50050#define maxm 200050#define maxc 1000500using namespace std;int n,a[maxn],aft[maxn],pre[maxn],regis[maxc],ans[maxm],m,p=1,t[maxn];struct query{ int l,r,id;}q[maxm];bool cmp(query x,query y){ if (x.l==y.l) return x.r<y.r; return x.l<y.l;}int lowbit(int x){ return (x&(-x));}void add(int x,int val){ for (int i=x;i<=n;i+=lowbit(i)) t[i]+=val;}int ask(int x){ int ret=0; for (int i=x;i>=1;i-=lowbit(i)) ret+=t[i]; return ret;}int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); pre[i]=regis[a[i]];aft[pre[i]]=i; regis[a[i]]=i; } scanf("%d",&m); for (int i=1;i<=m;i++) { scanf("%d%d",&q[i].l,&q[i].r); q[i].id=i; } for (int i=1;i<=n;i++) { if (!pre[i]) add(i,1); if (!aft[i]) aft[i]=n+1; } sort(q+1,q+m+1,cmp); for (int i=1;i<=m;i++) { for (int j=p;j<=q[i].l-1;j++) { add(j,-1);add(aft[j],1); } p=q[i].l; ans[q[i].id]=ask(q[i].r)-ask(q[i].l-1); } for (int i=1;i<=m;i++) printf("%d\n",ans[i]); return 0;}
BZOJ 1878 HH的项链
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。