\(\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. 强化学习实战 | 自定义gym环境之显示字符串

    如果想用强化学习去实现扫雷.2048这种带有数字提示信息的游戏,自然是希望自定义 gym 环境时能把字符显示出来.上网查了很久,没有找到gym自带的图形工具Viewer可以显示字符串的信息,反而是通过 ...

  2. CentOS6.4安装Zookeeper-3.4.12图解教程

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6595380916590215683/ 安装工具 VMware_workstation_full_12.5.2 Ce ...

  3. springboot启动过程中常用的回调

    1.介绍 springboot提供非常丰富回调接口,利用这些接口可以做非常多的事情,对于一些常用的回调接口进行介绍 2.常用的拓展接口 1.ApplicationContextInitializer ...

  4. antd的table组件设置Column的width列宽度不生效问题

    超长连续字段(长数字和长单词) 破坏表格布局的问题(即使你指定了列的宽度也会被挤开),之前组件内默认加过 word-break: break-word; 去纠正此类布局,又会引起其他的问题. 所以最好 ...

  5. HIVE理论学习笔记

    概述 参加了新的公司新的工作新的环境之后,本人必须学习更多的知识,所以稳固之前的知识和学习新的知识是重中之重,新的公司把hadoop大部分的组件都进行了架构源码深度改造,所以使用过程确实遇到一些麻烦, ...

  6. Sentry 企业级数据安全解决方案 - Relay PII 和数据清理

    本文档描述了一种我们希望最终对用户隐藏的配置格式.该页面仍然存在的唯一原因是当前 Relay 接受这种格式以替代常规数据清理设置. 以下文档探讨了 Relay 使用和执行的高级数据清理配置的语法和语义 ...

  7. Python实现自动更改系统用户密码,生成随机密码

    算是一个实用的例子,定制系统任务,并将随机密码上传至日志服务器,实现定期修改密码: 部分代码: 1 #!/usr/bin/env python 2 #coding:utf-8 3 import ran ...

  8. /etc/crontab和crontab -e的区别

    (1) /etc/crontab是系统级别的crontab,系统的设置等,这种方法只有root用户能用 crontab -e是用户级的crontab,会被写到 /var/spool/cron 目录下, ...

  9. 负载均衡的比例(权重,ip_hash,轮询)

    目录 一:负载均衡的比例 1.轮询 2.权重 3.ip_hash 二:测试轮询 1.测试 2.重启 3.网址测试 三:测试ip_hash 一:负载均衡的比例 1.轮询 # 默认情况下,Nginx负载均 ...

  10. Mysql-5.7主从部署-yum方式

    一.环境准备 # rpm -qa |grep mariadb |xargs yum remove -y # setenforce 0(临时关闭),(selinux配置文件:SELINUX=disabl ...