\(\mathcal{Description}\)

  Link.

  呐……不想概括题意,自己去读叭~

\(\mathcal{Solution}\)

  如果仅有 1. 3. 操作,能不能做?

  ——简单整体二分。

  如果仅有 1. 2. 操作,能不能实时维护每个位置还剩下多少人?累计走了多少人?

  ——吉司机线段树。

  所以,离线下来,把上两个重工业揉在一起就能粗暴地过掉这道题√ 复杂度 \(\mathcal O(n\log^2n)\)(\(n,m,q\) 同阶)。

  有 \(\mathcal O(n\log n)\) 而且短得多的算法欸,问 Tiw 嘛 qwq。

\(\mathcal{Code}\)

/* Clearink */

#include <cstdio>
#include <vector> #define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) typedef long long LL;
#define int LL template<typename Tp = int>
inline Tp rint() {
Tp x = 0; int s = getchar();
for ( ; s < '0' || '9' < s; s = getchar() );
for ( ; '0' <= s && s <= '9'; s = getchar() ) x = x * 10 + ( s ^ '0' );
return x;
} template<typename Tp>
inline void wint( Tp x ) {
if ( x < 0 ) putchar( '-' ), x = -x;
if ( 9 < x ) wint( x / 10 );
putchar( x % 10 ^ '0' );
} inline LL lmin( const LL a, const LL b ) { return a < b ? a : b; } const int MAXN = 2.5e5;
const LL LINF = 1ll << 60;
int n, m, q;
std::vector<int> allq; struct Event {
int a, b, c; LL d;
inline void read() {
if ( int op = rint(); op == 1 ) {
a = rint(), b = rint(), c = rint(), d = rint();
} else if ( op == 2 ) {
a = -1, b = rint(), c = rint(), d = rint();
} else {
a = b = -2, c = rint(), d = rint<LL>();
}
}
} evt[MAXN + 5]; struct SegmentTree {
LL tag[MAXN << 2]; inline void clear( const int u, const int l, const int r ) {
tag[u] = 0;
if ( l == r ) return ;
int mid = l + r >> 1;
clear( u << 1, l, mid ), clear( u << 1 | 1, mid + 1, r );
} inline void modify( const int u, const int l, const int r,
const int ml, const int mr, const LL v ) {
if ( ml <= l && r <= mr ) return void( tag[u] += v );
int mid = l + r >> 1;
if ( ml <= mid ) modify( u << 1, l, mid, ml, mr, v );
if ( mid < mr ) modify( u << 1 | 1, mid + 1, r, ml, mr, v );
} inline LL query( const int u, const int l, const int r, const int x ) {
if ( l == r ) return tag[u];
int mid = l + r >> 1;
if ( x <= mid ) return tag[u] + query( u << 1, l, mid, x );
else return tag[u] + query( u << 1 | 1, mid + 1, r, x );
}
} sgt; // It's for both Init and Solve. namespace Init { struct JiSegmentTree {
LL tag1[MAXN << 2], tag2[MAXN << 2], mnv[MAXN << 2], smn[MAXN << 2]; inline void clear( const int u, const int l, const int r ) {
smn[u] = LINF;
if ( l == r ) return ;
int mid = l + r >> 1;
clear( u << 1, l, mid ), clear( u << 1 | 1, mid + 1, r );
} inline void pushad( const int u, const LL v1, const LL v2 ) {
tag1[u] += v1, mnv[u] += v1;
if ( smn[u] != LINF ) smn[u] += v2, tag2[u] += v2;
} inline void pushdn( const int u ) {
int a = mnv[u << 1], b = mnv[u << 1 | 1];
if ( a <= b ) pushad( u << 1, tag1[u], tag2[u] );
else pushad( u << 1, tag2[u], tag2[u] );
if ( b <= a ) pushad( u << 1 | 1, tag1[u], tag2[u] );
else pushad( u << 1 | 1, tag2[u], tag2[u] );
tag1[u] = tag2[u] = 0;
} inline void pushup( const int u ) {
mnv[u] = lmin( mnv[u << 1], mnv[u << 1 | 1] );
smn[u] = LINF;
if ( mnv[u] < mnv[u << 1] ) smn[u] = lmin( smn[u], mnv[u << 1] );
if ( mnv[u] < mnv[u << 1 | 1] )
smn[u] = lmin( smn[u], mnv[u << 1 | 1] );
if ( mnv[u] < smn[u << 1] ) smn[u] = lmin( smn[u], smn[u << 1] );
if ( mnv[u] < smn[u << 1 | 1] )
smn[u] = lmin( smn[u], smn[u << 1 | 1] );
} inline void modify( const int u, const int l, const int r,
const int ml, const int mr, const LL v ) {
if ( ml <= l && r <= mr ) return pushad( u, v, v );
int mid = l + r >> 1; pushdn( u );
if ( ml <= mid ) modify( u << 1, l, mid, ml, mr, v );
if ( mid < mr ) modify( u << 1 | 1, mid + 1, r, ml, mr, v );
pushup( u );
} inline void upto( const int u, const int l, const int r,
const int ul, const int ur, const LL v ) {
if ( mnv[u] >= v ) return ;
if ( ul <= l && r <= ur && v < smn[u] )
return pushad( u, v - mnv[u], 0 );
int mid = l + r >> 1; pushdn( u );
if ( ul <= mid ) upto( u << 1, l, mid, ul, ur, v );
if ( mid < ur ) upto( u << 1 | 1, mid + 1, r, ul, ur, v );
pushup( u );
} inline LL query( const int u, const int l, const int r, const int x ) {
if ( l == r ) return mnv[u];
int mid = l + r >> 1; pushdn( u );
if ( x <= mid ) return query( u << 1, l, mid, x );
else return query( u << 1 | 1, mid + 1, r, x );
}
} jsgt; inline void init() {
jsgt.clear( 1, 1, n ); rep ( i, 1, q ) {
if ( evt[i].a >= 0 ) {
sgt.modify( 1, 1, n, evt[i].a, evt[i].b, evt[i].d );
jsgt.modify( 1, 1, n, evt[i].a, evt[i].b, evt[i].d );
} else if ( evt[i].a == -1 ) {
jsgt.modify( 1, 1, n, evt[i].b, evt[i].c, -evt[i].d );
jsgt.upto( 1, 1, n, evt[i].b, evt[i].c, 0 );
} else {
allq.push_back( i );
evt[i].d += sgt.query( 1, 1, n, evt[i].c )
- jsgt.query( 1, 1, n, evt[i].c );
}
}
} } // namespace Init. namespace Solve { int ans[MAXN + 5]; inline void divide( const int l, const int r, const std::vector<int>& qvec ) {
if ( qvec.empty() ) return ;
if ( l == r ) {
for ( int q: qvec ) ans[q] = l;
return ;
} int mid = l + r >> 1;
rep ( i, l, mid ) if ( evt[i].a >= 0 ) {
sgt.modify( 1, 1, n, evt[i].a, evt[i].b, evt[i].d );
} std::vector<int> qlef, qrig;
for ( int q: qvec ) {
if ( sgt.query( 1, 1, n, evt[q].c ) >= evt[q].d ) qlef.push_back( q );
else qrig.push_back( q );
} divide( mid + 1, r, qrig );
rep ( i, l, mid ) if ( evt[i].a >= 0 ) {
sgt.modify( 1, 1, n, evt[i].a, evt[i].b, -evt[i].d );
} divide( l, mid, qlef );
} inline void solve() {
sgt.clear( 1, 1, n );
divide( 1, q + 1, allq );
rep ( i, 1, q ) if ( evt[i].a == -2 ) {
wint( ans[i] > i ? 0 : evt[ans[i]].c ), putchar( '\n' );
}
} } // namespace Solve. signed main() {
n = rint(), m = rint(), q = rint();
rep ( i, 1, q ) evt[i].read(); Init::init();
Solve::solve();
return 0;
}

