Codeforces 484E Sign on Fence(是持久的段树+二分法)
题目链接:Codeforces 484E Sign on Fence
题目大意:给定给一个序列,每一个位置有一个值,表示高度,如今有若干查询,每次查询l,r,w,表示在区间l,r中,
连续最长长度大于w的最大高度为多少。
解题思路:可持久化线段树维护区间合并,前端时间碰到一题可持久化字典树,就去查了一下相关论文,大概知道了是
什么东西。
将高度依照从大到小的顺序排序,然后每次插入一个位置,线段树维护最长连续区间,由于插入是依照从大到小的顺
序,所以每次的线段树中的连续最大长度都是满足高度大于等于当前新插入的height值。对于每次查询,二分高度,因
为高度肯定是在已有的高度中,所以仅仅接二分下表就可以。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>using namespace std;const int maxn = 1e6 + 5;
typedef pair<int,int> pii;
struct Node {int lc, rc, lp, rp, L, R, S;int length() {return rp - lp + 1;}
}nd[maxn << 2];int N, sz, root[maxn];
pii blo[maxn];inline int newNode() {return sz++;
}inline void pushup(int u) {int lcid = nd[u].lc, rcid = nd[u].rc;nd[u].L = nd[lcid].L + (nd[lcid].L == nd[lcid].length() ? nd[rcid].L : 0);nd[u].R = nd[rcid].R + (nd[rcid].R == nd[rcid].length() ? nd[lcid].R : 0);nd[u].S = max(nd[lcid].R + nd[rcid].L, max(nd[lcid].S, nd[rcid].S));
}inline Node merge(Node a, Node b) {Node u;u.lp = a.lp; u.rp = b.rp;u.L = a.L + (a.L == a.length() ? b.L : 0);u.R = b.R + (b.R == b.length() ? a.R : 0);u.S = max(a.R + b.L, max(a.S, b.S));return u;
}void build(int& u, int l, int r) {if (u == 0) u = newNode();nd[u] = (Node){0, 0, l, r, 0, 0, 0};if (l == r)return;int mid = (l + r) >> 1;build(nd[u].lc, l, mid);build(nd[u].rc, mid +1, r);pushup(u);
}int insert(int u, int x) {int k = newNode();nd[k] = nd[u];if (nd[k].lp == x && x == nd[k].rp) {nd[k].S = nd[k].L = nd[k].R = 1;return k;}int mid = (nd[k].lp + nd[k].rp) >> 1;if (x <= mid)nd[k].lc = insert(nd[k].lc, x);elsend[k].rc = insert(nd[k].rc, x);pushup(k);return k;
}Node query(int u, int l, int r) {if (l <= nd[u].lp && nd[u].rp <= r)return nd[u];int mid = (nd[u].lp + nd[u].rp) >> 1;if (r <= mid)return query(nd[u].lc, l, r);else if (l > mid)return query(nd[u].rc, l, r);else {Node ll = query(nd[u].lc, l, r);Node rr = query(nd[u].rc, l, r);return merge(ll, rr);}
}inline bool cmp (const pii& a, const pii& b) {return a.first > b.first;
}void init () {sz = 1;scanf("%d", &N);for (int i = 1; i <= N; i++) {scanf("%d", &blo[i].first);blo[i].second = i;}sort(blo + 1, blo + 1 + N, cmp);build(root[0], 1, N);for (int i = 1; i <= N; i++)root[i] = insert(root[i-1], blo[i].second);
}int main () {init();int q, l, r, w;scanf("%d", &q);while (q--) {scanf("%d%d%d", &l, &r, &w);int L = 1, R = N;while (L < R) {int mid = (L + R) >> 1;if (query(root[mid], l, r).S >= w)R = mid;elseL = mid + 1;}printf("%d\n", blo[L].first);}return 0;
}
Codeforces 484E Sign on Fence(是持久的段树+二分法)相关推荐
- CODEFORCES 484E Sign on Fence
链接 http://codeforces.com/contest/484/problem/E 题意 给出 n 个宽度为 1 ,高度为 h[i] 的矩形,从 1 到 n 连续挨着排.有 m 次询问,每次 ...
- CodeForces - 484E Sign on Fence(主席树区间合并+二分)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,需要回答 mmm 次询问,每次询问的格式如下: lrkl\ r\ kl r k,需要回答区间 [l,r][l,r][l,r] 内,所有长度 ...
- E. Sign on Fence(整体二分 + 线段树维护区间最大连续 1 的个数)
E. Sign on Fence 给定一个长度为nnn的数组aaa,1≤ai≤1091 \leq a_i \leq 10 ^ 91≤ai≤109,有mmm次询问,每次给定l,r,kl, r, kl, ...
- CFCC百套计划4 Codeforces Round #276 (Div. 1) E. Sign on Fence
http://codeforces.com/contest/484/problem/E 题意: 给出n个数,查询最大的在区间[l,r]内,长为w的子区间的最小值 第i棵线段树表示>=i的数 维护 ...
- C++Persistent segment tree持久段树的实现算法(附完整源码)
C++Persistent segment tree持久段树的实现算法 C++Persistent segment tree持久段树的实现算法完整源码(定义,实现,main函数测试) C++Persi ...
- 【CodeForces - 270A】Fancy Fence (几何,思维,水题)
题干: Emuskald needs a fence around his farm, but he is too lazy to build it himself. So he purchased ...
- CF484E Sign on Fence
题意 给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间,求区间最小数的最大值 Sol 二分答案 怎么判定,每种数字开一棵线段树 某个位置上的数大于等于 ...
- Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学
传送门 文章目录 题意: 思路: 题意: 思路: 考虑最终的序列是什么鸭子的,首先序列肯定单调不降,也就是a1≤a2≤a3≤...≤ana_1\le a_2\le a_3\le ...\le a_na ...
- Codeforces Round #727 (Div. 2) F. Strange Array 线段树 + 区间合并 + 排序优化
传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的数组,对每个位置iii求一个最大价值,价值计算方式如下:选择一个包含iii的[l,r][l,r][l,r],让后将其拿出来排序,之后价值 ...
最新文章
- 中国人工智能计划,我来说几句
- Spring快速入门及深入
- Linux lvs 多端口组成
- openwrt 3g模块上网
- DataGrid中加入CheckBox,并实现单选
- python小测验3_python基础小测试
- 为什么程序员对旧代码深恶痛绝?
- 百度C2C对决淘宝的两把利器
- Java笔记 —— 继承
- 引用Interop.SQLDMO.dll后的注意事项。
- postman传数组参数
- 估计理论(1):最小方差无偏估计(第2章)
- SpringBoot+Shiro,java开发面试问题大全及答案大全
- ExactScan pro for mac(万能扫描仪整合工具)
- The following method did not exist:com.google.gson.GsonBuilder.setLenient()
- html写一个简单版动态爱心
- 数据结构与算法之美(一):概论
- 类名.class 类名.this 详解
- 关于谋和断的辩证式扯淡
- CentOS7安装可移植Prometheus+grafana--alertmanager配置邮件告警
热门文章
- python循环报数游戏_报数游戏python 解答
- python标准函数什么意思_python中quote函数是什么意思,怎么用
- python爬虫入库到帝国cms_帝国小说连载系统合理利用第三方云爬虫缓存章节内容...
- Docker常见问题
- request.getInputStream中文乱码解决方案
- Eclipse 提示 The given project is not a virtual component project
- ArcGIS9.3 SDE安装
- 《Play for Java》学习笔记(七)数据类型解析——Body parser
- 修改Android Studio默认的gradle配置文件
- Java三种嵌入jsp的方法