原题链接 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的更多相关文章

  1. AtCoder Beginner Contest 272 - G - Yet Another mod M

    随机 + 数论 题意 Submission #35524126 - AtCoder Beginner Contest 272 给一个长度为 \(n\;(1<=n<=5000)\) 的数组 ...

  2. AtCoder Beginner Contest 260 G // imos(累积和算法)

    题目传送门:G - Scalene Triangle Area (atcoder.jp) 题意: 给定大小为N*N的OX矩阵,若矩阵的(s,t)处为O,其覆盖范围为:满足以下条件的所有位置(i,j) ...

  3. AtCoder Beginner Contest 282 G - Similar Permutation

    套路题 题意 求有多少个 \(1\) 到 \(n\) 的排列满足恰有 \(k\) 对在排列中相邻的数满足前小于后 \(2 \leq n \leq 500, 0 \leq k \leq (n - 1)\ ...

  4. AtCoder Beginner Contest 242 题解

    目录 C - 1111gal password D - ABC Transform E - (∀x∀) F - Black and White Rooks G - Range Pairing Quer ...

  5. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  6. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  7. AtCoder Beginner Contest 184 题解

    AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...

  8. AtCoder Beginner Contest 173 题解

    AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...

  9. AtCoder Beginner Contest 285 解题报告

    AtCoder Beginner Contest 285 解题报告 \(\text{DaiRuiChen007}\) Contest Link A. Edge Checker 2 假设 \(a\ge ...

  10. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

随机推荐

  1. docker下nginx配置

    一步一坑安装docker  nginx 首先选择适当版本镜像下载 我选的: nginx:1.16.0 docker pull nginx:1.16.0 安装完毕之后创建挂载文件夹 : mkdir /u ...

  2. 实现无限存储:基于JuiceFS 创建 Samba 和 NFS 共享

    随着企业数据量的持续增长,存储容量需求日益增大.如何采用没有容量上限的云存储替换本容量有限的本地磁盘,已成为广泛的需求和共识.特别是在企业中常用的 Samba 和 NFS 共享,如果能够使用云存储作为 ...

  3. go创建web项目分别在windows和linux部署

    转载请注明出处: 要在Linux服务器上运行Go的Web项目,可以按照以下步骤进行操作: 在服务器上安装Go:首先,在Linux服务器上安装Go编程语言.你可以从官方网站(https://golang ...

  4. 手把手教你使用人工智能生成游戏 3D 素材

    引言 生成式 AI 已成为游戏开发中艺术工作流的重要组成部分.然而,正如我在 之前的文章 中描述的,从文本到 3D 的实用性仍落后于 2D.不过,这种情况正在改变.本文我们将重新审视 3D 素材生成的 ...

  5. 4、Spring之依赖注入

    依赖注入就是对类的属性进行赋值 4.1.环境搭建 创建名为spring_ioc_xml的新module,过程参考3.1节 4.1.1.创建spring配置文件 <?xml version=&qu ...

  6. U268603 I Hate This Tree 题解

    传送门 一道纯粹的码力 + 卡常题. 前置 矩阵乘法,线段树. 分析 线段树存矩阵. 构造迭代矩阵: \[\begin{pmatrix}f_i&f_{i-1}\end{pmatrix}\tim ...

  7. 一篇关于获得拼多多商品详情 API的使用说明

    拼多多(Pinduoduo)是中国一家快速发展的电商平台,为了帮助开发者更好地接入拼多多,平台提供了丰富的 API 接口供开发者使用,其中包括获取拼多多商品详情的 API.接下来,我们将介绍如何使用拼 ...

  8. QA|20221002|SecureCRT中退格键变成了^H

    原因:backspace键和delete键的键码映射问题   解决办法一:要使用回删键(backspace)时,同时按住ctrl键   解决办法二:重新设置码值映射关系.比如SecureCRT中,会话 ...

  9. 虚拟机问题:VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行

    解决办法:关闭Hyper-V功能. windows10使用VMware Workstation打开虚拟机时显示 VMware Workstation 与 Hyper-V 不兼容.请先从系统中移除 Hy ...

  10. Kafka Stream 高级应用

    9.1将Kafka 与其他数据源集成 对于第一个高级应用程序示例,假设你在金融服务公司工作.公司希望将其现有数据迁移到新技术实现的系统中,该计划包括使用 Kafka.数据迁移了一半,你被要求去更新公司 ...