当前位置: 首页 > news >正文

*题解:P2824 [HEOI2016/TJOI2016] 排序

原题链接

解析

“这个题不是典爆了,,,只跟大小相关的题想不到 0/1 Trick 建议先多做题。”

收到。

二分答案 \(x\),将大于等于 \(x\) 的数都标记为 \(1\),小于 \(x\) 的数都标记为 \(0\)。这样排序操作就变成了对 \(0/1\) 串排序,而这个操作相当于统计区间 \(1\) 个数和区间赋值,可以用线段树来维护。最终答案就为使得所有操作过后位置 \(q\) 上的数为 \(1\) 的最小 \(x\)

时间复杂度 \(O(m\log^2n)\)

代码

#include <bits/stdc++.h>
#define ls(x) ((x) << 1)
#define rs(x) (((x) << 1) | 1)
#define mid ((l + r) >> 1)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 1e5 + 5,M = 2e5 + 5,mod = 998244353;
int a[N],b[N];
int cnt1[N << 2],tag[N << 2];
int pos;
struct Query{int op,l,r;
}q[N];
int n,m;
void push_up(int p){cnt1[p] = cnt1[ls(p)] + cnt1[rs(p)];
}
void build(int p,int l,int r){tag[p] = -1;if(l == r){cnt1[p] = b[l];return;}build(ls(p),l,mid),build(rs(p),mid + 1,r);push_up(p);
}
void add_tag(int p,int l,int r,int k){tag[p] = k;cnt1[p] = (r - l + 1) * k;
}
void push_down(int p,int l,int r){if(tag[p] == -1) return;add_tag(ls(p),l,mid,tag[p]);add_tag(rs(p),mid + 1,r,tag[p]); tag[p] = -1;
}
void modi(int p,int l,int r,int L,int R,int k){if(l > R || r < L) return;if(l >= L && r <= R){add_tag(p,l,r,k);return;}push_down(p,l,r);modi(ls(p),l,mid,L,R,k),modi(rs(p),mid + 1,r,L,R,k);push_up(p);
}
int ask(int p,int l,int r,int L,int R){if(l > R || r < L) return 0;if(l >= L && r <= R){return cnt1[p];}push_down(p,l,r);return ask(ls(p),l,mid,L,R) + ask(rs(p),mid + 1,r,L,R);
}bool chk(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 l = q[i].l,r = q[i].r;int x = ask(1,1,n,l,r);if(q[i].op == 0){modi(1,1,n,l,r - x,0);modi(1,1,n,r - x + 1,r,1);}else{modi(1,1,n,l,l + x - 1,1);modi(1,1,n,l + x,r,0);}}return ask(1,1,n,pos,pos);
}
int main(){ios::sync_with_stdio(false);cin.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=m;i++){cin>>q[i].op>>q[i].l>>q[i].r;}	cin>>pos;int l = 1,r = n;while(l < r){int md = (l + r + 1) >> 1;if(chk(md)){l = md;}else{r = md - 1;}}cout<<l;return 0;
}
http://www.gsyq.cn/news/43933.html

相关文章:

  • 开源 C++ QT QML 开发(十三)多线程 - 实践
  • PyCharm 配置 PySide6
  • 《密码系统设计》第十周预习
  • 从容器到云原生:开发者需要掌握的核心思维
  • 从零开始学Flink:实时流处理实战 - 教程
  • 【STM32方案开源】基于STM32的智能语音台灯框架
  • 842318 - Frequently asked questions about validations and substitutions
  • jmter题目
  • 51汇编-跑马灯
  • 2025年废棉开花机制造企业权威推荐榜单:化纤块开花机/废布专用开花机/纤维专用开花机源头厂家精选
  • 深入解析:Isaac Lab 2.3深度解析:全身控制与增强遥操作如何重塑机器人学习
  • 51-OLED显示代码
  • unt
  • html5 canvas 文本渲染
  • 2025年河北叛逆不听话教育学校权威推荐榜单:不听话矫正机构/早恋矫正学校/孩子早恋管教学校精选
  • 合肥改善睡眠机构哪家专业?2025年排名解析
  • 2025年11月中国高压氧舱品牌权威推荐榜单:科技抗衰新选择
  • micropython开发与实战阅读笔记
  • Ubuntu忘记登录密码重置步骤-CSDN博客
  • 2025年可靠的钢结构旋转楼梯工厂推荐榜
  • 第一个图形界面程序 -- 简单示例
  • 平滑法线
  • 串子(待补)
  • 简记在arduino安装esp32开发板包
  • 记一次 float64 排序失效的灵异事件
  • 详细介绍:SkyDiffusion:用 BEV 视角打开街景→航拍图像合成新范式
  • 精美的vue流程设计器
  • YACS2025年10月甲组
  • 2025年peek什么材料定制厂家权威推荐榜单:peek原料/材料peek/peek塑料原料源头厂家精选
  • Netty 示例