CF 484E Sign on Fence
来源:互联网 发布:数据挖掘工程师就业 编辑:程序博客网 时间:2024/06/17 19:27
可持久化线段树+二分
简要题意:给出l,r,w,在[l,r]中找连续的长度为w的一段,最大化这一段中的最小值。
最大化最小值,想到二分,那么check就应当是判断[l,r]内是否存在一段由大于等于二分答案的数所组成的长度≥w的连续区间。如果已经明确了这些数在哪里,这种查询是可以用线段树维护的。再考虑每一次实际上都是应用大于等于二分答案的所有数,删去小于二分答案的所有数。因此只需按数值从大到小维护可持久化线段树即可。
//21:22 ~ 21:48#include<cstdio>#include<cstdlib>#include<algorithm>#define N 100005#define cmin(u,v) (u)>(v)?(u)=(v):0#define cmax(u,v) (u)<(v)?(u)=(v):0using namespace std;namespace runzhe2000{ int in() { int r = 0; char c = getchar(); for(; c < '0' || c > '9'; c = getchar()); for(; c >='0' && c <='9'; c = getchar())r=r*10+c-'0'; return r; } int n, h[N], pos[N], mx, rm; bool cmp(int a, int b){return h[a] > h[b];} struct node { node *ch[2]; int lm, rm, mx; void pushup(int l, int r, int mid) { lm = (ch[0]->mx == mid-l+1 ? ch[0]->mx + ch[1]->lm : ch[0]->lm); rm = (ch[1]->mx == r-mid ? ch[1]->mx + ch[0]->rm : ch[1]->rm); mx = max(max(ch[0]->mx, ch[1]->mx), ch[0]->rm + ch[1]->lm); } }mem[N*20], *tot, *null, *root[N]; node *newnode() { node *p = ++tot; return p; } void init() { null = tot = mem; *null = (node){{null,null},0,0,0}; for(int i = 0; i <= n; i++) root[i] = newnode(); *root[0] = *null; } void ins(node *x, node *y, int l, int r, int p) { if(l == r) {y->lm = y->rm = y->mx = 1; return;} int mid = (l+r)>>1; if(p<=mid) { y->ch[1] = x->ch[1]; y->ch[0] = newnode(); ins(x->ch[0], y->ch[0], l, mid, p); } else { y->ch[0] = x->ch[0]; y->ch[1] = newnode(); ins(x->ch[1], y->ch[1], mid+1,r,p); } y->pushup(l,r,mid); } void query(node *x, int l, int r, int ql, int qr) { if(ql <= l && r <= qr) { cmax(mx, x->mx); cmax(mx, rm + x->lm); rm = x->mx == (r-l+1) ? rm + x->mx : x->rm; return; } int mid = (l+r)>>1; if(ql <= mid) query(x->ch[0], l, mid, ql, qr); if(mid < qr) query(x->ch[1], mid+1, r, ql, qr); } void main() { n = in(); init(); for(int i = 1; i <= n; i++) h[i] = in(), pos[i] = i; sort(pos+1,pos+1+n,cmp); for(int i = 1; i <= n; i++) ins(root[i-1], root[i], 1, n, pos[i]); for(int m = in(), i = 1, lef, rig, w; i <= m; i++) { lef = in(), rig = in(), w = in(); int l, r; for(l = 1, r = n; l < r; ) { int mid = (l+r)>>1; mx = rm = 0; query(root[mid], 1, n, lef, rig); if(mx >= w) r = mid; else l = mid + 1; } printf("%d\n",h[pos[l]]); } }}int main(){ runzhe2000::main();}
0 0
- CF 484E Sign on Fence
- Codeforces 484E Sign on Fence
- CodeForces 484E Sign on Fence
- codeforces 484E Sign on Fence
- 【CodeForces】484E Sign on Fence
- Codeforces 484E Sign on Fence(可持久化线段树+二分)
- 【codeforces】484E. Sign on Fence 可持久化线段树
- Codeforces 484E. Sign on Fence 可持久化线段树
- codeforces 484E Sign on Fence 可持久化线段树+二分查找
- [Codeforces276E]Sign on Fence CDQ分治
- 可持久化线段树 CF484E-Sign on Fence
- CF 242E XOR on Segment
- CF 232D Fence
- CF 276E Little Girl and Problem on Trees
- CF 242E XOR on Segment 【线段树】
- CF 242E XOR on Segment(二维线段树)
- CF 232 div2 E On Changing Tree 树状数组
- cf-e
- 算法竞赛入门经典 习题1-3 连续和(sum)
- S1考试错题本及解析
- 分栏控制器UITabBarController管理多个视图控制器以及界面跳转
- win32 遍历 文件夹中文件
- 【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)
- CF 484E Sign on Fence
- 记一次抗DDOS演练
- 算法竞赛入门经典 习题1-4 正弦和余弦 (sincos)
- Yii2 中 ActiveForm 和 GridView 使用 Pjax
- 事务控制
- oracle查询一个字符串所在表
- poj 2084 卡特兰数
- linux下编译和使用java文件
- 算法竞赛入门经典 习题1-5 距离(distance)