BZOJ 2653: middle|主席树
来源:互联网 发布:焦作淘宝网络公司 编辑:程序博客网 时间:2024/06/05 22:38
这题思路确实比较难想!建主席树也是非常的特别!
考虑二分答案,如果当前check的答案是
非常神的建树方式,从小到大插入数,插入的权值是这个数的位置!!!
正好和我们的正常思路反着…
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<queue>#include<vector>#include<set>#include<map>#include<iostream>#include<algorithm>#define ll unsigned long long#define N 20022#define mx 1e9using namespace std;int sc(){ int i=0,f=1; char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i*f;}struct W{int v,pos;}h[N];int sum[N*500],lmx[N*500],rmx[N*500],ch[N*500][2];int root[N],q[4];int n,m,cnt,ans;bool cmp(W a,W b){return a.v<b.v;}void push_up(int x){ sum[x]=sum[ch[x][0]]+sum[ch[x][1]]; lmx[x]=max(lmx[ch[x][0]],sum[ch[x][0]]+lmx[ch[x][1]]); rmx[x]=max(rmx[ch[x][1]],sum[ch[x][1]]+rmx[ch[x][0]]);}void build(int &x,int l,int r){ if(!x)x=++cnt; if(l==r) { sum[x]=lmx[x]=rmx[x]=1; return; } int mid=l+r>>1; build(ch[x][0],l,mid); build(ch[x][1],mid+1,r); push_up(x);}void add(int pre,int &x,int l,int r,int v,int f){ if(!x)x=++cnt; if(l==r) { lmx[x]=rmx[x]=sum[x]=f; return; } int mid=l+r>>1; if(v<=mid) ch[x][1]=ch[pre][1],add(ch[pre][0],ch[x][0],l,mid,v,f); else ch[x][0]=ch[pre][0],add(ch[pre][1],ch[x][1],mid+1,r,v,f); push_up(x);}int ask_all(int x,int L,int R,int l,int r){ if(L==l&&R==r)return sum[x]; int mid=L+R>>1; if(r<=mid)return ask_all(ch[x][0],L,mid,l,r); else if(l>mid)return ask_all(ch[x][1],mid+1,R,l,r); return ask_all(ch[x][0],L,mid,l,mid)+ask_all(ch[x][1],mid+1,R,mid+1,r);}int ask_left(int x,int L,int R,int l,int r){ if(L==l&&R==r)return lmx[x]; int mid=L+R>>1; if(r<=mid)return ask_left(ch[x][0],L,mid,l,r); else if(l>mid)return ask_left(ch[x][1],mid+1,R,l,r); return max(ask_left(ch[x][0],L,mid,l,mid),ask_all(ch[x][0],L,mid,l,mid)+ask_left(ch[x][1],mid+1,R,mid+1,r));}int ask_right(int x,int L,int R,int l,int r){ if(L==l&&R==r)return rmx[x]; int mid=L+R>>1; if(r<=mid)return ask_right(ch[x][0],L,mid,l,r); else if(l>mid)return ask_right(ch[x][1],mid+1,R,l,r); return max(ask_right(ch[x][1],mid+1,R,mid+1,r),ask_all(ch[x][1],mid+1,R,mid+1,r)+ask_right(ch[x][0],L,mid,l,mid));}bool check(int x,int a,int b,int c,int d){ int sum=ask_left(root[x],1,n,c,d)+ask_right(root[x],1,n,a,b); if(b+1<c) sum+=ask_all(root[x],1,n,b+1,c-1); return sum>=0;}int main(){ n=sc(); for(int i=1;i<=n;i++) h[i].v=sc(), h[i].pos=i; sort(h+1,h+n+1,cmp); build(root[1],1,n); for(int i=2;i<=n;i++) add(root[i-1],root[i],1,n,h[i-1].pos,-1); m=sc(); for(int i=1;i<=m;i++) { for(int j=0;j<4;j++) q[j]=(sc()+ans)%n+1; sort(q,q+4); int l=1,r=n;ans=1; while(l<=r) { int mid=l+r>>1; if(check(mid,q[0],q[1],q[2],q[3]))ans=mid,l=mid+1; else r=mid-1; } printf("%d\n",ans=h[ans].v); } return 0;}
0 0
- 【主席树】 BZOJ 2653 middle
- 【主席树】BZOJ 2653 middle
- BZOJ 2653: middle|主席树
- Bzoj 2653 middle(二分+主席树)
- BZOJ 2653 middle 二分+主席树
- [主席树 二分答案] BZOJ 2653 middle
- bzoj 2653: middle (二分+主席树)
- BZOJ 2653: middle 主席树+二分
- bzoj 2653 middle 二分答案 主席树判定
- 【BZOJ 2653】middle 主席树好题推荐
- HYSBZ 2653middle(二分+主席树)
- [BZOJ2653]middle-主席树
- 【BZOJ2653】【二分法】【主席树】middle
- bzoj2653 Middle 二分&主席树
- [主席树+二分] BZOJ2653: middle
- bzoj 2653 二分+主席树
- [BZOJ]2653: middle 线段树合并+二分
- bzoj 2653: middle(陈立杰)
- java分布式对象——远程方法中的参数和返回值+远程对象激活
- eclipse对话框没下拉框时,在极端情况下遇到的一个小问题
- 【Codeforces38G】Queue【Splay】【二分】
- Android自定义Dialog
- memcached 常用方法介绍
- BZOJ 2653: middle|主席树
- hdoj 2032 杨辉三角
- Maven的生命周期
- HDU 5631 (BestCoder Round #73 (div.1) 1001)Rikka with Graph(并查集)
- react-native启动异常,react-deep-force-update/.babelrc
- iOS 9中需要使用 QQ/QQ空间/支付宝/微信SDK 的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码
- 浪漫爱心--第三方开源--PeriscopeLayout
- apt-get的update和upgrade的区别
- 老男孩Linux运维04-配置secureCRT远程连接Linux及功能配置