当前位置:网站首页>CF780G Andryusha and Nervous Barriers
CF780G Andryusha and Nervous Barriers
2022-07-30 13:17:00 【心怀凉月】
CF780G Andryusha and Nervous Barriers
考虑树套树。
一维维护区间列,另一维维护列上的球的高度,保证点数正确。
维护单点加,区间查。
扫描线高度从大到小维护到每一个板时的情况。
优化:区间查是判区间球高度最小都只能穿过挡板就结束掉。
时间复杂度 O ( n log 2 n ) \mathcal O(n\log^2n) O(nlog2n)。
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
#define ha putchar(' ')
#define he putchar('\n')
inline int read() {
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x * f;
}
inline void write(int x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9)
write(x / 10);
putchar(x % 10 + 48);
}
const int _ = 1e5 + 10, mod = 1e9 + 7;
int h, w, n, N;
ll ans[_ << 2];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q[_];
struct abc {
int u, l, r, s;
bool operator < (const abc &t) const {
return u > t.u;
}
} k[_];
void build(int o, int l, int r) {
if (l == r) {
q[l].push({
h + 1, 1});
ans[o] = h + 1;
return;
}
int mid = (l + r) >> 1;
build(o << 1, l, mid), build(o << 1 | 1, mid + 1, r);
ans[o] = min(ans[o << 1], ans[o << 1 | 1]);
}
void upd(int o, int l, int r, int pos, int p, int h) {
if (l == r) {
q[l].push({
h, p});
ans[o] = min(ans[o], (ll)h);
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) upd(o << 1, l, mid, pos, p, h);
else upd(o << 1 | 1, mid + 1, r, pos, p, h);
ans[o] = min(ans[o << 1], ans[o << 1 | 1]);
}
int qry(int o, int l, int r, int L, int R, int h, int s) {
if (ans[o] > h + s) return 0;
if (l == r) {
int res = 0;
while (!q[l].empty() && q[l].top().first <= h + s) {
res = (res + q[l].top().second) % mod;
q[l].pop();
}
ans[o] = q[l].empty() ? 1e10 + 7 : q[l].top().first;
return res;
}
int mid = (l + r) >> 1, res = 0;
if (L <= mid) res = qry(o << 1, l, mid, L, R, h, s);
if (R > mid) res = (res + qry(o << 1 | 1, mid + 1, r, L, R, h, s)) % mod;
ans[o] = min(ans[o << 1], ans[o << 1 | 1]);
return res;
}
signed main() {
h = read(), w = read(), n = read();
for (int i = 1; i <= n; ++i) k[i].u = read(), k[i].l = read(), k[i].r = read(), k[i].s = read();
N = w;
build(1, 1, w);
sort(k + 1, k + n + 1);
for (int i = 1; i <= n; ++i) {
int t = qry(1, 1, w, k[i].l, k[i].r, k[i].u, k[i].s);
N = (N + t) % mod;
if (k[i].l == 1) upd(1, 1, w, k[i].r + 1, (t << 1) % mod, k[i].u);
else if (k[i].r == w) upd(1, 1, w, k[i].l - 1, (t << 1) % mod, k[i].u);
else {
upd(1, 1, w, k[i].l - 1, t, k[i].u);
upd(1, 1, w, k[i].r + 1, t, k[i].u);
}
}
write(N), he;
return 0;
}
边栏推荐
- R语言向前或者向后移动时间序列数据(自定义滞后或者超前的期数):使用dplyr包中的lag函数将时间序列数据向后移动一天(设置参数n为负值)
- 忆联:激活数据要素价值潜能,释放SAS SSD创新红利
- 元宇宙的六大支撑技术
- Hu-cang integrated e-commerce project (1): project background and structure introduction
- 自动化测试的生命周期是什么?
- 在 Scala 中读取整个文件
- IDEA 重复代码快速重构(抽取重复代码快捷键)
- 05 | 后台登录:基于账号密码的登录方式(下)
- no matching host key type found. Their offer: ssh-rsa
- ENVI Image Processing (6): NDVI and Vegetation Index
猜你喜欢
随机推荐
干货分享:小技巧大用处之Bean管理类工厂多种实现方式
R语言使用方差分析ANOVA比较回归模型的差异、anova函数比较两个模型并报告它们是否存在显著差异(两个模型的数据相同,一个模型使用的预测特征包含另外一个模型的特征)
Dolphinscheduler stand-alone transformation
Parallelized Quick Sort Ideas
How to display an Excel table in the body of an email?
SQL 26 calculation under 25 years of age or older and the number of users
Composer安装方式
strlen跟sizeof区别
shell 编程规范与变量
Yilian: Activating the Value Potential of Data Elements and Unleashing the Innovation Dividend of SAS SSD
剑指 Offer 05. 替换空格
Study Notes - Becoming a Data Analyst in Seven Weeks "Week 2: Business": Business Analysis Metrics
【高等数学】【7】二重积分
Apache Log4j2漏洞
外包干了七年,废了。。。
PyQt5快速开发与实战 8.6 设置样式
大手笔!两所“双一流”大学,获75亿元重点支持!
Raja Koduri澄清Arc GPU跳票传闻 AXG年底前新推四条产品线
一本通循环结构的程序设计题解(2)
“封号斗罗” 程序员修炼之道:通向务实的最高境界








