题意:n个空房间。两种操作:1.选择最小的连续D个房间入住,并输出这连续D个房间的最小标号。2.将某个区间内的房间全部退房。

 #include <cstdio>
#include <iostream>
#include <algorithm>
#define ll long long
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define st first
#define nd second
#define mp make_pair
#define pii pair<int, int>
#define gg puts("gg");
using namespace std;
void gmax(int& a, int b){
if(a < b) a = b;
}
const int N = 5e4+;
struct Node{
int lsum, rsum, sum;
int tag;
};
Node T[N<<];
void pushup(int l, int r, int rt){
T[rt].lsum = T[rt<<].lsum, T[rt].rsum = T[rt<<|].rsum;
int m = l+r >> ;
if(T[rt<<].lsum == m-l+) T[rt].lsum += T[rt<<|].lsum;
if(T[rt<<|].rsum == r-m) T[rt].rsum += T[rt<<].rsum;
T[rt].sum = max(T[rt<<].sum, T[rt<<|].sum);
gmax(T[rt].sum, T[rt<<].rsum+T[rt<<|].lsum);
}
void pushdown(int l, int r, int rt){
if(T[rt].tag != -){
T[rt<<].tag = T[rt<<|].tag = T[rt].tag;
int m = l+r >> ;
T[rt<<].lsum = T[rt<<].rsum = T[rt<<].sum = T[rt].tag? m-l+ : ;
T[rt<<|].lsum = T[rt<<|].rsum = T[rt<<|].sum = T[rt].tag? r-m : ;
T[rt].tag = -;
}
}
void build(int l, int r, int rt){
T[rt].lsum = T[rt].rsum = T[rt].sum = r-l+;
T[rt].tag = -;
if(l == r)
return ;
int m = l+r >> ;
build(lson);
build(rson);
}
int query(int c, int l, int r, int rt){
//printf("query %d: l %d, r %d, lson %d, rson %d, sum %d\n", rt, l, r, T[rt].lsum, T[rt].rsum, T[rt].sum);
if(l == r)
return l;
pushdown(l, r, rt);
int m = l+r >> ;
if(T[rt<<].sum >= c) return query(c, lson);
if(T[rt<<].rsum+T[rt<<|].lsum >= c) return m-T[rt<<].rsum+;
return query(c, rson);
}
void update(int L, int R, int c, int l, int r, int rt){
if(L <= l&&r <= R){
T[rt].tag = c;
T[rt].lsum = T[rt].rsum = T[rt].sum = c? r-l+:;
return ;
}
pushdown(l, r, rt);
int m = l+r >> ;
if(L <= m) update(L, R, c, lson);
if(R > m) update(L, R, c, rson);
pushup(l, r, rt);
//printf("updaet %d: l %d, r %d, lson %d, rson %d, sum %d\n", rt, l, r, T[rt].lsum, T[rt].rsum, T[rt].sum);
} int main(){
int n, m, x, y, op;
scanf("%d%d", &n, &m);
build(, n, );
while(m--){
scanf("%d", &op);
if(op == ){
scanf("%d", &x);
if(T[].sum < x) puts("");
else {
int ret = query(x, , n, );
printf("%d\n", ret);
update(ret, ret+x-, , , n, );
}
}
else {
scanf("%d%d", &x, &y);
update(x, x+y-, , , n, );
}
}
return ;
}

后记:这也是线段树一经典题。不难。

主要是通过这种写法可以O(logn)的时间内完成离散化查询。不过平时一般都是二分+树状数组O(lognlogn)完成离散化查询。

poj3667【线段树】/【类似权值线段树写法】的更多相关文章

  1. BZOJ_3685_普通van Emde Boas树_权值线段树

    BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x  若x不存在,插入x 2 x  若x存在,删除x 3    输出当前最小值,若不存 ...

  2. 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树

    题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...

  3. 主席树 【权值线段树】 && 例题K-th Number POJ - 2104

    一.主席树与权值线段树区别 主席树是由许多权值线段树构成,单独的权值线段树只能解决寻找整个区间第k大/小值问题(什么叫整个区间,比如你对区间[1,8]建立一颗对应权值线段树,那么你不能询问区间[2,5 ...

  4. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  5. 3065: 带插入区间K小值_树套树_替罪羊树_权值线段树

    经过周六一天,周一3个小时的晚自习,周二2个小时的疯狂debug,终于凭借自己切掉了这道树套树题. Code: #include <cstdio> #include <algorit ...

  6. BZOJ - 2141 排队 (动态逆序对,区间线段树套权值线段树)

    题目链接 交换两个数的位置,只有位于两个数之间的部分会受到影响,因此只需要考虑两个数之间有多少数对a[l]和a[r]产生的贡献发生了变化即可. 感觉像是个带修改的二维偏序问题.(修改点$(x,y)$的 ...

  7. 权值线段树&线段树合并

    权值线段树 所谓权值线段树,就是一种维护值而非下标的线段树,我个人倾向于称呼它为值域线段树. 举个栗子:对于一个给定的数组,普通线段树可以维护某个子数组中数的和,而权值线段树可以维护某个区间内数组元素 ...

  8. 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树

    [BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...

  9. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

随机推荐

  1. Linux中PHP如何安装curl扩展方法

    如果php已经在系统编译好,后来又需要添加新的扩展. 一种方式就是重新完全编译php,另一种方式就是单独编译扩展库,以extension的形式扩展. 下面以安装curl扩展为例: 1.下载curl安装 ...

  2. 20145227 《Java程序设计》第9周学习总结

    20145227 <Java程序设计>第9周学习总结 教材学习内容总结 1.JDBC简介 JDBC全名Java DataBase Connectivity,是java联机数据库的标准规范. ...

  3. P问题、NP问题和NPC问题

    P问题.NP问题和NPC问题 这或许是众多OIer最大的误区之一.    你会经常看到网上出现“这怎么做,这不是NP问题吗”.“这个只有搜了,这已经被证明是NP问题了”之类的话.你要知道,大多数人此时 ...

  4. 周赛-Expression 分类: 比赛 2015-08-02 09:35 3人阅读 评论(0) 收藏

    A. Expression time limit per test1 second memory limit per test256 megabytes inputstandard input out ...

  5. UVa(11292),贪心水题

    蓝书P1, 很简单的一个贪心选择,用能力小的去砍小的.本来想双重循环,哎,傻逼了,直接遍历选手,碰到能砍的就砍掉. #include <stdio.h> #include <algo ...

  6. 解决maven的“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误

    需要添加一个插件,在build标签中添加 <plugins> <plugin> <groupId>org.apache.maven.plugins</grou ...

  7. java解析密钥格式

    import java.io.StringReader; import org.bouncycastle.asn1.ASN1Sequence; import org.bouncycastle.asn1 ...

  8. 【Java】如何检测、替换4个字节的utf-8编码(此范围编码包含emoji表情)

    > 参考的优秀文章 1.十分钟搞清字符集和字符编码 2.Java中byte与16进制字符串的互相转换 3.[异常处理]Incorrect string value: '\xF0\x90\x8D\ ...

  9. 【leetcode❤python】 36. Valid Sudoku

    #-*- coding: UTF-8 -*-#特定的九个格内1-9的个数至多为1#依次检查每行,每列,每个子九宫格是否出现重复元素,如果出现返回false,否则返回true.class Solutio ...

  10. CodeForces 373B Making Sequences is Fun

    Making Sequences is Fun Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...