Portal

Description

给出一个\(1..n(n\leq10^5)\)的排列,进行\(m(m\leq10^5)\)次操作:

  • 升序排列\([L,R]\)中的数。
  • 降序排列\([L,R]\)中的数。

所有操作完成后,求位置\(q\)上的值。

Solution

居然是二分答案...!

对于可能的答案\(x\),将所有小于\(x\)的数视为\(0\),大于等于\(x\)的数视为\(1\)。那么每次排序就能利用线段树在\(O(logn)\)的时间内处理(区间赋值\(0/1\))。操作完成后,如果位置\(q\)上的数为\(0\),则说明真正的答案\(ans<x\);否则说明\(ans\geq x\)。

时间复杂度\(O(mlog^2n)\)。

Code

//排序
#include <algorithm>
#include <cstdio>
#include <cstring>
using std::sort;
inline char gc()
{
static char now[1<<16],*s,*t;
if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}
return *s++;
}
inline int read()
{
int x=0; char ch=gc();
while(ch<'0'||'9'<ch) ch=gc();
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
return x;
}
int const N=1e5+10;
int n,m,Q,a[N];
struct rQuery{int opt,L,R;} q[N];
#define Ls (p<<1)
#define Rs ((p<<1)|1)
int rt; int sum[N<<2],tag[N<<2];
void update(int p) {sum[p]=sum[Ls]+sum[Rs];}
void change(int p,int L0,int R0,int x) {sum[p]=x*(R0-L0+1),tag[p]=x;}
void pushdw(int p,int L0,int R0)
{
if(tag[p]<0) return;
int mid=L0+R0>>1;
change(Ls,L0,mid,tag[p]);
change(Rs,mid+1,R0,tag[p]);
tag[p]=-1;
}
int L,R;
void ins(int p,int L0,int R0,int x)
{
if(L<=L0&&R0<=R) {change(p,L0,R0,x); return;}
pushdw(p,L0,R0);
int mid=L0+R0>>1;
if(L<=mid) ins(Ls,L0,mid,x);
if(mid<R) ins(Rs,mid+1,R0,x);
update(p);
}
int query(int p,int L0,int R0)
{
if(L<=L0&&R0<=R) return sum[p];
pushdw(p,L0,R0);
int mid=L0+R0>>1,res=0;
if(L<=mid) res+=query(Ls,L0,mid);
if(mid<R) res+=query(Rs,mid+1,R0);
return res;
}
bool check(int x)
{
memset(sum,0,sizeof sum);
memset(tag,-1,sizeof tag);
for(int i=1;i<=n;i++) L=R=i,ins(rt,1,n,a[i]>=x);
for(int i=1;i<=m;i++)
{
int opt=q[i].opt;
L=q[i].L,R=q[i].R; int cnt=query(rt,1,n);
if(opt==0) cnt=q[i].R-q[i].L+1-cnt;
L=q[i].L,R=L+cnt-1; if(L<=R) ins(rt,1,n,opt);
L=q[i].L+cnt,R=q[i].R; if(L<=R) ins(rt,1,n,opt^1);
}
L=R=Q; return query(rt,1,n);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++) q[i].opt=read(),q[i].L=read(),q[i].R=read();
Q=read();
rt=1;
int left=2,right=n;
while(left<=right)
{
int mid=left+right>>1;
if(check(mid)) left=mid+1;
else right=mid-1;
}
printf("%d\n",right);
return 0;
}

P.S.

苦恼于找不到一个美妙的线段树写法...

BZOJ4552 - [TJOI2016]排序的更多相关文章

  1. 【BZOJ4552】排序(线段树,二分答案)

    [BZOJ4552]排序(线段树,二分答案) 题面 BZOJ 题解 好神的题啊 直接排序我们做不到 怎么维护? 考虑一下,如果我们随便假设一个答案 怎么检验它是否成立? 把这个数设成\(1\),其他的 ...

  2. 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告

    P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...

  3. [HEOI2016/TJOI2016]排序 线段树+二分

    [HEOI2016/TJOI2016]排序 内存限制:256 MiB 时间限制:6000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而 ...

  4. [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)

    题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...

  5. 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)

    2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...

  6. bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序

    http://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案 把>=mid 的数看做1,<mid 的数看做0 这样升序.降序排列相当于 ...

  7. [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)

    解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ...

  8. BZOJ4552 [Tjoi2016&Heoi2016]排序 【二分 + 线段树】

    题目链接 BZOJ4552 题解 之前去雅礼培训做过一道题,\(O(nlogn)\)维护区间排序并能在线查询 可惜我至今不能get 但这道题有着\(O(nlog^2n)\)的离线算法 我们看到询问只有 ...

  9. [bzoj4552][Tjoi2016][Heoi2016]排序

    Description 给出一个$1$到$n$的全排列,现在对这个全排列序列进行$m$次局部排序,排序分为$2$种: $1.(0,l,r)$表示将区间$[l,r]$的数字升序排序; $2.(1,l,r ...

随机推荐

  1. 动手实现 React-redux(一):初始化工程

    可以看到 Redux 并不复杂,它那些看起来匪夷所思的设定其实都是为了解决特定的问题而存在的,我们把问题想清楚以后就不难理解它的那些奇怪的设定了.这节开始我们来看看如何把 Redux 和 React. ...

  2. P1554 梦中的统计

    题目背景 Bessie 处于半梦半醒的状态.过了一会儿,她意识到她在数数,不能入睡. 题目描述 Bessie的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数.她开始注意每一个数码(0..9):每一 ...

  3. AJPFX简述Context.startService()和Context.bindService

    Context.startService()和Context.bindService 服务不能自己运行,需要通过调用Context.startService()或Context.bindService ...

  4. Java GC机制简要总结(Java垃圾回收的基本工作原理)

    第一次编辑 2019-05-07 01:09:39 垃圾回收的对象 程序中的不可用对象(不存活的对象,没有任何引用),或者无用的变量信息等,在程序中长期存在会逐渐占用较多的内存空间,导致没有足够的空间 ...

  5. Implicit Animations 默认动画 读书笔记

    Implicit Animations  默认动画 读书笔记 Do what I mean, not what I say. Edna Krabappel, The Simpsons   Part I ...

  6. Junit测试集锦

    Junit测试集锦 前言: 一个程序从设计很好的状态开始,随着新的功能不断地加入,程序逐渐地失去了原有的结构,最终变成了一团乱麻.所以在开发过程中,对于程序员来说,测试是非常重要的.言归正传,开始Ju ...

  7. how to use Hexo

    Hexo is a good tool to build a personal blog.Here are some good reference:1: https://hexo.io/zh-cn/d ...

  8. hasOneOf # if (data.otherDescArr.some(_ => '7'.indexOf(_) > -1)) {

    if (data.otherDescArr.some(_ => '7'.indexOf(_) > -1)) { export const hasOneOf = (targetarr, ar ...

  9. ASP.NetCore 错误 NU1605 检测到包降级: Microsoft.Data.Sqlite 从 2.2.1 降级到 2.1.0

    找到使用的.csproj文件 将 <PackageReference Include="Microsoft.Data.Sqlite" Version="2.1.0& ...

  10. 洛谷——P4109 [HEOI2015]定价

    P4109 [HEOI2015]定价 模拟(有点儿贪心) 题目要求在区间$l,r$中$x$后导0尽量多,且除去后导0之外,最后一个数尽量是$5$才最优 从$l$到$r$依次考虑, 假设当前考虑到$50 ...