Luogu P2824 [HEOI2016/TJOI2016]排序

Link
先二分答案,这样所有的数字就都变成了\(0,1\)。
那么区间排序就相当于区间求和再区间覆盖了。

#include<bits/stdc++.h>
using namespace std;
#define N 100007
int read(){int x=0,c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))x=x*10+c-48,c=getchar();return x;}
int a[N],sum[N<<2],tag[N<<2],n,m;
struct node{int opt,l,r;}q[N];
#define ls p<<1
#define rs p<<1|1
#define mid ((l+r)>>1)
void pushup(int p){sum[p]=sum[ls]+sum[rs];}
void pushdown(int p,int l,int r)
{
    tag[ls]=tag[rs]=tag[p],(tag[p]==1? (sum[ls]=mid-l+1,sum[rs]=r-mid):(sum[ls]=sum[rs]=0)),tag[p]=0;
}
void build(int p,int l,int r,int x)
{
    if(l==r) return (void)(sum[p]=a[l]>=x,tag[p]=0);
    build(ls,l,mid,x),build(rs,mid+1,r,x),pushup(p),tag[p]=0;
}
void modify(int p,int l,int r,int L,int R,int x)
{
    if(L<=l&&r<=R) return (void)((tag[p]=x? 1:-1),sum[p]=(r-l+1)*x);
    if(R<l||r<L) return ;
    if(tag[p]) pushdown(p,l,r);
    if(L<=mid) modify(ls,l,mid,L,R,x);
    if(R>mid) modify(rs,mid+1,r,L,R,x);
    pushup(p);
}
int query(int p,int l,int r,int L,int R)
{
    if(L<=l&&r<=R) return sum[p];
    if(R<l||r<L) return 0;
    if(tag[p]) pushdown(p,l,r);
    return query(ls,l,mid,L,R)+query(rs,mid+1,r,L,R);
}
int ask(int p,int l,int r,int x)
{
    if(l==r) return sum[p];
    if(tag[p]) pushdown(p,l,r);
    return x<=mid? ask(ls,l,mid,x):ask(rs,mid+1,r,x);
}
int check(int x,int p)
{
    build(1,1,n,x);
    for(int i=1,v;i<=m;++i)
    v=query(1,1,n,q[i].l,q[i].r),q[i].opt? (modify(1,1,n,q[i].l,q[i].l+v-1,1),modify(1,1,n,q[i].l+v,q[i].r,0)):(modify(1,1,n,q[i].l,q[i].r-v,0),modify(1,1,n,q[i].r-v+1,q[i].r,1));
    return ask(1,1,n,p);
}
int main()
{
    n=read(),m=read();int i,l=1,r=n,p,ans;
    for(i=1;i<=n;++i) a[i]=read();
    for(i=1;i<=m;++i) q[i].opt=read(),q[i].l=read(),q[i].r=read();
    p=read();
    while(l<=r) check(mid,p)? (ans=mid,l=mid+1):(r=mid-1);
    return !printf("%d",ans);
}

原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12194862.html

时间: 2024-11-09 06:03:22

Luogu P2824 [HEOI2016/TJOI2016]排序的相关文章

[HEOI2016/TJOI2016]排序 解题报告

[HEOI2016/TJOI2016]排序 题意 给出一个大小为 \(n\) 的排列, 对这个排列进行 \(m\) 次操作, 操作分为以下两种, 0 l r 表示将区间 \([l,r]\) 的数升序排序. 1 l r 表示将区间 \([l,r]\) 的数降序排序. 询问 \(m\) 次操作后下标为 \(q\) 的数字. 思路 不看题解打死也想不出来系列 考虑二分答案. 设当前二分的答案为 \(mid\), 把原排列中 大于等于 \(mid\) 的数标记为 \(1\), 小于 \(mid\) 的数

【线段树合并】【P2824】 [HEOI2016/TJOI2016]排序

Description 给定一个长度为 \(n\) 的排列,有 \(m\) 次操作,每次选取一段局部进行升序或降序排序,问你一波操作后某个位置上的数字是几 Hint \(1~\leq~n,~m~\leq~10^5\) Solution 有两种做法,一种在线一种离线,这里把在线部分讲得更清楚点吧-- 考虑离线算法,我们二分该位置上的答案,将大于该数的元素置为 \(1\),小于该数的元素置为 \(0\),然后模拟所有的排序并检验.由于使用线段树对 \(0/1\) 序列多次局部排序可以做到 \(O(m

[HEOI2016/TJOI2016]排序

4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec Memory Limit: 256 MB Submit: 2366 Solved: 1188 [Submit][Status][Discuss] Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排 序分为两种:1:(0,l,

[HEOI2016&amp;TJOI2016] 排序(线段树)

4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 2703  Solved: 1386[Submit][Status][Discuss] Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排 序分为两种:1:(0,l,

luogu_P2824 [HEOI2016/TJOI2016]排序

https://www.luogu.org/problem/P2824 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q位置上的数字. 输入格式 输入数据的第一行为两个整数n和m.n表示序列的长度,m表示

[Luogu2824] [HEOI2016/TJOI2016]排序

题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q位置上的数字. 输入输出格式 输入格式: 输入数据的第一行为两个整数n和m.n表示序列的长度,m表示局部排序的次数.1 <= n, m <= 10^5第二

LGP2824【[HEOI2016/TJOI2016]排序】

一道神题ORZ,思路真的很妙啊. ### 正文部分: 题意: 给一个序列,可以对某一个区间升序和降序排序,问你最后数列中第$Q$个数是什么? 乍一看貌似毫无思路,于是我们考虑一个更简单的问题:如果对$1$个$01$序列执行上面的操作,是不是就可以变得简单一点? 设某段区间$[l,r]$里总共有$cnt$个1 那么降序排就是把$l\sim l+cnt - 1$修改为$1$,把$l+cnt \sim r$修改为$0$ 升序排则是把$r-cnt+1\sim r$修改为$1$,$l\sim r-cnt$

luogu P2825 [HEOI2016/TJOI2016]游戏

题面 https://www.luogu.org/problemnew/show/P2825 题解 水题 二分图匹配的经典模型. 对于硬石头,拆点. // luogu-judger-enable-o2 #include<cstdio> #include<iostream> #include<cstring> #include<vector> #include<queue> #define ri register int #define N 505

luogu P4091 [HEOI2016/TJOI2016]求和

传送门 这一类题都要考虑推式子 首先,原式为\[f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i}S(i,j)*2^j*j!\] 可以看成\[f(n)=\sum_{j=0}^{n}2^j*j!\sum_{i=j}^{n}S(i,j)\] 又因为\[S(i,j)=\frac{1}{j!}\sum_{k=0}^{j}(-1)^k*\binom{j}{k}*(j-k)^i\] 所以\[f(n)=\sum_{j=0}^{n}2^j*j!\sum_{i=0}^{n}\frac{1}{j!}