poj3667【线段树】/【类似权值线段树写法】
题意: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【线段树】/【类似权值线段树写法】的更多相关文章
- BZOJ_3685_普通van Emde Boas树_权值线段树
BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x 若x不存在,插入x 2 x 若x存在,删除x 3 输出当前最小值,若不存 ...
- 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树
题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...
- 主席树 【权值线段树】 && 例题K-th Number POJ - 2104
一.主席树与权值线段树区别 主席树是由许多权值线段树构成,单独的权值线段树只能解决寻找整个区间第k大/小值问题(什么叫整个区间,比如你对区间[1,8]建立一颗对应权值线段树,那么你不能询问区间[2,5 ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
- 3065: 带插入区间K小值_树套树_替罪羊树_权值线段树
经过周六一天,周一3个小时的晚自习,周二2个小时的疯狂debug,终于凭借自己切掉了这道树套树题. Code: #include <cstdio> #include <algorit ...
- BZOJ - 2141 排队 (动态逆序对,区间线段树套权值线段树)
题目链接 交换两个数的位置,只有位于两个数之间的部分会受到影响,因此只需要考虑两个数之间有多少数对a[l]和a[r]产生的贡献发生了变化即可. 感觉像是个带修改的二维偏序问题.(修改点$(x,y)$的 ...
- 权值线段树&线段树合并
权值线段树 所谓权值线段树,就是一种维护值而非下标的线段树,我个人倾向于称呼它为值域线段树. 举个栗子:对于一个给定的数组,普通线段树可以维护某个子数组中数的和,而权值线段树可以维护某个区间内数组元素 ...
- 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树
[BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...
- 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP
2892: 强袭作战 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 45 Solved: 30[Submit][Status][Discuss] D ...
随机推荐
- java利用zxing编码解码一维码与二维码
最近琢磨了一下二维码.一维码的编码.解码方法,感觉google的zxing用起来还是比较方便. 本人原创,欢迎转载,转载请标注原文地址:http://wallimn.iteye.com/blog/20 ...
- mount/umount系统调用
转载自:http://blog.sina.com.cn/s/blog_6385c7310100iqmn.html 功能描述: mount挂上文件系统,umount执行相反的操作. 用法: # ...
- javascript——web前端编程
一.弹出提示框: 连接 function disp_prompt() { var name=prompt("请输入您的名字","Bill Gates") ...
- SDUT 2877:angry_birds_again_and_again
angry_birds_again_and_again Time Limit: 2000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 The problems ...
- Unity脚本在层级面板中的执行顺序测试1
第二篇测试循环时和动态创建时的调用顺序:LINK 测试版本Unity4.6.因为新版本对Transform的排序做了改变,所以不排除旧版本的测试结果不一样.测试时,使用Awake中添加Debug.lo ...
- 转载-python学习笔记之常用模块用法分析
内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像函数一样调用 repr(ob ...
- userdebug版本开机串口log打开
在/bootable/bootloader/lk/app/mt_boot/mt_boot.c里修改: if (!has_set_p2u) { #ifdef USER_BUILD sprintf(cmd ...
- Entity Framework 第一篇
这段时间研究了orm框架EF 写一写研究的历程和心得 先贴上核心代码 public interface ITransaction { bool IsTransaction { get;} void B ...
- SQL Server中常用的SQL语句
1.概述 名词 笛卡尔积.主键.外键 数据完整性 实体完整性:主属性不能为空值,例如选课表中学号和课程号不能为空 参照完整性:表中的外键取值为空或参照表中的主键 用户定义完整性:取值范围或非空限制,例 ...
- java交换两个数字位置
第一种:在main输出,通过反射实现 1 public static void main(String[] args) throws Exception { Integer a = 1; Intege ...