HDU 5649 DZY Loves Sorting(线段树+二分)
2016-09-19 21:24
344 查看
题意:给出一个序列,m次[L,R]区间的原地排序,最后只有一次询问下标为k的值为多少
题解:二分求解答案,对于数m,比它大的置为1,比它小的置为0,线段树处理排序过程(只需要统计区间1的个数进行区间更新),复杂度(n+m)∗log2(n)
题解:二分求解答案,对于数m,比它大的置为1,比它小的置为0,线段树处理排序过程(只需要统计区间1的个数进行区间更新),复杂度(n+m)∗log2(n)
#include<cstring> #include<string> #include<iostream> #include<queue> #include<cstdio> #include<algorithm> #include<map> #include<cstdlib> #include<cmath> #include<vector> //#pragma comment(linker, "/STACK:1024000000,1024000000"); using namespace std; #define INF 0x3f3f3f3f #define maxn 100004 int n,m; int a[maxn]; struct Q { int op; int l,r; }q[maxn]; int sum[4*maxn],tag[4*maxn]; void init(int l,int r,int k,int x) { tag[k]=-1; if(l==r) { if(a[l]>x) sum[k]=1; else sum[k]=0; return ; } int mid=l+r>>1; init(l,mid,k<<1,x); init(mid+1,r,k<<1|1,x); sum[k]=sum[k<<1]+sum[k<<1|1]; } void pushdown(int k,int l,int r) { if(tag[k]==-1) return ; int mid=l+r>>1; tag[k<<1]=tag[k<<1|1]=tag[k]; sum[k<<1]=(mid-l+1)*tag[k]; sum[k<<1|1]=(r-mid)*tag[k]; tag[k]=-1; } int query(int s,int t,int l,int r,int k) { if(s==l&&r==t) { return sum[k]; } pushdown(k,l,r); int mid=l+r>>1; if(t<=mid) return query(s,t,l,mid,k<<1); else if(s>mid) return query(s,t,mid+1,r,k<<1|1); else return query(s,mid,l,mid,k<<1)+query(mid+1,t,mid+1,r,k<<1|1); } void update(int d,int s,int t,int l,int r,int k) { if(s>t) return ; if(s==l&&r==t) { tag[k]=d; sum[k]=(r-l+1)*d; return ; } pushdown(k,l,r); int mid=l+r>>1; if(t<=mid) update(d,s,t,l,mid,k<<1); else if(s>mid) update(d,s,t,mid+1,r,k<<1|1); else { update(d,s,mid,l,mid,k<<1); update(d,mid+1,t,mid+1,r,k<<1|1); } sum[k]=sum[k<<1]+sum[k<<1|1]; } bool F(int x,int k) { init(1,n,1,x); for(int i=1;i<=m;i++) { int temp=query(q[i].l,q[i].r,1,n,1); if(q[i].op) update(1,q[i].l,q[i].l+temp-1,1,n,1),update(0,q[i].l+temp,q[i].r,1,n,1); else update(1,q[i].r-temp+1,q[i].r,1,n,1),update(0,q[i].l,q[i].r-temp,1,n,1); } return query(k,k,1,n,1); } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++) scanf("%d%d%d",&q[i].op,&q[i].l,&q[i].r); int k; scanf("%d",&k); int l=1,r=n; while(l<r) { int mid=l+r>>1; if(!F(mid,k)) r=mid; else l=mid+1; } printf("%d\n",r); } return 0; }
相关文章推荐
- [HDU 5649] DZY Loves Sorting (线段树+二分)
- hdu 5649 DZY Loves Sorting(二分+线段树)
- HDU 5649 DZY Loves Sorting (二分 + 线段树)
- HDU 5649 DZY Loves Sorting 二分+线段树
- hdu_5649 DZY Loves Sorting
- 数据结构(线段树):HDU 5649 DZY Loves Sorting
- 线段树+二分 hdu5649 DZY Loves Sorting
- hdu 5195 DZY Loves Topological Sorting 线段树+拓扑排序
- HDU 5195 DZY Loves Topological Sorting(线段树单点更新)
- hdu 5195 DZY Loves Topological Sorting && BestCoder Round #35
- HDU 5195 DZY Loves Topological Sorting 拓扑序(贪心)
- HDU 5195 DZY Loves Topological Sorting(优先队列)
- HDU 5195 DZY Loves Topological Sorting (拓扑排序+线段树)
- 【HDU】5195-DZY Loves Topological Sorting(拓扑 + 线段树 + 贪心)
- 【HDU5649 BestCoder Round 76 (div1)D】【二分+线段树】DZY Loves Sorting 全排列1~n 区间升序降序排序 最后k位置的数是几
- HDU 5195 DZY Loves Topological Sorting
- HDU 5649 线段树+二分
- HDU 5196 DZY Loves Inversions(树状数组,二分)
- hdu 5195 DZY Loves Topological Sorting【拓扑排序+优先队列+邻接表】
- HDU 5195 - DZY Loves Topological Sorting