题目链接: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);
else
nd[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;
else
L = mid + 1;
}
printf("%d\n", blo[L].first);
}
return 0;
}

Codeforces 484E Sign on Fence(是持久的段树+二分法)的更多相关文章

  1. (困难) CF 484E Sign on Fence,整体二分+线段树

    Bizon the Champion has recently finished painting his wood fence. The fence consists of a sequence o ...

  2. CF 484E - Sign on Fence

    E. Sign on Fence time limit per test 4 seconds memory limit per test 256 megabytes input standard in ...

  3. BZOJ 2588 Count on a tree (COT) 是持久的段树

    标题效果:两棵树之间的首次查询k大点的权利. 思维:树木覆盖树,事实上,它是正常的树木覆盖了持久段树. 由于使用权值段树可以寻求区间k大,然后应用到持久段树思想,间隔可以做减法.详见代码. CODE: ...

  4. Codeforces Round #276 (Div. 1) E. Sign on Fence (二分答案 主席树 区间合并)

    链接:http://codeforces.com/contest/484/problem/E 题意: 给你n个数的,每个数代表高度: 再给出m个询问,每次询问[l,r]区间内连续w个数的最大的最小值: ...

  5. 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 ...

  6. 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的数 维护 ...

  7. 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 ...

  8. codeforces 349B Color the Fence 贪心,思维

    1.codeforces 349B    Color the Fence 2.链接:http://codeforces.com/problemset/problem/349/B 3.总结: 刷栅栏.1 ...

  9. 【CF484E】Sign on Fence(主席树)

    [CF484E]Sign on Fence(主席树) 题面 懒得贴CF了,你们自己都找得到 洛谷 题解 这不就是[TJOI&HEOI 排序]那题的套路吗... 二分一个答案,把大于答案的都变成 ...

随机推荐

  1. 如何解决KEIL 5 编KEIL4同RTX系统的project解决方法

    1.我个人KEIL5与KEIL4对照 相较于KEIL 5 的"华丽".笔者还是喜欢KEIL4的"内敛",主要也还是习惯了.懒得换了.由于工作的  原      ...

  2. ACM起步要点总结(转哈工大)

    首先,我想说的就是,我是一个很普通的ACMer,高中没有参加过任何计算机和数学竞赛的经历,也没有ben那样过人的天资,努力至今也未能取得什么成绩,我之所以写下这篇文章,只是希望给刚进大学或者刚进ACM ...

  3. 智能生活 “视”不可挡——首届TCL杯HTML5智能电视开发大赛等你来挑战

    http://www.csdn.net/article/2014-06-04/2820063-TCL-Smart-TV-Innovation-Competation

  4. xcode6 iOS sdk8.1隐藏系统状态栏

    在代码项目(uzplayer)从iOS6升级到iOS8之后,头发如今视频播放器有.系统状态栏后面的背景: 这样就会导致有的时候按下Donebutton,或者拖滑块没有效果 所以,我们须要想个办法.把这 ...

  5. 新浪SAE数据库信息

    此账号仅能在SAE平台上使用,不能从外部连接我们建议开发者使用SaeMysql操作数据库 如果您想自己实现数据库相关操作,可以使用以下常量: 用户名  : SAE_MYSQL_USER 密 码 : S ...

  6. Linux 内核升级步骤

    1.解压内核文件包#xz -d linux-3.2.63.tar.xz #tar xvf linux-3.2.63.tar 2.拷贝解压文件到/usr/src#cp -r linux-3.2.63 / ...

  7. 可重入锁(good)

    可重入锁,也叫做递归锁,是指在一个线程中可以多次获取同一把锁,比如:一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法[即可重入],而无需重新获得锁: ...

  8. poj1243(经典dp)

    题目链接:http://poj.org/problem?id=1243 题意:让你猜一个物品的价格,猜低了或者猜高了都会提示你.G,L,表示你有G次机会猜一个数,如果猜错了,G会减少1次,如果你的错误 ...

  9. BytesWritable 存储问题

    public static void main(String args[]){ BytesWritable cv = new BytesWritable(); String str1 = " ...

  10. java.net.SocketException: Connection reset 解决方法

    java.net.SocketException: Connection reset 解决方法 最近纠结致死的一个java报错java.net.SocketException: Connection ...