【LOJ】#3033. 「JOISC 2019 Day2」两个天线
LOJ#3033. 「JOISC 2019 Day2」两个天线
用后面的天线更新前面的天线,线段树上存历史版本的最大值
也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个,区间中最小的可用天线值,区间中最大的可用天线值
\(i\)可以被\(j\)用到,那么\(j\)在\([i + A_{i},i + B_{i}]\)中,我们枚举右端点的时候,假如到了\(i + A_{i}\)就把\(i\)标记为可用,如果到了\(i + B_{i} + 1\)就把\(i\)标记为不可用
然后枚举右端点,对于一个新加的端点,现在线段树中区间\([i - B_{i},i- A_{i}]\)是可用的,所以我们需要给这个区间打上标记
然后对于一个询问到了对应的右端点,只需要查找区间中历史版本的最大值就好了
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 200005
#define ba 47
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
struct node {
int l,r,mn,mx,lzmn,lzmx,oldmx;
}tr[MAXN * 4];
int N,Q,H[MAXN],A[MAXN],B[MAXN],ans[MAXN];
int ql[MAXN],qr[MAXN];
vector<int> ed[MAXN],st[MAXN],qe[MAXN];
void update(int u) {
tr[u].mn = min(tr[u << 1].mn,tr[u << 1 | 1].mn);
tr[u].mx = max(tr[u << 1].mx,tr[u << 1 | 1].mx);
tr[u].oldmx = max(tr[u << 1].oldmx,tr[u << 1 | 1].oldmx);
}
void addlz(int u,int v) {
tr[u].oldmx = max(tr[u].oldmx,v - tr[u].mn);
tr[u].oldmx = max(tr[u].oldmx,tr[u].mx - v);
tr[u].lzmn = min(v,tr[u].lzmn);
tr[u].lzmx = max(v,tr[u].lzmx);
}
void pushdown(int u) {
if(tr[u].lzmn <= 1e9) {
addlz(u << 1,tr[u].lzmn);
addlz(u << 1 | 1,tr[u].lzmn);
tr[u].lzmn = 2e9;
}
if(tr[u].lzmx > 0) {
addlz(u << 1,tr[u].lzmx);
addlz(u << 1 | 1,tr[u].lzmx);
tr[u].lzmx = 0;
}
}
void build(int u,int l,int r) {
tr[u].l = l;tr[u].r = r;
tr[u].mn = 1e9 + 1,tr[u].mx = 0;
tr[u].lzmn = 2e9;tr[u].lzmx = 0;tr[u].oldmx = -1;
if(l == r) return;
int mid = (l + r) >> 1;
build(u << 1,l,mid);
build(u << 1 | 1,mid + 1,r);
}
void change(int u,int pos,int op) {
if(tr[u].l == tr[u].r) {
if(op == 1) tr[u].mn = tr[u].mx = H[pos];
else {
tr[u].mn = 1e9 + 1,tr[u].mx = 0;
}
return;
}
pushdown(u);
int mid = (tr[u].l + tr[u].r) >> 1;
if(pos <= mid) change(u << 1,pos,op);
else if(pos > mid) change(u << 1 | 1,pos,op);
update(u);
}
void add(int u,int l,int r,int v) {
if(tr[u].l == l && tr[u].r == r) {
addlz(u,v);return;
}
pushdown(u);
int mid = (tr[u].l + tr[u].r) >> 1;
if(r <= mid) add(u << 1,l,r,v);
else if(l > mid) add(u << 1 | 1,l,r,v);
else {add(u << 1,l,mid,v);add(u << 1 | 1,mid + 1,r,v);}
update(u);
}
int Query(int u,int l,int r) {
if(tr[u].l == l && tr[u].r == r) return tr[u].oldmx;
int mid = (tr[u].l + tr[u].r) >> 1;
pushdown(u);
if(r <= mid) return Query(u << 1,l,r);
else if(l > mid) return Query(u << 1 | 1,l,r);
else {return max(Query(u << 1,l,mid),Query(u << 1 | 1,mid + 1,r));}
}
void Solve() {
read(N);
for(int i = 1 ; i <= N ; ++i) {
read(H[i]);read(A[i]);read(B[i]);
int l = i + A[i],r = min(i + B[i],N);
if(l <= r) {st[l].pb(i),ed[r + 1].pb(i);}
}
read(Q);
for(int i = 1 ; i <= Q ; ++i) {
read(ql[i]);read(qr[i]);
qe[qr[i]].pb(i);
}
build(1,1,N);
for(int i = 1 ; i <= N ; ++i) {
for(auto t : st[i]) change(1,t,1);
for(auto t : ed[i]) change(1,t,-1);
int l = i - B[i],r = i - A[i];
l = max(l,1);
if(l <= r) add(1,l,r,H[i]);
for(auto id : qe[i]) {
ans[id] = Query(1,ql[id],qr[id]);
}
}
for(int i = 1 ; i <= Q ; ++i) {
out(ans[i]);enter;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}
【LOJ】#3033. 「JOISC 2019 Day2」两个天线的更多相关文章
- 【LOJ】#3034. 「JOISC 2019 Day2」两道料理
LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...
- LOJ#2882. 「JOISC 2014 Day4」两个人的星座(计算几何)
题面 传送门 题解 我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线 那么我们可以\(O(n^2)\)枚举其中一条公切线,然后可以暴力\(O(n^3)\)计算 怎么优化呢?我们可以枚举一 ...
- @loj - 3039@ 「JOISC 2019 Day4」蛋糕拼接 3
目录 @description@ @solution@ @accepted code@ @details@ @description@ 今天是 IOI 酱的生日,所以她的哥哥 JOI 君给她预定了一个 ...
- LOJ #2877. 「JOISC 2014 Day2」交朋友 并查集+BFS
这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可 ...
- LOJ #2876. 「JOISC 2014 Day2」水壶 BFS+最小生成树+倍增LCA
非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话 ...
- [LOJ#2878]. 「JOISC 2014 Day2」邮戳拉力赛[括号序列dp]
题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没 ...
- 【LOJ】#3036. 「JOISC 2019 Day3」指定城市
LOJ#3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 #include < ...
- 【LOJ】#3031. 「JOISC 2019 Day1」聚会
LOJ#3031. 「JOISC 2019 Day1」聚会 听说随机可过? 我想了很久想了一个不会被卡的做法,建出前\(u - 1\)个点的虚树,然后找第\(u\)个点的插入位置,就是每次找一条最长链 ...
- 【LOJ】#3030. 「JOISC 2019 Day1」考试
LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...
随机推荐
- Cogs 729. [网络流24题] 圆桌聚餐
[网络流24题] 圆桌聚餐 ★★ 输入文件:roundtable.in 输出文件:roundtable.out 评测插件 时间限制:1 s 内存限制:128 MB «问题描述: 假设有来自m 个不同单 ...
- Linux进程通信之文件
父子进程共享打开的文件描述符------使用文件完成进程间通信. /*** fork_share_fd.c ***/ #include <stdio.h> #include <uni ...
- CSS简单选择器的学习笔记
我们知道通过CSS定义页面样式的时候要用到各种各样的选择器,正确的使用选择器是我们能够正确使用CSS做页面样式的基础.下面是我学习选择器的一个简易笔记,举一些简单的例子. 为了方便展示,我选择在内部的 ...
- linux下通过进程名查看其占用端口
linux下通过进程名查看其占用端口: 1.先查看进程pid ps -ef | grep 进程名 2.通过pid查看占用端口 netstat -nap | grep 进程pid 例:通过nginx进程 ...
- 安装完Pycharm,启动时碰到"failed to load jvm dll"的解决方案
今天安装完系统,配置pycharm的环境的时候,启动pycharm时,碰到"failed to load jvm dll"的错误, 下面给出其解决方案: 安装Microsoft V ...
- 剑指offer35----复制复杂链表
题目: 请实现一个cloneNode方法,复制一个复杂链表. 在复杂链表中,每个结点除了有一个next指针指向下一个结点之外,还有一个random指向链表中的任意结点或者NULL. 结点的定义如下: ...
- centOS7搭建hadoop,zookeeper,hbase
1.配置ssh免密登录 (本人使用的是centOS7虚拟机) (本人未在root用户下安装,建议使用root用户,不然很麻烦!!) ① 本机无密钥登录 1.进入~/.ssh目录(若无,则执行一次ssh ...
- asp.net webAPI
Get: 1.Get参数传递的本质是url字符串拼接:2.url字符串长度受限制:3.Get参数传递在Http请求头部传递,而不支持Request-Body传递:4.Get类型的方法支持参数为基本类型 ...
- Nginx作为静态资源web服务-跨站访问
一.跨域访问 1.什么是跨域? 参看我的另一篇博客(https://www.cnblogs.com/chrdai/p/11280895.html) 2.为什么浏览器禁止跨域访问? 不安全,容易出现CS ...
- leetcode218 天际线问题
来自leetcode题解:扫描线法AlgsCG class Solution { public: vector<vector<int>> getSkyline(vector&l ...