博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ3267 D-query(主席树模版)
阅读量:6682 次
发布时间:2019-06-25

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

题意:

给一个序列,问区间内有多少个不相同的数

思路:

主席树模版,按斌巨的模版写了一发orz

/* ***********************************************Author        :devil************************************************ */#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int mod=1e9+7;const int N=3e4+10;const int M=N*100;int n,q,tot,x,y;int a[N],T[N],ls[M],rs[M],c[M];int build(int l,int r){ int node=tot++; c[node]=0; if(l!=r) { int mid=(l+r)>>1; ls[node]=build(l,mid); rs[node]=build(mid+1,r); } return node;}int update(int node,int pos,int val){ int newnode=tot++,tmp=newnode; c[newnode]=c[node]+val; int l=1,r=n; while(l
>1; if(pos<=mid) { ls[newnode]=tot++; rs[newnode]=rs[node]; newnode=ls[newnode]; node=ls[node]; r=mid; } else { rs[newnode]=tot++; ls[newnode]=ls[node]; newnode=rs[newnode]; node=rs[node]; l=mid+1; } c[newnode]=c[node]+val; } return tmp;}int query(int node,int pos){ int ret=0,l=1,r=n; while(pos
>1; if(pos<=mid) { r=mid; node=ls[node]; } else { ret+=c[ls[node]]; node=rs[node]; l=mid+1; } } return ret+c[node];}int main(){ //freopen("in.txt","r",stdin); while(~scanf("%d",&n)) { tot=0; for(int i=1;i<=n;i++) scanf("%d",&a[i]); T[n+1]=build(1,n); map
mp; for(int i=n;i>=1;i--) { if(mp.find(a[i])==mp.end()) T[i]=update(T[i+1],i,1); else { int tmp=update(T[i+1],mp[a[i]],-1); T[i]=update(tmp,i,1); } mp[a[i]]=i; } scanf("%d",&q); while(q--) { scanf("%d%d",&x,&y); printf("%d\n",query(T[x],y)); } } return 0;}

 

转载于:https://www.cnblogs.com/d-e-v-i-l/p/5765369.html

你可能感兴趣的文章
第四、五章解决队列和串的编程问题
查看>>
包失效,无法编译
查看>>
linux 配置全用户的环境变量,profile.d文件的作用
查看>>
程序员成长之路
查看>>
linux邮件服务器配置
查看>>
HTML5学习笔记(二)——表单1
查看>>
我的友情链接
查看>>
docker笔记
查看>>
三层交换机与路由器的相关配置
查看>>
html表单笔记
查看>>
我的友情链接
查看>>
nginx负载均衡的5种策略
查看>>
MyBatis学习总结(三)——优化MyBatis配置文件中的配置
查看>>
翻译软件开发(do it yourself)
查看>>
《Java程序员的基本修养》读书笔记之内存回收
查看>>
鸟哥私房菜重温6
查看>>
适用于ASP等环境的JS日期选择控件
查看>>
c语言学习记录--求出1000以内所有完数,并输出其因子
查看>>
cisco nat配置
查看>>
配置YUM服务器[(图文)附禁ROOT方法]
查看>>