【BZOJ】1878: [SDOI2009]HH的项链 (主席树)
发布日期:2021-08-14 08:51:16 浏览次数:2 分类:技术文章

本文共 1434 字,大约阅读时间需要 4 分钟。

题目

 


分析

莫队也能做,但我想练练主席树。

求k-th一样维护第i个时候的线段树,线段树来维护区间不同数。

然后查询时可以通过上下界小优化一波。

但是我的代码丑陋无比,常数巨大(捂脸

 


 

代码

#include 
using namespace std;const int maxn=50007;int ls[maxn<<6], rs[maxn<<6], sum[maxn<<6], newp, root[maxn<<6];int last[1000007];inline int in(){ int x=0;char ch=getchar(); while(ch<'0'||ch>'9'){ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x;}void add(int l,int r,int x,int& cur,int cur1,int val){ cur=++newp; ls[cur]=ls[cur1]; rs[cur]=rs[cur1];// root[i]=root[i-1] sum[cur]=sum[cur1]+val; if(l==r) return; int mid=l+r>>1; if(x<=mid) add(l,mid,x,ls[cur],ls[cur1],val); else add(mid+1,r,x,rs[cur],rs[cur1],val);}int query(int l,int r,int cnt,int cnt1,int L){ if(l>=L) return sum[cnt1]-sum[cnt]; int mid=l+r>>1,ans=0; if(mid>=L) ans+=query(l,mid,ls[cnt],ls[cnt1],L); ans+=query(mid+1,r,rs[cnt],rs[cnt1],L); return ans;}int main(){ int n=in(); for(int i=1;i<=n;i++) { int x,temp; x=in(); if(last[x]) { add(1,n,last[x],root[i],root[i-1],-1); add(1,n,i,root[i],root[i],1); } else { add(1,n,i,root[i],root[i-1],1); } last[x]=i; } int q; q=in(); for(int i=1;i<=q;i++) { int l,r; l=in(); r=in(); printf("%d\n",query(1,n,root[l-1],root[r],l)); }}
View Code

 

 

转载于:https://www.cnblogs.com/noblex/p/8412636.html

转载地址:https://blog.csdn.net/weixin_30716141/article/details/95501862 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:TCP(二)
下一篇:WPF 大数据加载过程中的等待效果——圆圈转动

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年03月26日 16时20分29秒