Sign on Fence(连续的长为W的一段中最小的数字的最大值)
题目链接:http://codeforces.com/problemset/problem/484/E
题意:给你个n,n个木板都有高度,宽度都为1 ,给你两个数[l,r]和一个w,求在[l,r]区间的木板里宽度w的最大值,也就是连续的长为W的一段中最小的数字的最大值。
思路:首先想到了二分,找高度,然后就是如果对于每个木板高度,我们把大于等于i木板高度的线段树叶子设为1,其他为0,那么就肯定对于一个高度最长连续的1的值也就是维护一个线段树的和如果大于W
那么就肯定是可行的。所以是个求线段树中最长的连续的1的长度是多少的问题,这个问题要维护线段树的左边连续和,右边连续和,连续和的最大值。对高度从大到小排序,依次分别插入到n颗线段树中形成可持久化线段树(主席树),就能节省许多空间复杂度。维护起来 比较麻烦,好繁琐。。。
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<set>
#define ll long long
using namespace std;
const int maxn=1e5+;
int root[maxn],cnt;
struct Node{
int val;
int id;
}a[maxn];
struct node{
int l;
int r;
int len;
int left;
int right;
int sum;
}tree[maxn*];
void pushup(int cur)
{
tree[cur].len=tree[tree[cur].l].len+tree[tree[cur].r].len;
tree[cur].left=tree[tree[cur].l].left;
if(tree[tree[cur].l].left==tree[tree[cur].l].len)
tree[cur].left+=tree[tree[cur].r].left;
tree[cur].right=tree[tree[cur].r].right;
if(tree[tree[cur].r].right==tree[tree[cur].r].len)
tree[cur].right+=tree[tree[cur].l].right;
tree[cur].sum=max(tree[tree[cur].l].sum,tree[tree[cur].r].sum);
tree[cur].sum=max(tree[cur].sum,tree[tree[cur].l].right+tree[tree[cur].r].left);
}
void build(int &cur,int l,int r)
{
cur=++cnt;
if(l==r)
{
tree[cur].left=;
tree[cur].right=;
tree[cur].sum=;
tree[cur].len=;
return ;
}
int m=(l+r)>>;
build(tree[cur].l,l,m);
build(tree[cur].r,m+,r);
pushup(cur);
}
void update(int &now,int last,int l,int r,int tar)
{
tree[++cnt]=tree[last];
now=cnt;
if(l==r)
{
tree[now].left=;
tree[now].right=;
tree[now].sum=;
tree[now].len=;
return ;
}
int m=(l+r)>>;
if(tar<=m)
update(tree[now].l,tree[last].l,l,m,tar);
else
update(tree[now].r,tree[last].r,m+,r,tar);
pushup(now);
}
int query(int now,int L,int R,int l,int r)
{
if(L<=l&&r<=R)
return tree[now].sum;
int m=(l+r)>>;
if(R<=m)
return query(tree[now].l,L,R,l,m);
if(L>m)
return query(tree[now].r,L,R,m+,r);
int res=;
res=max(query(tree[now].l,L,R,l,m),query(tree[now].r,L,R,m+,r));
int ll=min(tree[tree[now].l].right,m-L+);
int rr=min(tree[tree[now].r].left,R-m);
res=max(res,ll+rr);
return res;
}
bool cmp(Node x,Node y)
{
return x.val>y.val;
}
int main()
{
int n,m;
cnt=;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i].val);
a[i].id=i;
}
sort(a+,a++n,cmp);
build(root[],,n);
for(int i=;i<=n;i++)
update(root[i],root[i-],,n,a[i].id);
scanf("%d",&m);
int ans=;
while(m--)
{
int l,r,w;
scanf("%d%d%d",&l,&r,&w);
int ll=,rr=n;
while(ll<=rr)
{
int mid=(ll+rr)>>;
int res=query(root[mid],l,r,,n);
if(res>=w)
{
ans=mid;
rr=mid-;
}
else ll=mid+;
} printf("%d\n",a[ans].val);
}
return ;
}
Sign on Fence(连续的长为W的一段中最小的数字的最大值)的更多相关文章
- 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的数 维护 ...
- 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 ...
- 【CF484E】Sign on Fence(主席树)
[CF484E]Sign on Fence(主席树) 题面 懒得贴CF了,你们自己都找得到 洛谷 题解 这不就是[TJOI&HEOI 排序]那题的套路吗... 二分一个答案,把大于答案的都变成 ...
- 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 ...
- 读入一个字符串str,输出字符串str中连续最长的数字串
要求: 读入一个长度不超过256的字符串,例如“abc123defg123456789hjfs123456”.要求输出“123456789” 思路: 遍历字符串,如果是数字串则计算往后一共有多少个数字 ...
- ZT 查找字符串中连续最长的数字串
查找字符串中连续最长的数字串 有俩方法,1)比较好理解一些.2)晦涩 1) /* 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回, 并把这个最长数字串付给其中一个函数参数outputstr ...
- CF484E Sign on Fence && [国家集训队]middle
CF484E Sign on Fence #include<bits/stdc++.h> #define RG register #define IL inline #define _ 1 ...
随机推荐
- redis配置主从出现DENIED Redis is running in protected mode
修改redis配置文件,将绑定的ip给注释掉 #127.0.0.1 在配置文件中将protected-mode 改为no protected-mode no 另一种方式是在配置文件中设置密码 requ ...
- [转帖]同事推荐的的aira2
Windows系统安装最新版Aria2客户端及使用教程 https://www.moerats.com/archives/519/ 改天学习一下. 说明:之前都是说的在Linux VPS服务器上安装A ...
- windows下重启nginx
参考:从零学nginx-windows下reload配置无效及如何重启 因为Nginx是多进程模型,有一个主进程和多个子进程,主进程只负责管理子进程,基本的网络事件由各个子进程处理. 所以有时候当我们 ...
- OD消息断点
[文章作者]: icefisher[作者邮箱]: 181712814@qq.com[软件下载]: [软件名称]: echap518.exe(只是供学习的crackme)[加壳方式]: 里面直接有个un ...
- Zookeeper入门概要
ZooKeeper是一个开源的分布式协调服务,由雅虎创建,是Google Chubby的开源实现.ZooKeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集 ...
- makeinfo - 翻译 Texinfo 文档
SYNOPSIS 总览 makeinfo [OPTION]... TEXINFO-FILE... DESCRIPTION 描述 将 Texinfo 源文档翻译为各种其他格式,默认是可以用 Emacs ...
- 北京师范大学第十五届ACM决赛-重现赛D Disdain Chain (规律+组合数学)
链接:https://ac.nowcoder.com/acm/contest/3/D 来源:牛客网 Disdain Chain 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...
- 2017 BJ ICPC 石子合并变种 向量基本功及分类考察
E 模拟 #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) # ...
- 超好用的input模糊搜索 jq模糊搜索,
上来先展示效果:默认展示效果: 输入内容: 上代码: css部分: <style type="text/css"> * { padding:; margin:; } h ...
- postman(二):详解在Pre-request Script中如何执行请求
一.这里以Pre-request Script标签来介绍 postman提供了postman提供了一个"Send a request"代码段,他是已经封装好的发送请求的方法 一个& ...