POJ 3667 线段树+标记
自从某次考试写线段树写挂了以后 这是第一次写线段树,,,,,,
这是一个伤心的故事……
题意:
思路:
标记 维护从左到右的最大值 从右到左的最大值 区间内的最大值……
然后就一搞 就出来了
//By SiriusRen
#include <cstdio>
using namespace std;
int n,m,jy,xx,yy,d,D;
struct Tree{int lsum,rsum,sum,cover;}tree[222222];
inline int max(int x,int y){return x>y?x:y;}
inline int read(){
int x=0;char p=getchar();
while(p<'0'||p>'9')p=getchar();
while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();
return x;
}
void build(int l,int r,int pos){
if(l==r){tree[pos].sum=tree[pos].lsum=tree[pos].rsum=1;return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
build(l,mid,lson),build(mid+1,r,rson);
tree[pos].lsum=tree[pos].rsum=tree[pos].sum=tree[lson].sum+tree[rson].sum;
}
void push_down(int num,int pos){
int lson=pos<<1,rson=pos<<1|1;
tree[lson].cover=tree[rson].cover=tree[pos].cover;
if(tree[pos].cover==1){
tree[lson].lsum=tree[lson].rsum=tree[lson].sum=num-(num>>1);
tree[rson].lsum=tree[rson].rsum=tree[rson].sum=num>>1;
}
else{
tree[lson].lsum=tree[lson].rsum=tree[lson].sum=0;
tree[rson].lsum=tree[rson].rsum=tree[rson].sum=0;
}
tree[pos].cover=0;
}
void push_up(int num,int pos){
int lson=pos<<1,rson=pos<<1|1,div=num>>1;
tree[pos].lsum=tree[lson].lsum,tree[pos].rsum=tree[rson].rsum;
tree[pos].sum=max(max(tree[lson].sum,tree[rson].sum),tree[lson].rsum+tree[rson].lsum);
if(tree[lson].lsum==num-div)tree[pos].lsum+=tree[rson].lsum;
if(tree[rson].rsum==div)tree[pos].rsum+=tree[lson].rsum;
}
int query(int l,int r,int pos){
if(l==r)return l;
if(tree[pos].cover)push_down(r-l+1,pos);
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(tree[pos].sum>=d){
if(tree[lson].sum>=d)return query(l,mid,lson);
if(tree[lson].rsum+tree[rson].lsum>=d)return mid+1-tree[lson].rsum;
return query(mid+1,r,rson);
}
return 0;
}
void insert(int l,int r,int pos,int id){
if(l>=xx&&r<=yy){
tree[pos].cover=id;
tree[pos].lsum=tree[pos].rsum=tree[pos].sum=(id==1?r-l+1:0);
return;
}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1,len=r-l+1;
if(tree[pos].cover)push_down(len,pos);
if(mid<xx)insert(mid+1,r,rson,id);
else if(mid>=yy)insert(l,mid,lson,id);
else insert(l,mid,lson,id),insert(mid+1,r,rson,id);
push_up(len,pos);
}
int main(){
scanf("%d%d",&n,&m);
build(1,n,1);
for(int i=1;i<=m;i++){
jy=read();
if(jy==1){
D=read(),d=D;
xx=query(1,n,1),yy=xx+D-1;
printf("%d\n",xx);
if(xx)insert(1,n,1,2);
}
else{
xx=read(),yy=read();
yy=xx+yy-1;
insert(1,n,1,1);
}
}
}
POJ 3667 线段树+标记的更多相关文章
- POJ 3667 线段树区间合并裸题
题意:给一个n和m,表示n个房间,m次操作,操作类型有2种,一种把求连续未租出的房间数有d个的最小的最左边的房间号,另一个操作时把从x到x+d-1的房间号收回. 建立线段树,值为1表示未租出,0为租出 ...
- poj 3667 线段树
题意:1 a:询问是不是有连续长度为a的空房间,有的话住进最左边2 a b:将[a,a+b-1]的房间清空思路:记录区间中最长的空房间线段树操作:update:区间替换 query:询问满足条件的最左 ...
- POJ 3667 线段树区间合并
http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html 用线段树,首先要定义好线段树的节点信息,一般看到一个问题,很难很 ...
- POJ 3667 线段树的区间合并简单问题
题目大意:有一排标号1-N的房间.操作一:询问是不是有连续长度为a的空房间,有的话住进最左边(占用a个房间)操作二:将[a,a+b-1]的房间清空(腾出b个房间)思路:记录每个区间中“靠左”“靠右”“ ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 3954 线段树 (标记)
Level up Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- poj 2886 线段树+反素数
Who Gets the Most Candies? Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12744 Acc ...
- BZOJ4785 [Zjoi2017]树状数组 【二维线段树 + 标记永久化】
题目链接 BZOJ4785 题解 肝了一个下午QAQ没写过二维线段树还是很难受 首先题目中的树状数组实际维护的是后缀和,这一点凭分析或经验或手模观察可以得出 在\(\mod 2\)意义下,我们实际求出 ...
- Codeforces 258E - Little Elephant and Tree(根号暴力/线段树+标记永久化/主席树+标记永久化/普通线段树/可撤销线段树,hot tea)
Codeforces 题目传送门 & 洛谷题目传送门 yyq:"hot tea 不常有,做过了就不能再错过了" 似乎这是半年前某场 hb 模拟赛的 T2?当时 ycx.ym ...
随机推荐
- atitit。流程图的设计与制作 attilax 总结
atitit.流程图的设计与制作 attilax 总结 1. 流程图的规范1 2. 画图语言2 2.1. atitit.CSDN-markdown编辑器2 2.2. js-sequence-diagr ...
- UnrealEngine4初始化流程
自古以来全部的游戏引擎都分为三个大阶段:Init,Loop,Exit.UE4也不例外. 首先找到带有入口函数的文件:Runtime/Launch/Private/XXXX/LaunchXXXX.cpp ...
- Transformation in kentico
https://docs.kentico.com/k10/developing-websites/loading-and-displaying-data-on-websites/writing-tra ...
- nyoj--814--又见拦截导弹(动态规划+贪心)
又见拦截导弹 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系 ...
- [雅礼NOIP2018集训 day3]
考试的时候刚了T1两个小时线段树写了三个子任务结果发现看错了题目,于是接下来一个半小时我自闭了 result=历史新低 这告诉我们,打暴力要端正态度,尤其是在发现自己之前出锅的情况下要保持心态的平和, ...
- linux系统定时任务crond入门
1,Crond: Crond是linux系统中用来定期执行命令或指定程序任务的一种服务或者软件.(Centos5以后默认存在) 当优化开机自启动的时候,第一个就是crond. Crond服务默认情况( ...
- POJ 3268 Dijkstra+priority_queue或SPFA
思路:正向建边,一遍Dijkstra,反向建边,再一遍Dijkstra.ans加在一起输出最大值. (SPFA也行--) // by SiriusRen #include <queue> ...
- C# 位域[flags]
.NET中的枚举我们一般有两种用法,一是表示唯一的元素序列,例如一周里的各天:还有就是用来表示多种复合的状态.这个时候一般需要为枚举加上[Flags]特性标记为位域,例如: [Flags] enu ...
- C语言-100加减求和
----------------------------度娘的思路------------------------------------------------------ Action() { / ...
- Concurrency pattern
In software engineering, concurrency patterns are those types of design patterns that deal with the ...