hdu5919 Sequence II(主席树)
来源:互联网 发布:淘宝如何申请售后 编辑:程序博客网 时间:2024/05/14 18:35
题目链接:
hdu5919
题意:
给你n(
题解:
1、我们利用主席树记录相同的数的前一个位置是多少,很容易得到区间有多少个不同的数,但是我们要得到第(k+1)/2这个数的话我们要二分去求解。时间复杂度为
2、如果我们从后往前的话在当前位置
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<sstream>#include<algorithm>#include<vector>#include<bitset>#include<set>#include<queue>#include<stack>#include<map>#include<cstdlib>#include<cmath>#define PI 2*asin(1.0)#define LL long long#define pb push_back#define pa pair<int,int>#define clr(a,b) memset(a,b,sizeof(a))#define lson lr<<1,l,mid#define rson lr<<1|1,mid+1,r#define bug(x) printf("%d++++++++++++++++++++%d\n",x,x)#define key_value ch[ch[root][1]][0]const int MOD = 1000000007;const int N = 2e5 + 15;const int maxn = 100+ 14;const int letter = 130;const int INF = 1e9;const double pi=acos(-1.0);const double eps=1e-8;using namespace std;inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}int n,q,pre[N],a[N],sum[N*36],ls[N*36],rs[N*36],root[N];int siz,ps[N];void insert(int x,int &y,int l,int r,int d,int v){ y=++siz; ls[y]=ls[x],rs[y]=rs[x],sum[y]=sum[x]+v; if(l==r) return; int mid=(l+r)>>1; if(d<=mid) insert(ls[x],ls[y],l,mid,d,v); else insert(rs[x],rs[y],mid+1,r,d,v);}int query(int x,int l,int r,int ll,int rr){ if(ll<=l&&r<=rr) return sum[x]; int mid=(l+r)>>1; int ans=0; if(ll<=mid) ans+=query(ls[x],l,mid,ll,rr); if(rr>mid) ans+=query(rs[x],mid+1,r,ll,rr); return ans;}int find_k(int x,int l,int r,int k){ if(l==r) return l; int mid=(l+r)>>1; if(sum[ls[x]]>=k) return find_k(ls[x],l,mid,k); else return find_k(rs[x],mid+1,r,k-sum[ls[x]]);}int main(){ int T,cas=0; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&q); clr(pre,0),siz=0; clr(root,0); for(int i=1;i<=n;i++) scanf("%d",a+i); for(int i=n;i;i--){ insert(root[i+1],root[i],1,n,i,1); if(pre[a[i]]) insert(root[i],root[i],1,n,pre[a[i]],-1); pre[a[i]]=i; } ps[0]=0; for(int i=1;i<=q;i++){ int l,r; scanf("%d%d",&l,&r); l=(l+ps[i-1])%n+1,r=(r+ps[i-1])%n+1; if(l>r) swap(l,r); int mid=query(root[l],1,n,l,r); mid=(mid+1)/2; ps[i]=find_k(root[l],1,n,mid); } printf("Case #%d:",++cas); for(int i=1;i<=q;i++) printf(" %d",ps[i]); puts(""); } return 0;}
0 0
- HDU5919 Sequence II (主席树)
- hdu5919 Sequence II(主席树)
- hdu5919 Sequence II(主席树,区间第k大)
- 【HDU5919】Sequence II——主席树+二分
- hdu5919 Sequence II(主席树求第k小)
- hdu5919 Sequence II(主席树求区间数种数和k大查找)
- hdu5919:Sequence II(可持久化线段树)
- HDU5919-Sequence II
- [HDU 5919] Sequence II (主席树)
- HDU 5919-Sequence II(主席树)
- hdu5919 主席树求区间不同数
- 主席树,开坑POJ2104,EOJ3335&hdu6162,hdu5919
- 2016CCPC长春:Sequence II(主席树)
- HDU 5919 Sequence II(主席树)
- hdu 5919 Sequence II 主席树
- HDU 5919 Sequence II(主席树)
- hdoj 5919 Sequence II 【主席树】
- HDU 5919 Sequence II(主席树)
- 选中一个复选框获取他的name
- 设计模式(2) 策略模式--行为型
- Navicat for oracle 提示 cannot load OCI DLL,126 193的解决方法
- const的用法,特别是用在函数前面与后面的区别!
- nginx变量
- hdu5919 Sequence II(主席树)
- 知识管理软件之四 图文编辑--任性动图
- ASP.NET MVC中切换模板页(不同目录的cshtml文件)
- 用DIV遮罩解决checkbox勾选无效的问题
- Android support Repository
- Python(十三)面向对象 -继承、多态
- APK在Android Studio中位置
- 使用common-fileupload 后台获取不到数据
- rtmp协议规范