听说是BC原题。

好题,二分答案变成01序列,就可以方便的用线段树维护了。

然后就是区间查询和覆盖了。

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define maxn 200005 int cnt[maxn<<2][2],data[maxn],n,m,a[maxn];
int opt[maxn],x[maxn],y[maxn],tag[maxn<<2],q; void update(int o)
{
F(i,0,1) cnt[o][i]=cnt[o<<1][i]+cnt[o<<1|1][i];
} void build(int o,int l,int r)
{
if (l==r)
{
cnt[o][data[l]]=1;
cnt[o][1-data[l]]=0;
tag[o]=-1;
return ;
}
tag[o]=-1; int mid=l+r>>1;
build(o<<1,l,mid); build(o<<1|1,mid+1,r);
update(o);
} void pushdown(int o,int l,int r)
{
if (tag[o]!=-1)
{
int mid=l+r>>1;
tag[o<<1]=tag[o<<1|1]=tag[o];
cnt[o<<1][tag[o]]=mid-l+1;
cnt[o<<1|1][tag[o]]=r-mid;
cnt[o<<1][1-tag[o]]=0;
cnt[o<<1|1][1-tag[o]]=0;
tag[o]=-1;
}
} int query(int o,int l,int r,int L,int R)
{
if (L<=l&&r<=R) return cnt[o][1];
int mid=l+r>>1; pushdown(o,l,r);
if (R<=mid) return query(o<<1,l,mid,L,R);
else if (L>mid) return query(o<<1|1,mid+1,r,L,R);
else return query(o<<1,l,mid,L,R)+query(o<<1|1,mid+1,r,L,R);
} void modify(int o,int l,int r,int L,int R,int f)
{
if (L>R) return ;
if (L<=l&&r<=R)
{
tag[o]=f;
cnt[o][f]=r-l+1;
cnt[o][1-f]=0;
return;
}
int mid=l+r>>1; pushdown(o,l,r);
if (L<=mid) modify(o<<1,l,mid,L,R,f);
if (R>mid) modify(o<<1|1,mid+1,r,L,R,f);
update(o);
} void st_sort(int typ,int l,int r)
{
int cnt1=query(1,1,n,l,r),cnt0=r-l+1-cnt1;
if (typ==0)
{
modify(1,1,n,l,l+cnt0-1,0);
modify(1,1,n,l+cnt0,r,1);
}
else
{
modify(1,1,n,l,l+cnt1-1,1);
modify(1,1,n,l+cnt1,r,0);
}
} bool check(int mid)
{
F(i,1,n) data[i]=(a[i]>=mid); build(1,1,n);
F(i,1,m)
{
st_sort(opt[i],x[i],y[i]);
}
if (query(1,1,n,q,q)) return true;
else return false;
} int main()
{
scanf("%d%d",&n,&m);
F(i,1,n) scanf("%d",&a[i]);
F(i,1,m) scanf("%d%d%d",&opt[i],&x[i],&y[i]);
int l=1,r=n;scanf("%d",&q);
while(l<r)
{
int mid=(l+r)/2+1;
if (check(mid)) l=mid;
else r=mid-1;
}
printf("%d\n",l);
}

  

BZOJ 4552 [Tjoi2016&Heoi2016]排序 ——线段树 二分答案的更多相关文章

  1. BZOJ 4552: [Tjoi2016&Heoi2016]排序 线段树 二分

    目录 此代码是个假代码,只能糊弄luogu,以后再改,路过大佬也可以帮一下辣 update 10.6 此代码是个假代码,只能糊弄luogu,以后再改,路过大佬也可以帮一下辣 /* //fang zhi ...

  2. BZOJ 4552 [Tjoi2016&Heoi2016]排序 线段树的分裂和合并

    https://www.lydsy.com/JudgeOnline/problem.php?id=4552 https://blog.csdn.net/zawedx/article/details/5 ...

  3. BZOJ4552:[TJOI2016&HEOI2016]排序(线段树,二分)

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他. 这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  4. [BZOJ 2653] middle(可持久化线段树+二分答案)

    [BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...

  5. BZOJ 4552: [Tjoi2016&Heoi2016]排序

    4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 579  Solved: 322[Sub ...

  6. bzoj 4552 [Tjoi2016&Heoi2016]排序 (二分答案 线段树)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 题意: 给你一个1-n的全排列,m次操作,操作由两种:1.将[l,r]升序排序,2 ...

  7. BZOJ 4552 [Tjoi2016&Heoi2016]排序 | 二分答案 线段树

    题目链接 题面 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  8. bzoj 4552: [Tjoi2016&Heoi2016]排序——二分+线段树

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  9. bzoj 4552: [Tjoi2016&Heoi2016]排序【二分+线段树】

    二分值mid,然后把>=mid的赋值为1,其他赋值为0,每次排序就是算出区间内01的个数,然后分别把0和1放到连续的一段内,这些都可以用线段树来维护 二分的判断条件是操作完之后q位置上是否为1 ...

随机推荐

  1. Java 原型模式(克隆模式)

      Java 的设计模式有 23 种,前段时间小编已经介绍了单例模式,由于我们在学习 Spring 的时候在 bean 标签的学习中碰到了今天要讲的原型模式,那么小编就已本文来介绍下原型模式. 原型模 ...

  2. MyLinkedList

    /** * 节点类 * @author JP * */ class Node { Object value;//节点元素值 Node pre;//上一个节点 Node next;//下一个节点 pub ...

  3. 2017乌鲁木齐网络赛 j 题

    题目连接 : https://nanti.jisuanke.com/t/A1256 Life is a journey, and the road we travel has twists and t ...

  4. 字符串的驻留(String Interning)

    http://www.cnblogs.com/artech/archive/2007/03/04/663728.html 关于字符串的驻留的机制,对于那些了解它的人肯定会认为很简单,但是我相信会有很大 ...

  5. tomcat - CPU高占用问题记录

    先查询进程 top 再根据进程号,查出进程的线程 ps p 3036 -L -o pcpu,pid,tid,time,tname,cmd 得到最高使用率CPU的线程TID,转换成16进制 printf ...

  6. Linux下Jenkins与GitHub自动构建Node项目(Vue)

    根据上篇文章<Linux下Jenkins与GitHub自动构建NetCore与部署>,我们知道了Jenkins的强大功能,自动构建,部署了一个NetCore的Web,让开发人员专注于开发, ...

  7. 对象、句柄、ID之间的区别

    对象是C++的概念,C++的类对象 句柄是Windows SDK的概念,指向某种资源的一种“指针”(有时候底层不一定是指针) 资源ID在MFC里仅仅是一个宏,也就是个整数. 其实,句柄是控件在数据结构 ...

  8. 第一本C语言笔记(上)

    1. 一般地源程序文件到可执行程序文件经过如下四步: 预处理 -- 头文件内容插入.宏替换.删注释(#include.#define) 编译 -- 把预处理过的源文件编程汇编文件 .c -> . ...

  9. 【HIHOCODER 1176】 欧拉路·一

    描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的角色来到了一个很大的湖边.湖上有N个小岛(编号1..N),以及连接小岛的 ...

  10. zookeeper安装、配置、使用

    [安装] wget http://www.apache.org/dist/zookeeper/zookeeper-3.3.6/zookeeper-3.3.6.tar.gz tar zxvf zooke ...