AC日记——Sign on Fence Codeforces 484e
4 seconds
256 megabytes
standard input
standard output
Bizon the Champion has recently finished painting his wood fence. The fence consists of a sequence of n panels of 1 meter width and of arbitrary height. The i-th panel's height is hi meters. The adjacent planks follow without a gap between them.
After Bizon painted the fence he decided to put a "for sale" sign on it. The sign will be drawn on a rectangular piece of paper and placed on the fence so that the sides of the sign are parallel to the fence panels and are also aligned with the edges of some panels. Bizon the Champion introduced the following constraints for the sign position:
- The width of the sign should be exactly w meters.
- The sign must fit into the segment of the fence from the l-th to the r-th panels, inclusive (also, it can't exceed the fence's bound in vertical direction).
The sign will be really pretty, So Bizon the Champion wants the sign's height to be as large as possible.
You are given the description of the fence and several queries for placing sign. For each query print the maximum possible height of the sign that can be placed on the corresponding segment of the fence with the given fixed width of the sign.
The first line of the input contains integer n — the number of panels in the fence (1 ≤ n ≤ 105).
The second line contains n space-separated integers hi, — the heights of the panels (1 ≤ hi ≤ 109).
The third line contains an integer m — the number of the queries (1 ≤ m ≤ 105).
The next m lines contain the descriptions of the queries, each query is represented by three integers l, r and w (1 ≤ l ≤ r ≤ n,1 ≤ w ≤ r - l + 1) — the segment of the fence and the width of the sign respectively.
For each query print the answer on a separate line — the maximum height of the sign that can be put in the corresponding segment of the fence with all the conditions being satisfied.
5
1 2 2 3 3
3
2 5 3
2 5 2
1 5 5
2
3
1
The fence described in the sample looks as follows:

The possible positions for the signs for all queries are given below.
The optimal position of the sign for the first query.
The optimal position of the sign for the second query.
The optimal position of the sign for the third query.
思路:
其实这题不水。
我们考虑主席树;
这个就变水了;
我们离散一下高度;
然后针对每个离散后的高度建立有n个节点的线段树;
线段树的末节点表示当前节点的高度是否大于当前离散的高度(不懂请看代码);
然后维护最大子段;
然后,每次二分高度,判断以当前高度的根的树高度是否在l~r区间满足w宽度;
然后,轻松ac(不知道wa了多少次);
来,上代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> #define maxn 100005 using namespace std; struct SequenceNodeType {
int p,hi;
};
struct SequenceNodeType point[maxn]; struct TreeNodeType {
int lc,rc,dis,ld,rd,size;
};
struct TreeNodeType tree[maxn*]; struct AnsType {
int l,r,dis,size; AnsType(int l_,int r_,int dis_,int size_)
{
l=l_,r=r_,dis=dis_,size=size_;
}
}; int if_z,n,hash[maxn],size,Pre,tot;
int li,ri,ans,x,m,root[maxn]; char Cget; inline void in(int &now)
{
now=,if_z=,Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
} bool icmp(int a,int b)
{
return a>b;
} bool cmp(SequenceNodeType a,SequenceNodeType b)
{
return a.hi>b.hi;
} void tree_build(int &now,int l,int r)
{
now=++tot;
tree[now].size=r-l+;
if(l==r) return ;
int mid=(l+r)>>;
tree_build(tree[now].lc,l,mid);
tree_build(tree[now].rc,mid+,r);
} void tree_add(int pre,int &now,int to,int l,int r)
{
now=++tot;
tree[now].size=tree[pre].size;
if(l==r)
{
tree[now].dis=,tree[now].rd=,tree[now].ld=;
return ;
}
int mid=(l+r)>>;
if(to>mid)
{
tree_add(tree[pre].rc,tree[now].rc,to,mid+,r);
tree[now].lc=tree[pre].lc;
}
else
{
tree_add(tree[pre].lc,tree[now].lc,to,l,mid);
tree[now].rc=tree[pre].rc;
}
tree[now].dis=tree[tree[now].lc].rd+tree[tree[now].rc].ld;
tree[now].dis=max(tree[now].dis,tree[tree[now].lc].dis);
tree[now].dis=max(tree[now].dis,tree[tree[now].rc].dis);
if(tree[tree[now].lc].ld==tree[tree[now].lc].size)
{
tree[now].ld=tree[tree[now].lc].size+tree[tree[now].rc].ld;
}
else tree[now].ld=tree[tree[now].lc].ld;
if(tree[tree[now].rc].rd==tree[tree[now].rc].size)
{
tree[now].rd=tree[tree[now].rc].size+tree[tree[now].lc].rd;
}
else tree[now].rd=tree[tree[now].rc].rd;
} struct AnsType tree_query(int now,int l,int r,int tl,int tr)
{
if(l==tl&&r==tr)
{
AnsType pos(tree[now].ld,tree[now].rd,tree[now].dis,tree[now].size);
return pos;
}
int mid=(l+r)>>;
if(tl>mid) return tree_query(tree[now].rc,mid+,r,tl,tr);
else if(tr<=mid) return tree_query(tree[now].lc,l,mid,tl,tr);
else
{
AnsType pos(,,,);
AnsType ll=tree_query(tree[now].lc,l,mid,tl,mid);
AnsType rr=tree_query(tree[now].rc,mid+,r,mid+,tr);
pos.size=ll.size+rr.size;
pos.dis=max(ll.dis,rr.dis);
pos.dis=max(pos.dis,ll.r+rr.l);
if(ll.size==ll.l) pos.l=ll.size+rr.l;
else pos.l=ll.l;
if(rr.size==rr.r) pos.r=rr.size+ll.r;
else pos.r=rr.r;
return pos;
}
} bool check(int now)
{
AnsType pos=tree_query(root[now],,n,li,ri);
int ans_=max(pos.dis,max(pos.l,pos.r));
if(ans_>=x) return true;
else return false;
} int find(int pos)
{
int l=,r=size,mid;
while(l<r)
{
mid=(l+r)>>;
if(hash[mid]==pos) return mid;
if(pos>hash[mid]) r=mid-;
else l=mid+;
}
return l;
} int main()
{
in(n);
for(int i=;i<=n;i++)
{
point[i].p=i;
in(point[i].hi);
hash[i]=point[i].hi;
}
sort(hash+,hash+n+,icmp);
sort(point+,point+n+,cmp);
size=unique(hash+,hash+n+)-hash-;
tree_build(root[],,n);Pre=root[];
for(int i=;i<=n;i++)
{
int to=find(point[i].hi);
tree_add(Pre,root[to],point[i].p,,n);Pre=root[to];
}
in(m);
while(m--)
{
in(li),in(ri),in(x);
int mid,l=,r=size;
while(l<=r)
{
mid=(l+r)>>;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
printf("%d\n",hash[ans]);
}
return ;
}
AC日记——Sign on Fence Codeforces 484e的更多相关文章
- Sign on Fence CodeForces - 484E
http://codeforces.com/problemset/problem/484/E 题意: 给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间 ...
- AC日记——Dynamic Problem Scoring codeforces 807d
Dynamic Problem Scoring 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <io ...
- AC日记——Sagheer, the Hausmeister codeforces 812b
812B - Sagheer, the Hausmeister 思路: 搜索: 代码: #include <cstdio> #include <cstring> #includ ...
- AC日记——Sagheer and Crossroads codeforces 812a
812A - Sagheer and Crossroads 思路: 模拟: 代码: #include <cstdio> #include <cstring> #include ...
- AC日记——Is it rated? codeforces 807a
Is it rated? 思路: 水题: 代码: #include <cstdio> #include <cstring> using namespace std; ],b[] ...
- Ac日记——Distances to Zero codeforces 803b
803B - Distances to Zero 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <i ...
- AC日记——Mice and Holes codeforces 797f
797F - Mice and Holes 思路: XXYXX: 代码: #include <cmath> #include <cstdio> #include <cst ...
- AC日记——Roma and Poker codeforces 803e
803E - Roma and Poker 思路: 赢或输或者平的序列: 赢和平的差的绝对值不得超过k: 结束时差的绝对值必须为k: 当“?”时可以自己决定为什么状态: 输出最终序列或者NO: dp( ...
- AC日记——Periodic RMQ Problem codeforces 803G
G - Periodic RMQ Problem 思路: 题目给一段序列,然后序列复制很多次: 维护序列很多次后的性质: 线段树动态开点: 来,上代码: #include <cstdio> ...
随机推荐
- 机器学习(一)之KNN算法
knn算法原理 ①.计算机将计算所有的点和该点的距离 ②.选出最近的k个点 ③.比较在选择的几个点中那个类的个数多就将该点分到那个类中 KNN算法的特点: knn算法的优点:精度高,对异常值不敏感,无 ...
- 12Vim在系统配置中的应用示例
Vim 在系统配置中的应用示例 1. 配置主机名称 为了便于咱局域网中查找某台特定的主机,后者对主机进行区分,除了要有IP地址外,还要为主机配置一个主机名,主机名之间可以通过这个类似于域名的名称来相互 ...
- jCarousel,jQuery下的滚动切换传送插件
转自:http://www.zhangxinxu.com/jq/jcarousel_zh/#Examples 介绍 jCarousel是一款 jQuery 插件, 用来控制水平或垂直排列的列表项. 这 ...
- java的面向对象 (2013-09-30-163写的日志迁移
1)面向对象的特征 1. 抽象:(从java方面来说抽象大多数人还是把它作为java中的一种特征来对待) 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象包括 ...
- 跟踪路由 tracert
由于最近遇到网络出现故障的问题,便使用到Tracert来确定了下出现故障的网络节点 记录下tracert命令相关内容 1. 简介 2. Tracert工作原理... 3. 常用参数 4. 使用示例与输 ...
- $ cat /usr/share/doc/wireshark-common/README.Debian
$ cat /usr/share/doc/wireshark-common/README.Debian I. Capturing packets with Wireshark/Tshark There ...
- InnoDB Redo Flush及脏页刷新机制深入分析
概要: 我们知道InnoDB采用Write Ahead Log策略来防止宕机数据丢失,即事务提交时,先写重做日志,再修改内存数据页,这样就产生了脏页.既然有重做日志保证数据持久性,查询时也可以直接从缓 ...
- Solr 7 部署与使用踩坑全记录
前言 Solr 是一种可供企业使用的.基于 Lucene 的搜索服务器,它支持层面搜索.命中醒目显示和多种输出格式.在这篇文章中,我将介绍 Solr 的部署和使用的基本操作,希望能让初次使用的朋友们少 ...
- JAVA 基础--开发环境Sublime Text 3 搭建
方法一 打开Sublime Text 3,依次点击Preference, Browse Packages,在打开的窗口中双击User文件夹,新建文件JavaC.sublime-build,用记事本打 ...
- PHP全栈开发
DAY01_PHP基础第一天 01.了解php 00:09:26 ★ 02.php的开发环境准备 00:13:47 ★ 03.人人都会编程 00:10:26 ...