LOJ#6032. 「雅礼集训 2017 Day2」水箱
首先可以有一个平方复杂度的 \(DP\)
设 \(f_{i,j}\) 表示前面 \(i\) 个小格,高度为 \(j\) 的最大答案
令 \(h_i\) 表示隔板 \(i\) 的高度
当 \(j\le h_i\) 时,转移到 \(f_{i+1,k},k\in [0,h_i]\)
否则 \(f{i,j}\rightarrow f_{i+1,j}\)
\(m\) 个限制直接区间加法就好了
只需要做到区间对一个数取 \(max\),区间加法,区间询问 \(max\) 即可
直接令标记 \((a,b)\) 表示加 \(a\) 后对 \(b\) 取 \(max\),用在线段树上就好了
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn(3e5 + 5);
int n, m, test, o[maxn], len, h[maxn], ans, mx[maxn << 2];
vector <int> v1[maxn], v0[maxn];
struct Lazy_Tag {
int ad, mx;
inline Lazy_Tag operator +(Lazy_Tag b) const {
return (Lazy_Tag){ad + b.ad, max(mx + b.ad, b.mx)};
}
inline int Calc(int x) {
return max(x + ad, mx);
}
} tag[maxn << 2];
inline void Puttag(int x, Lazy_Tag v) {
tag[x] = tag[x] + v, mx[x] = v.Calc(mx[x]);
}
inline void Pushdown(int x) {
if (!tag[x].ad && !tag[x].mx) return;
Puttag(x << 1, tag[x]), Puttag(x << 1 | 1, tag[x]);
tag[x].ad = tag[x].mx = 0;
}
void Modify(int x, int l, int r, int ql, int qr, Lazy_Tag v) {
if (ql <= l && qr >= r) Puttag(x, v);
else {
int mid = (l + r) >> 1;
Pushdown(x);
if (ql <= mid) Modify(x << 1, l, mid, ql, qr, v);
if (qr > mid) Modify(x << 1 | 1, mid + 1, r, ql, qr, v);
mx[x] = max(mx[x << 1], mx[x << 1 | 1]);
}
}
int Query(int x, int l, int r, int ql, int qr) {
if (ql <= l && qr >= r) return mx[x];
else {
int mid = (l + r) >> 1, ret = 0;
Pushdown(x);
if (ql <= mid) ret = Query(x << 1, l, mid, ql, qr);
if (qr > mid) ret = max(ret, Query(x << 1 | 1, mid + 1, r, ql, qr));
mx[x] = max(mx[x << 1], mx[x << 1 | 1]);
return ret;
}
}
int main() {
int i, j, p, l1, l2, y, k;
scanf("%d", &test);
while (test--) {
memset(mx, 0, sizeof(mx)), memset(tag, 0, sizeof(tag));
scanf("%d%d", &n, &m), o[len = 1] = 1e9;
for (i = 1; i < n; ++i) scanf("%d", &h[i]), o[++len] = h[i];
for (i = 1; i <= n; ++i) v1[i].clear(), v0[i].clear();
for (i = 1; i <= m; ++i) {
scanf("%d%d%d", &p, &y, &k), ++y;
k ? v1[p].push_back(y) : v0[p].push_back(y);
o[++len] = y, o[++len] = y - 1;
}
sort(o + 1, o + len + 1), len = unique(o + 1, o + len + 1) - o - 1;
for (i = 1; i < n; ++i) h[i] = lower_bound(o + 1, o + len + 1, h[i]) - o;
for (i = 1; i <= n; ++i) sort(v1[i].begin(), v1[i].end()), sort(v0[i].begin(), v0[i].end());
for (i = 1; i <= n; ++i) {
l1 = v1[i].size(), l2 = v0[i].size();
for (j = 0; j < l1; ++j) {
y = lower_bound(o + 1, o + len + 1, v1[i][j]) - o;
Modify(1, 1, len, y, len, (Lazy_Tag){1, 0});
}
for (j = 0; j < l2; ++j) {
y = lower_bound(o + 1, o + len + 1, v0[i][j]) - o;
if (y > 1) Modify(1, 1, len, 1, y - 1, (Lazy_Tag){1, 0});
}
if (i == n) break;
y = Query(1, 1, len, 1, h[i]);
Modify(1, 1, len, 1, h[i], (Lazy_Tag){0, y});
}
printf("%d\n", mx[1]);
}
return 0;
}
LOJ#6032. 「雅礼集训 2017 Day2」水箱的更多相关文章
- loj#6032. 「雅礼集训 2017 Day2」水箱(并查集 贪心 扫描线)
题意 链接 Sol 神仙题+神仙做法%%%%%%%% 我再来复述一遍.. 首先按照\(y\)坐标排序,然后维护一个扫描线从低处往高处考虑. 一个连通块的内状态使用两个变量即可维护\(ans\)表示联通 ...
- loj #6032. 「雅礼集训 2017 Day2」水箱 线段树优化DP转移
$ \color{#0066ff}{ 题目描述 }$ 给出一个长度为 \(n\) 宽度为 \(1\) ,高度无限的水箱,有 \(n-1\) 个挡板将其分为 \(n\) 个 \(1 - 1\) 的小格, ...
- loj#6033. 「雅礼集训 2017 Day2」棋盘游戏(二分图博弈)
题意 链接 Sol 第一次做在二分图上博弈的题..感觉思路真是清奇.. 首先将图黑白染色. 对于某个点,若它一定在最大匹配上,那么Bob必胜.因为Bob可以一直沿着匹配边都,Alice只能走非匹配边. ...
- [LOJ#6033]. 「雅礼集训 2017 Day2」棋盘游戏[二分图博弈、匈牙利算法]
题意 题目链接 分析 二分图博弈经典模型,首先将棋盘二分图染色. 考虑在某个最大匹配中: 如果存在完美匹配则先手必败,因为先手选定的任何一个起点都在完美匹配中,而后手则只需要走这个点的匹配点,然后先手 ...
- loj#6034 「雅礼集训 2017 Day2」线段游戏
分析 区间李超树板子题 代码 #include<bits/stdc++.h> using namespace std; #define db double const int inf = ...
- 「雅礼集训 2017 Day2」水箱
题目链接 题意分析 我们用\(f[i][j]\)表示当前到达第\(i\)个位置水位高度为\(j\)的答案 如果那么\(h[i]\)为\(i\)和\(i+1\)之间的支柱高度 那么如果\(j≤h[i]\ ...
- 「雅礼集训 2017 Day2」水箱 (数据结构+dp ,一个log)
题面 题解 在网上看到有些做法,有什么平衡树.启发式合并等等总之复杂度O(Tnlog^2(n))的不优做法,这里我就用一个O(Tnlogn)的做法好了 其实大体上推导的思路都是一样的. 我们很容易发现 ...
- 「雅礼集训 2017 Day2」解题报告
「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...
- [LOJ 6031]「雅礼集训 2017 Day1」字符串
[LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...
随机推荐
- xp——极限编程的几个方法
最近阅读<Head First Java>一书时,看到极限编程(XP)的概念,觉得很有趣,摘抄下来以备后期继续学习. 极限编程(XP)是一种新型的软件开发方法论.他的构想是结合了许多种&q ...
- dataTable 参数说明
下面是一些常用的参数列表,比较常用或者有价值的标示为绿色. 功能参数(Features) 参数名 说明 参考值 默认值 autoWidth 定义是否由控件自动控制列宽 Boolean true def ...
- ReentrantLock锁的释放
一:代码 reentrantLock.unlock(); 虽然只有一句,但是源码却比较多: public final boolean release(int arg) { if (tryRelease ...
- iOS-Button图片和文字垂直居中【按钮图片和文字同时居中】
以前不怎么有这样的需求,最近开发经常用到,所以就干脆封装一个这样的 Button 让图片和字体都垂直居中,重写layoutSubviews方法,来实现就可以,至于 layoutSubviews 方法什 ...
- Go语言学习笔记(2)——变量、常量
1. 变量(变量由字母.数字和下划线组成,且不能以数字开头!) 1.1 第一种 var name type // 未赋值时使用默认值 name = value 1.2 第二种: 根据所赋的值 ...
- constructor 属性返回变量或对象的构造函数。判断是否为日期,数组的例子
constructor 属性返回变量或对象的构造函数. <!DOCTYPE html> <html> <head> <meta charset="u ...
- Storm实现数字累加Demo
import java.util.Map; import backtype.storm.Config; import backtype.storm.LocalCluster; import backt ...
- 对称(DES/AES)与非对称(RSA/SSL/数字证书)加密介绍及实际应用
本文不对具体的算法做深入研究,只是讲解各种安全算法的原理和使用场景. 一.数据校验算法 数据校验,是为保护数据的完整性,用一种指定的算法对原始数据计算出的一个校验值.当接收方用同样的算法再算一次校验值 ...
- artTemplate-优秀的前端模板引擎
artTemplate-优秀的前端模板引擎 1.html中引入artTemplate的js文件: <script type="text/javascript" src=&qu ...
- eclipse 首次使用配置
这里是eclipse neo版本的配置 1.设置workspace 首次启动,选择指定的工作空间(workspace),用于存放java代码.