AtCoder Beginner Contest 237 G - Range Sort Query
原题链接 G - Range Sort Query
思路:
\(x\)是固定的,所以考虑将排序维护成0 1串,为\(p_i < x\)为\(0\),那么\(p_i \geq x\)为\(1\),那么这样就可以用线段树维护了,我们可以维护每个区间1的个数,设为\(cnt\),对于升序来说,设我们需要更新的这个区间\([l, r]\),那么现在查询后,更新新的区间就是\([r - cnt + 1, 1]\)为\(1\),更新\([l, r - cnt]\)为\(0\),所以维护两颗线段树,一颗是\(p_i \geq x\),另一颗是\(p_i \geq x + 1\),那么最后可以从\(1 - N\)遍历查询,若\(t1.query(1, i, i)\)与\(t2.query(1, i, i)\)两者不相等,说明这就是我们要找的那个位置。
一开始把懒标记初值设成了0,怎么也不对,后来对拍了半天才发现有是因为懒标记有0 1值,那初值肯定不能是0 1,所以改成-1,就对了。
#include <bits/stdc++.h>
using namespace std;
const int N = 2E5 + 10;
int w[N], n, q, x;
struct SegMentTree {
struct node {
int l, r;
int val, tag;
}tr[N * 4];
void pushup(int u) {
tr[u].val = tr[u << 1].val + tr[u << 1 | 1].val;
}
void pushdown(int u) {
auto &root = tr[u], &left = tr[u << 1], &right = tr[u << 1 | 1];
if (~root.tag) {
left.tag = root.tag;
left.val = root.tag * (left.r - left.l + 1);
right.tag = root.tag;
right.val = root.tag * (right.r - right.l + 1);
root.tag = -1;
}
}
void build(int u, int l, int r, int x) {
tr[u] = {l, r};
tr[u].tag = -1;
if (l == r) {
tr[u].val = (w[l] >= x);
//tr[u].tag = 0;
return;
}
int mid = l + r >> 1;
build(u << 1, l, mid, x), build(u << 1 | 1, mid + 1, r, x);
pushup(u);
}
void modify(int u, int l, int r, int x) {
if (l <= tr[u].l && tr[u].r <= r) {
tr[u].tag = x;
tr[u].val = x * (tr[u].r - tr[u].l + 1);
return;
}
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if (l <= mid) modify(u << 1, l, r, x);
if (r > mid) modify(u << 1 | 1, l, r, x);
pushup(u);
}
int query(int u, int l, int r) {
if (l <= tr[u].l && tr[u].r <= r) {
return tr[u].val;
}
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
int res = 0;
if (l <= mid) res += query(u << 1, l, r);
if (r > mid) res += query(u << 1 | 1, l, r);
return res;
}
}t1, t2;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
//freopen("D:\\cpeditor\\competition\\Atcoder\\abc237\\data.txt", "r", stdin);
//freopen("D:\\cpeditor\\competition\\Atcoder\\abc237\\myans.txt", "w", stdout);
cin >> n >> q >> x;
for (int i = 1; i <= n; i++) cin >> w[i];
t1.build(1, 1, n, x);
t2.build(1, 1, n, x + 1);
while (q--) {
int op, l, r;
cin >> op >> l >> r;
int cnt1 = t1.query(1, l, r), cnt2 = t2.query(1, l, r);
int len = r - l + 1;
if (op == 1) { //asc
if (cnt1 && cnt1 != len) {
t1.modify(1, l, r - cnt1, 0); t1.modify(1, r - cnt1 + 1, r, 1);
}
if (cnt2 && cnt2 != len) {
t2.modify(1, l, r - cnt2, 0); t2.modify(1, r - cnt2 + 1, r, 1);
}
} else {
if (cnt1 && cnt1 != len) {
t1.modify(1, l, l + cnt1 - 1, 1); t1.modify(1, l + cnt1, r, 0);
}
if (cnt2 && cnt2 != len) {
t2.modify(1, l, l + cnt2 - 1, 1); t2.modify(1, l + cnt2, r, 0);
}
}
}
// cout << "test" << endl;
for(int i = 1; i <= n; i++) {
//cout << t1.query(1, i, i) << " " << t2.query(1, i, i) << endl;
if(t1.query(1, i, i) != t2.query(1, i, i)) {
cout << i << "\n";
}
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
AtCoder Beginner Contest 237 G - Range Sort Query的更多相关文章
- AtCoder Beginner Contest 272 - G - Yet Another mod M
随机 + 数论 题意 Submission #35524126 - AtCoder Beginner Contest 272 给一个长度为 \(n\;(1<=n<=5000)\) 的数组 ...
- AtCoder Beginner Contest 260 G // imos(累积和算法)
题目传送门:G - Scalene Triangle Area (atcoder.jp) 题意: 给定大小为N*N的OX矩阵,若矩阵的(s,t)处为O,其覆盖范围为:满足以下条件的所有位置(i,j) ...
- AtCoder Beginner Contest 282 G - Similar Permutation
套路题 题意 求有多少个 \(1\) 到 \(n\) 的排列满足恰有 \(k\) 对在排列中相邻的数满足前小于后 \(2 \leq n \leq 500, 0 \leq k \leq (n - 1)\ ...
- AtCoder Beginner Contest 242 题解
目录 C - 1111gal password D - ABC Transform E - (∀x∀) F - Black and White Rooks G - Range Pairing Quer ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 154 题解
人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...
- AtCoder Beginner Contest 184 题解
AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...
- AtCoder Beginner Contest 173 题解
AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...
- AtCoder Beginner Contest 285 解题报告
AtCoder Beginner Contest 285 解题报告 \(\text{DaiRuiChen007}\) Contest Link A. Edge Checker 2 假设 \(a\ge ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
随机推荐
- UE构建基础和实践:五、CI/CD平台自动化打包
序言 使用CI/CD平台构建(这里使用蓝盾平台)主要是通过平台脚本运行上一章的py脚本并传递参数(即把py中的参数开放给配置平台脚本配置). Build.py 重构 我们需要在py脚本里面解析和设置参 ...
- SpringBoot3数据库集成
标签:Jdbc.Druid.Mybatis.Plus: 一.简介 项目工程中,集成数据库实现对数据的增晒改查管理,是最基础的能力,而对于这个功能的实现,其组件选型也非常丰富: 通过如下几个组件来实现数 ...
- 图加速数据湖分析-GeaFlow和Apache Hudi集成
表模型现状与问题 关系模型自1970年由埃德加·科德提出来以后被广泛应用于数据库和数仓等数据处理系统的数据建模.关系模型以表作为基本的数据结构来定义数据模型,表为二维数据结构,本身缺乏关系的表达能力, ...
- 想了解API接口,这一篇就够了
API(Application Programming Interface)接口,对于大多数人来说可能还比较陌生,但实际上我们每天都在与它打交道.无论是使用手机上的应用程序,还是在网上购物,都少不了A ...
- Andrew Ng 机器学习&深度学习课程 代码作业解答 集合
写在最前 2018年是对自己来说是崭新的一年,在过去的3个多月里,从最基础的lr, 学到现在的LSTM, GAN..感觉第一次追上了计算机科学飞速发展的浪潮.虽然很多地方都仍是一知半解,但时间还长 ...
- Vue源码学习(二):<templete>渲染第一步,模板解析
好家伙, 1.<template>去哪了 在正式内容之前,我们来思考一个问题, 当我们使用vue开发页面时,<tamplete>中的内容是如何变成我们网页中的内容的? 它会经历 ...
- 什么是IP协议?
简介: IP(Internet Protocol)协议,又称网际协议,是TCP/IP协议的核心.它负责Internet上网络之间的通信,并规定了将数据报从一个网络传输到另一个网络所应遵循的规则.具体来 ...
- EXE一机一码打包加密大师(EXE加密, 一机一码, 添加授权,添加静态密码,支持设置试用时间)
EXE一机一码打包加密大师可以打包加密保护EXE文件,同时给EXE文件添加上一机一码认证,或者静态密码,不同的电脑打开加密后的文件需要输入不同的激活码才能正常使用,保护文件安全,方便向用户收费. 下载 ...
- 提高 MySQL查询效率的方法
当涉及到提高MySQL查询效率时,以下是一些重要的策略和技巧,可以帮助你优化数据库性能.无论你是一个Web开发者.数据工程师还是系统管理员,这些方法都可以帮助你确保你的MySQL数据库运行得更快.更有 ...
- 「codeforces - 1519E」Off by One
link. 点 \(A\) 与 \((0,0)\),\(B\) 共线的充要条件是 \(\frac{y_A}{x_A}=\frac{y_B}{x_B}\),即 \(k_{OA}=k_{OB}\).又考虑 ...