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 ...
随机推荐
- PHP获取不了React Native Fecth参数的解决办法代码是怎样?
fetch('https://mywebsite.com/endpoint/', { method: 'POST',headers: {'Accept': 'application/json','Co ...
- iOS身份证的正则验证
在ios项目的开发中可能很多地方都需要用到身份证校验,一般在开发的时候很多人都是直接百度去网上荡相关的正则表达式和校验代码,但是网上疯狂粘贴复制的校验代码本身也可能并不准确,可能会有风险,比如2013 ...
- ectouch第六讲 之表常用链接
ECTouch1.0 常用链接:精品属性商品mobile/index.php?m=default&c=category&type=best 新品属性商品mobile/index.php ...
- 【转】【Android】开源项目汇总-备用
第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...
- HDU 4708:Rotation Lock Puzzle
Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 关于viewport的研究
昨天项目中用到了适应移动端显示的viewport,一般的使用方式如下: <meta name="viewport" content="width=device-wi ...
- 20150825 C# 调用带参数的存储过程 模板
////// exec proceudre2 //System.Data.SqlClient.SqlConnection sqlcon = new Sys ...
- Wall(凸包POJ 1113)
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32360 Accepted: 10969 Description On ...
- dg_MeetingRoom 居中显示
标题栏 居中 DataGridViewCellStyle headerStyle = new DataGridViewCellStyle(); //dg_MeetingRoom 头居中样式 heade ...
- Java爬虫工程师技能列表
以下仅仅是自己一些粗浅认识.欢迎补充指正.欢迎进群交流! 掌握一半便能够熟练的开发爬虫玩了.自己正在努力中... 一.技能列表 1.掌握java.尤其编程网络部分:李刚的java基础至少看了三遍以上: ...