玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
2017-08-05 17:15
483 查看
从零开始的异世界生活
题目链接:从零开始的异世界生活题意:
给一个集合,最开始为空(不是数学上的集合)
五个操作:
1、插入x
2、把小于x的数变成x
3、把大于x的数变成x
4、求集合中第x小数
5、求集合中小于x的数个数
思路:先将除了操作4以外的数离散化,然后建立线段树
对于操作1,插入x,直接将对应x的节点加1
对于操作2,先查询小于x的有多少个数k,然后将区间[1,x-1]全部置为0,将区间[x,x]+k
对于操作3,同操作2
对于操作4,二分枚举区间右端点,找到最适合的右端点即可
对于操作5,直接查询区间[1,x-1]
代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define ll rt<<1 #define rr rt<<1|1 #define lson ll,le,mid #define rson rr,mid+1,ri const int maxn=1e6+10; struct Question { int op,x; } Q[maxn]; struct Segtree { int val,le,ri,lazy; int mid() { return (le+ri)>>1; } } tree[maxn<<2]; int a[maxn]; int n; void Build(int rt,int le,int ri) { tree[rt].lazy=-1,tree[rt].val=0; tree[rt].le=le,tree[rt].ri=ri; if(le==ri) return ; int mid=tree[rt].mid(); Build(lson); Build(rson); } void Pushdown(int rt) { tree[ll].lazy=0; tree[rr].lazy=0; tree[ll].val=0; tree[rr].val=0; tree[rt].lazy=-1; } void Update(int rt,int le,int ri,int val,int op) { if(le<=tree[rt].le&&tree[rt].ri<=ri) { if(op==1)//op==1表示相加 tree[rt].val+=val; else//op==2表示赋值 { tree[rt].lazy=0; tree[rt].val=0; } return ; } if(tree[rt].lazy!=-1) Pushdown(rt); int mid=tree[rt].mid(); if(le<=mid) Update(ll,le,ri,val,op); if(ri>mid) Update(rr,le,ri,val,op); tree[rt].val=tree[ll].val+tree[rr].val; } int Query(int rt,int le,int ri) { if(le<=tree[rt].le&&tree[rt].ri<=ri) return tree[rt].val; if(tree[rt].lazy!=-1) Pushdown(rt); int mid=tree[rt].mid(),ans=0; if(le<=mid) ans+=Query(ll,le,ri); if(ri>mid) ans+=Query(rr,le,ri); tree[rt].val=tree[ll].val+tree[rr].val; return ans; } int main() { int m,x,y,tot=0; scanf("%d",&m); for(int i=1; i<=m; ++i) { scanf("%d%d",&Q[i].op,&Q[i].x); if(Q[i].op!=4) a[++tot]=Q[i].x; } sort(a+1,a+1+tot); n=unique(a+1,a+1+tot)-(a+1); Build(1,1,n); for(int i=1; i<=m; ++i) { if(Q[i].op==1) { x=lower_bound(a+1,a+1+n,Q[i].x)-a; Update(1,x,x,1,1); } else if(Q[i].op==2) { x=lower_bound(a+1,a+1+n,Q[i].x)-a; if(x>1) { y=Query(1,1,x-1); Update(1,1,x-1,0,2); Update(1,x,x,y,1); } } else if(Q[i].op==3) { x=lower_bound(a+1,a+1+n,Q[i].x)-a; if(x<n) { y=Query(1,x+1,n); Update(1,x+1,n,0,2); Update(1,x,x,y,1); } } else if(Q[i].op==4) { int mid,le=1,ri=n,ans; x=Q[i].x; while(le<=ri) { mid=(le+ri)>>1; if(Query(1,1,mid)>=x) { ans=mid; ri=mid-1; } else le=mid+1; } printf("%d\n",a[ans]); } else { x=lower_bound(a+1,a+1+n,Q[i].x)-a; printf("%d\n",Query(1,1,x-1)); } } return 0; }
相关文章推荐
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯Round #14 B题 RE:从零开始的异世界生活(离线+线段树)
- HDU-2795 Billboard (线段树)RE的教训!
- 线段树中的TLE,RE杂碎问题
- 玲珑杯 H -- Variance(线段树)
- 玲珑杯#3 G 1043 - G. Quailty and Square Counter【线段树-卡常数】
- HDU 3966 RE 树链剖分 线段树 Aragorn's Story