CF484E Sign on Fence
题意
给定一个长度为n的数列,有m次询问,询问形如l r k
要你在区间[l,r]内选一个长度为k的区间,求区间最小数的最大值
Sol
二分答案
怎么判定,每种数字开一棵线段树
某个位置上的数大于等于它为1
那么就是求区间最大的1的序列长度大于k
二分的最优答案一定在这个区间内,否则不优
排序后就是用主席树优化空间
之前\(build\)一下,因为区间有长度不好赋值
# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(1e5 + 5);
const int __(2e6 + 5);
IL int Input(){
RG int x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
}
int n, m, tot, rt[_], a[_], id[_], ls[__], rs[__], o[_], len;
struct Data{
int maxl, maxr, maxn, len;
IL void Init(){
maxl = maxr = maxn = len = 0;
}
} T[__], Ans;
IL int Cmp(RG int x, RG int y){
return a[x] < a[y];
}
IL Data Merge(RG Data A, RG Data B){
RG Data ret;
ret.maxl = A.maxl, ret.maxr = B.maxr, ret.len = A.len + B.len;
ret.maxn = max(A.maxr + B.maxl, max(A.maxn, B.maxn));
if(A.maxl == A.len) ret.maxl = A.len + B.maxl;
if(B.maxr == B.len) ret.maxr = B.len + A.maxr;
return ret;
}
IL void Modify(RG int &x, RG int l, RG int r, RG int p){
ls[++tot] = ls[x], rs[tot] = rs[x], T[tot] = T[x], x = tot;
if(l == r){
T[x].maxl = T[x].maxr = T[x].maxn = 1;
return;
}
RG int mid = (l + r) >> 1;
if(p <= mid) Modify(ls[x], l, mid, p);
else Modify(rs[x], mid + 1, r, p);
T[x] = Merge(T[ls[x]], T[rs[x]]);
}
IL void Query(RG int x, RG int l, RG int r, RG int L, RG int R){
if(L <= l && R >= r){
Ans = Merge(Ans, T[x]);
return;
}
RG int mid = (l + r) >> 1;
if(L <= mid) Query(ls[x], l, mid, L, R);
if(R > mid) Query(rs[x], mid + 1, r, L, R);
}
IL void Build(RG int &x, RG int l, RG int r){
T[x = ++tot].len = r - l + 1;
if(l == r) return;
RG int mid = (l + r) >> 1;
Build(ls[x], l, mid), Build(rs[x], mid + 1, r);
}
int main(RG int argc, RG char* argv[]){
n = Input();
for(RG int i = 1; i <= n; ++i) id[i] = i, o[i] = a[i] = Input();
sort(id + 1, id + n + 1, Cmp), sort(o + 1, o + n + 1);
len = unique(o + 1, o + n + 1) - o - 1;
Build(rt[len + 1], 1, n);
for(RG int i = len, j = n; i; --i){
rt[i] = rt[i + 1];
for(; j && a[id[j]] == o[i]; --j)
Modify(rt[i], 1, n, id[j]);
}
m = Input();
for(RG int i = 1; i <= m; ++i){
RG int l = Input(), r = Input(), k = Input();
RG int L = 1, R = len, ans = 0;
while(L <= R){
RG int mid = (L + R) >> 1;
Ans.Init();
Query(rt[mid], 1, n, l, r);
if(Ans.maxn >= k) ans = mid, L = mid + 1;
else R = mid - 1;
}
printf("%d\n", o[ans]);
}
return 0;
}
CF484E Sign on Fence的更多相关文章
- CF484E Sign on Fence && [国家集训队]middle
CF484E Sign on Fence #include<bits/stdc++.h> #define RG register #define IL inline #define _ 1 ...
- 【CF484E】Sign on Fence(主席树)
[CF484E]Sign on Fence(主席树) 题面 懒得贴CF了,你们自己都找得到 洛谷 题解 这不就是[TJOI&HEOI 排序]那题的套路吗... 二分一个答案,把大于答案的都变成 ...
- CF 484E - Sign on Fence
E. Sign on Fence time limit per test 4 seconds memory limit per test 256 megabytes input standard in ...
- Codeforces Round #276 (Div. 1) E. Sign on Fence 二分+主席树
E. Sign on Fence Bizon the Champion has recently finished painting his wood fence. The fence consi ...
- Codeforces 484E Sign on Fence(是持久的段树+二分法)
题目链接:Codeforces 484E Sign on Fence 题目大意:给定给一个序列,每一个位置有一个值,表示高度,如今有若干查询,每次查询l,r,w,表示在区间l,r中, 连续最长长度大于 ...
- CF&&CC百套计划4 Codeforces Round #276 (Div. 1) E. Sign on Fence
http://codeforces.com/contest/484/problem/E 题意: 给出n个数,查询最大的在区间[l,r]内,长为w的子区间的最小值 第i棵线段树表示>=i的数 维护 ...
- AC日记——Sign on Fence Codeforces 484e
E. Sign on Fence time limit per test 4 seconds memory limit per test 256 megabytes input standard in ...
- 「CF484E」Sign on Fence「整体二分」「线段树」
题意 给定一个长度为\(n\)的正整数序列,第\(i\)个数为\(h_i\),\(m\)个询问,每次询问\((l, r, w)\),为\([l, r]\)所有长度为\(w\)的子区间最小值的最大值.( ...
- (困难) CF 484E Sign on Fence,整体二分+线段树
Bizon the Champion has recently finished painting his wood fence. The fence consists of a sequence o ...
随机推荐
- 【翻译】我如何使用CSS来制作bitsofcode Logo动画
翻译文章,翻译不好,还望大家指出 原文地址:How I Animated the bitsofcode Logo with CSS 我是css动画的新手,这样说是因为我只在有限的案例中使用过他们,而且 ...
- linux打印彩色字
echo显示带颜色,需要使用参数-e格式如下:echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"例如: echo -e "\033[41;37m T ...
- Windows使用问题总结
1 电脑休眠恢复之后无法识别Wifi无线网络 首先,重启电脑:其次,打开网络和共享中心,点击更改适配器设置:最后,在对应的无线网络连接图标上点击鼠标右键,属性,配置,电源选项,允许计算机关闭此设备以节 ...
- win7本地连接消失
可能原因一 驱动程序错误: 右键"计算机"图标 - "属性" - 设备管理器现在在设备管理器下面找到"网络适配器",在下面的网卡驱动中发现有 ...
- php常见面试题
1.如何取得来访者的IP地址? $_SERVER['RRMOTE_ADDR']; $_SERVER['CLIENT_IP']; $_SERVER['HTTP_X_FORWARED_FOR']; 2.$ ...
- 深入js正则
开题 我们常常有正则的各种需求,普通的正则匹配符虽然够用,但是满足不了我们一些很奇怪的需求,所以我们需要更多的关于正则的知识点. 需求 比如我们有一个这样的需求,匹配出字符串里的第一个div标签:aa ...
- CentOS7上安装FTP服务
---------------------------------------------------------------------------------------------------- ...
- Nginx和Apache有什么区别?
Nginx抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能. Apache rewrite ,比nginx 的rewrite ...
- java打包项目将配置文件放在包外面(后续还会有补充)
项目中也经常单独将一部分功能独立做Java Project,然后打成jar包供其他项目调用.如果jar包中需要读取配置文件信息,则很少把该配置打进jar包,因为它不方便修改,更多都是采用jar包读取外 ...
- Java三大特性(封装,继承,多态)
Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...