2018.08.01 BZOJ4552: [Tjoi2016&Heoi2016]排序(二分+线段树)
传送门 
线段树简单题。 
二分答案+线段树排序。 
实际上就是二分答案mid" role="presentation" style="position: relative;">midmid,然后把比mid" role="presentation" style="position: relative;">midmid小的全部变成0" role="presentation" style="position: relative;">00,不比mid" role="presentation" style="position: relative;">midmid小的全部变成1" role="presentation" style="position: relative;">11,然后用线段树维护01" role="presentation" style="position: relative;">0101排序。 
时间效率O(mlogn)" role="presentation" style="position: relative;">O(mlogn)O(mlogn)。 
代码:
#include<bits/stdc++.h>
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
#define N 100005
using namespace std;
int n,m,a[N],b[N],l,r,pos;
struct Node{int l,r,cov,sum;}T[N<<2];
struct Query{int op,l,r;}q[N];
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
inline void pushup(int p){T[p].sum=T[lc].sum+T[rc].sum;}
inline void pushnow(int p,int v){T[p].cov=v,T[p].sum=(T[p].r-T[p].l+1)*v;}
inline void pushdown(int p){if(T[p].cov!=-1)pushnow(lc,T[p].cov),pushnow(rc,T[p].cov),T[p].cov=-1;}
inline void build(int p,int l,int r){
    T[p].l=l,T[p].r=r,T[p].cov=-1;
    if(l==r){T[p].sum=b[l];return;}
    build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int ql,int qr,int v){
    if(ql>T[p].r||qr<T[p].l)return;
    if(ql<=T[p].l&&T[p].r<=qr)return pushnow(p,v);
    pushdown(p);
    if(qr<=mid)update(lc,ql,qr,v);
    else if(ql>mid)update(rc,ql,qr,v);
    else update(lc,ql,mid,v),update(rc,mid+1,qr,v);
    pushup(p);
}
inline int query(int p,int ql,int qr){
    if(ql>T[p].r||qr<T[p].l)return 0;
    if(ql<=T[p].l&&T[p].r<=qr)return T[p].sum;
    pushdown(p);
    if(qr<=mid)return query(lc,ql,qr);
    if(ql>mid)return query(rc,ql,qr);
    return query(lc,ql,mid)+query(rc,mid+1,qr);
}
inline bool check(int x){
    for(int i=1;i<=n;++i)b[i]=(a[i]>=x);
    build(1,1,n);
    for(int i=1;i<=m;++i){
        int num=query(1,q[i].l,q[i].r);
        if(!q[i].op)update(1,q[i].r-num+1,q[i].r,1),update(1,q[i].l,q[i].r-num,0);
        else update(1,q[i].l,q[i].l+num-1,1),update(1,q[i].l+num,q[i].r,0);
    }
    return query(1,pos,pos);
}
int main(){
    n=read(),m=read(),l=1,r=n;
    for(int i=1;i<=n;++i)a[i]=read();
    for(int i=1;i<=m;++i)q[i].op=read(),q[i].l=read(),q[i].r=read();
    pos=read();
    while(l<=r){
        int midd=l+r>>1;
        if(check(midd))l=midd+1;
        else r=midd-1;
    }
    if(check(r))printf("%d",r);
    else printf("%d",l);
    return 0;
}2018.08.01 BZOJ4552: [Tjoi2016&Heoi2016]排序(二分+线段树)的更多相关文章
- [bzoj4552][Tjoi2016&Heoi2016]排序-二分+线段树
		Brief Description DZY有一个数列a[1..n],它是1∼n这n个正整数的一个排列. 现在他想支持两种操作: 0, l, r: 将a[l..r]原地升序排序. 1, l, r: 将a ... 
- 【BZOJ4552】[Tjoi2016&Heoi2016]排序 二分+线段树
		[BZOJ4552][Tjoi2016&Heoi2016]排序 Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ... 
- bzoj 4552: [Tjoi2016&Heoi2016]排序——二分+线段树
		Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ... 
- [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)
		解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ... 
- bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序
		http://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案 把>=mid 的数看做1,<mid 的数看做0 这样升序.降序排列相当于 ... 
- bzoj4552: [Tjoi2016&Heoi2016]排序(二分+线段树)
		又是久违的1A哇... 好喵喵的题!二分a[p],把大于mid的数改为1,小于等于mid的数改为0,变成01串后就可以用线段树进行那一连串排序了,排序后如果p的位置上的数为0,说明答案比mid小,如果 ... 
- BZOJ4552 [Tjoi2016&Heoi2016]排序  【二分 + 线段树】
		题目链接 BZOJ4552 题解 之前去雅礼培训做过一道题,\(O(nlogn)\)维护区间排序并能在线查询 可惜我至今不能get 但这道题有着\(O(nlog^2n)\)的离线算法 我们看到询问只有 ... 
- BZOJ4552:[TJOI2016&HEOI2016]排序(线段树,二分)
		Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他. 这个难题是这样子的:给出一个1到n的全排列,现在对这 ... 
- BZOJ4552 Tjoi2016&Heoi2016排序 【二分+线段树】*
		Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个 ... 
随机推荐
- RabbitMQ Window环境安装
			转自:https://www.cnblogs.com/zzpblogs/p/8168763.html RabbitMQ环境的安装分别介绍在Window和Linux下两个环境的安装过程. Windo ... 
- node 的exports 和module
			文件05/** * Created by Mr.tiankong on 2017/3/24. */var People = require("./test/people.js"); ... 
- Redis用在哪里
			1. 高并发缓存/共享session: UserInfo getUserInfo (long id) {} 取: userRedisKey = "user:info: ... 
- PageUtil 分页
			/** * 分页工具类 * @author Administrator * */ public class PageUtil { /** * 生成分页代码 * @param targetUrl 目标地 ... 
- JSP复习
			3.2.2 JSP指令元素: JSP指令 (1) page指令:定义整个页面的全局属性 (2)include指令:用于包含一个文件或代码的文件 (3)taglib指令:用来引用自定义的标签或第三方标签 ... 
- 'Microsoft.VisualStudio.Editor.Implementation.EditorPackage' package did not load correctly
			Visual Studio 2012 Ultimate Removing "C:\Users\UserName\AppData\Local\Microsoft\VisualStudio\11 ... 
- ldd3 源码相关问题参见
			参考地址: http://www.verydemo.com/demo_c92_i235635.html http://blog.csdn.net/silvervi/article/details/64 ... 
- SpringCloud组件和概念介绍1
			一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及 ... 
- android显示和隐藏软键盘
			显示键盘: EditText editText.setFocusable(true); editText.setFocusableInTouchMode(true); editText.request ... 
- input上传图片
			1.通过input自身的onchange事件触发: <input id="file" type="file" accept="image/*&q ... 
