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 ...
随机推荐
- 19、文件上传与下载/JavaMail邮件开发
回顾: 一. 监听器 生命周期监听器 ServletRequestListener HttpSessionListener ServletContextListener 属性监听器 ServletRe ...
- JavaEE基础(十三)
1.常见对象(StringBuffer类的概述) A:StringBuffer类概述 通过JDK提供的API,查看StringBuffer类的说明 线程安全的可变字符序列 B:StringBuffer ...
- java代码实现rabbitMQ请求
1.下载rabbitMQ的客户端,下载地址 http://www.rabbitmq.com/download.html
- java 面试每日一题4
题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. publ ...
- RabbitMQ 基本概念介绍-----转载
1. 介绍 RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue )协议的开源实现.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面都非 ...
- WIN7 64位系统注册银行支付组件
WIN7 64位系统注册银行支付组件目前只尝试注册了银联的chinapay.dll和工行的icbcebankutil.dll 1.将dll文件拷贝到windows\syswow64\文件夹下(Win7 ...
- redis初试牛刀
先来无事就学学redis.可是并没有想的那么美好.首先要解释一下,redis主流是安装在lunx系统中的,甚至官网直接没有给出windows版本.要下载windows只能去所谓的githup.好吧我在 ...
- Windows下Python,setuptools,pip,virtualenv的安装
Windows 2003平台,安装Python2.7.4,Python3.3,setuptools,pip,virtualenv. 安装Python2.7.4(当前版本是2.7.6),安装路径:C:\ ...
- 类型解释器——C专家编程读书笔记
对于声明,应该按下面的步骤来进行解释: 1) 声明从它的名字开始读取,然后按照优先级顺序依次读取 2) 优先级顺序 a) 括号括起来的部分 b) 后缀操作符,()表示函数,[]表示数组 c) 前缀操作 ...
- HDU(2485),最小割最大流
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2485 Destroying the bus stations Time Limit: 40 ...