HDU 5919Sequence II (主席树,不同元素个数+第K大)
来源:互联网 发布:淘宝客推广专区在哪里 编辑:程序博客网 时间:2024/06/06 10:55
题意:
看别人写的题意没看懂。。建议去看题,提示写的很明白。
大体意思是,找到处理过后的l~r区间中, 假设不同元素个数为k , 则就找l~r中的 --- 不同元素的脚标,从小到大排序后 ---第(k+1)/2个元素
思路:
倒序方式来处理n个数字,得到K个不同数字(主席树类型题模板),再从中拿第k个元素(此时和第k大元素处理方法相同,只不过第k大元素模板题是排序,去重过后,此题直接处理原主席树即可,看代码比较清晰易懂一些)。
此题竟然要开40*maxn。。
数组开小了。各种毛病都有。。(TLE,ME,WA)。。数组开大一点
#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;const int maxn=200005;struct node{ int lc,rc,num,val;} tree[maxn*40];int cnt,cnt2,rnu,now;int a[maxn];int num[maxn];int has[maxn];int root[maxn ];void build(int &i,int l,int r){ tree[++cnt]=tree[i]; i=cnt; tree[i].num=0; if(l==r) return ; int mid=(l+r)>>1; build(tree[i].lc,l,mid); build(tree[i].rc,mid+1,r);}void update(int &i,int l,int r,int w,int pos){ tree[++cnt]=tree[i]; i=cnt; tree[i].num+=w; if(l==r) { return ; } int mid=(l+r)>>1; if(pos<=mid) update(tree[i].lc,l,mid,w,pos); else update(tree[i].rc,mid+1,r,w,pos);}int query(int i,int l,int r,int L,int R){ if(L<=l&&r<=R) return tree[i].num; int mid=(l+r)>>1; int ans=0; if(L<=mid) ans+=query(tree[i].lc,l,mid,L,R); if(R>mid) ans+=query(tree[i].rc,mid+1,r,L,R); return ans;}/// K-thint fd(int i,int l,int r,int k){ if(l==r) return r; int mid=(l+r)>>1; if(k<=tree[tree[i].lc].num) fd(tree[i].lc,l,mid,k); else fd(tree[i].rc,mid+1,r,k-tree[tree[i].lc].num);}int main(){ int T; scanf("%d",&T); for(int cs=1; cs<=T; cs++) { memset(has,0,sizeof(has)); int n,m; scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) scanf("%d",&num[i]) ; now=rnu=cnt=cnt2=0; build(root[n+1],1,n); for(int i=n;i>=1;i--) { int tmp; if(has[num[i]]) { update(tmp=root[i+1],1,n,-1,has[num[i]]); update(root[i]=tmp,1,n,1,i); } else update(root[i]=root[i+1],1,n,1,i); has[num[i]]=i; } int ans=0; printf("Case #%d: ",cs); for(int i=1; i<=m; i++) { int l,r; int tp1,tp2; scanf("%d%d",&l,&r); tp1=(l+ans)%n+1; tp2=(r+ans)%n+1; l=min(tp1,tp2); r=max(tp1,tp2); if(l>r) swap(l,r); int res=query(root[l],1,n,l,r); // printf("\n%d---%d ---%d\n",res,l,r); res=fd(root[l],1,n,(res+1)/2); if(i!=1) printf(" "); printf("%d",res); ans=res; } printf("\n"); }}
阅读全文
0 0
- HDU 5919Sequence II (主席树,不同元素个数+第K大)
- hdu5919 Sequence II(主席树,区间第k大)
- hdu 5919 Sequence II (主席树,求区间不同数的个数)
- hdu 5919 Sequence II(主席树,求区间不同数的个数)
- HDU 5919 Sequence II (主席树+求区间不同数个数)
- hdu 5919 主席树(区间不同数个数+区间第k个数)
- HDU 5919 Sequence II(主席树)
- hdu 5919 Sequence II 主席树
- HDU 5919 Sequence II(主席树)
- [HDU 5919] Sequence II (主席树)
- HDU 5919 Sequence II(主席树)
- HDU 5919 Sequence II 主席树
- HDU 5919 Sequence II 【主席树】
- HDU 5919 Sequence II 主席树
- [hdu 5919 Sequence II] 主席树
- hdu 5919 Sequence II(主席树)
- HDU 5919 Sequence II [主席树]【数据结构】
- hdu 5919 Sequence II(主席树)
- 【LeetCode】162. Find Peak Element
- 人脸肤色相似度检测——程序及运行结果
- FZU 1686神龙的难题 (重复覆盖)
- 23种设计模式全解析
- Servlet,报了一上午404和500的报错
- HDU 5919Sequence II (主席树,不同元素个数+第K大)
- keras构建卷积神经网络识别cifar10
- 如何用十条命令在一分钟内检查Linux服务器性能
- mod函数和rem函数的区别
- 231. Power of Two
- JS原生实现自定义滚动条
- kafka配置参数
- linux下PPPoE Server测试环境搭建
- SpringMVC报404的一种可能