Solution -「JOISC 2021」「LOJ #3489」饮食区的更多相关文章

  1. Solution -「JOISC 2021」「LOJ #3495」聚会 2

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树.称点集 \(S\) 到结点 \(u\) 的会合距离为 \(\sum_{v\in S}\ope ...

  2. Solution -「JOISC 2021」「LOJ #3491」道路建设

    \(\mathcal{Description}\)   Link.   平面上有 \(n\) 个互不重合的点 \((x_{1..n},y_{1..n})\),求其两两曼哈顿距离的前 \(m\) 小值. ...

  3. Solution -「JOISC 2021」古老的机器

    \(\mathcal{Description}\)   Link.   这是一道通信题.   对于长度为一个 \(n\),仅包含字符 X, Y, Z 的字符串 \(s\),将其中 \(n\) 个字符按 ...

  4. Loj #2731 「JOISC 2016 Day 1」棋盘游戏

    Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...

  5. 【LOJ】#3036. 「JOISC 2019 Day3」指定城市

    LOJ#3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 #include < ...

  6. 【LOJ】#3034. 「JOISC 2019 Day2」两道料理

    LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...

  7. 【LOJ】#3032. 「JOISC 2019 Day1」馕

    LOJ#3032. 「JOISC 2019 Day1」馕 处理出每个人把馕切成N段,每一段快乐度相同,我们选择第一个排在最前的人分给他的第一段,然后再在未选取的的人中选一个第二个排在最前的切一下,并把 ...

  8. 【LOJ】#3033. 「JOISC 2019 Day2」两个天线

    LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...

  9. 【LOJ】#3031. 「JOISC 2019 Day1」聚会

    LOJ#3031. 「JOISC 2019 Day1」聚会 听说随机可过? 我想了很久想了一个不会被卡的做法,建出前\(u - 1\)个点的虚树,然后找第\(u\)个点的插入位置,就是每次找一条最长链 ...

随机推荐

  1. mysql 的 limit 与sql server 的 top n

    1.东西学多了,难免会混淆 貌似没有错,但是mysql不支持 top n 语法 而是使用 limit n 或 limit n , m 2.   top n 语法 是SQL server 的

  2. 解决maven每次更新都编程java1.5

    Maven: 每次更新Maven Project ,JAVA 版本都变为1.5 本文转载自:http://www.cnblogs.com/Hxinguan/p/6132446.html 问题: 1.创 ...

  3. 攻防世界-进阶-[re1-100]

    一.收集程序信息 64位的ELF文件,没有壳 二.放入IDA 使用64位IDA打开文件,先进行静态分析查看伪代码,进入main函数 通过这段可以得知输入的内容存储到了input中(这里我将bufwri ...

  4. Git 的配置 config

    Git 的配置 config Git 的配置 config config 文件简述 config 文件位置 信息查询 修改 config 文件 编辑配置文件 增加指定配置项 删除指定配置项 自助餐   ...

  5. Java安全之Spring内存马

    Java安全之Spring内存马 基础知识 Bean bean 是 Spring 框架的一个核心概念,它是构成应用程序的主干,并且是由 Spring IoC 容器负责实例化.配置.组装和管理的对象. ...

  6. 【Java】流程控制

    文章目录 流程控制 一.用户交互scanner 1.1 Scanner对象 1.2 Scanner进阶使用 二.顺序结构 三.选择结构 3.1 if单选择结构 3.2 if双选择结构 3.3 if多选 ...

  7. Solon 开发,四、Bean 扫描的三种方式

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  8. 【记录一个问题】opencl的clGetPlatformIDs()在cuda 9下返回-1001(找不到GPU平台)

    如题:在cuda9, nvidia驱动版本 384.81 的环境下运行opencl程序,在clGetPlatformIDs()函数中返回-1001错误. 把环境更换为cuda 10,驱动版本410.1 ...

  9. Docker 与 K8S学习笔记(十八)—— Pod的使用

    Pod 是一组紧密关联的容器集合,它们共享IPC.Network和UTS namespace,是 Kubernetes 调度的基本单元.Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件 ...

  10. Rust 连接 PostgreSQL 数据库

    这次,我们使用 postgres 这个 crate 来连接和操作 PostgreSQL 数据库. 创建好项目后,在 cargo.toml 里添加 postgres 的依赖: 首先,导入相关的类型,并创 ...