hdu4553约会安排 线段树

//DS QT  找一段最靠前的长度为QT的空间

//NS QT  找一段最靠前的长度为QT的空间,如果没找到可以将DS占据的空间当做空闲空间,找一段最靠前的空间

//STUDY!! L R  清空L ,R的空间

//用两个线段树,一个处理DS的情况,一个处理NS的情况

//线段树维护,ma_l , ma_r , ma 区间[l,r]的左边的空闲区间,右边的以及最大的空闲区间

#include<cstdio>

#include<cstring>

#include<iostream>

#include<algorithm>

using namespace std ;

const int maxn = 1e5 + 10;

#define left v<<1

#define right v<<1|1

struct node

{

int l , r ;

int ma_l ;

int ma_r ;

int ma ;

int lazy ;

}tree[2][maxn<<2] ;

void build(int l , int r , int v)

{

for(int i = 0;i < 2;i++)

{

tree[i][v].l = l ;

tree[i][v].r = r;

tree[i][v].lazy = -1;

tree[i][v].ma_l = tree[i][v].ma = tree[i][v].ma_r  = (r - l + 1) ;

}

if(l == r)return ;

int mid = (l + r)>>1 ;

build(l , mid , left) ;

build(mid+1 , r , right) ;

}

void push_down(int v)

{

for(int i = 0 ;i < 2;i++)

if(tree[i][v].lazy != -1)

{

tree[i][left].ma_l = tree[i][left].ma_r = tree[i][left].ma = (tree[i][left].r - tree[i][left].l + 1)*tree[i][v].lazy ;

tree[i][right].ma_l = tree[i][right].ma_r = tree[i][right].ma = (tree[i][right].r - tree[i][right].l + 1)*tree[i][v].lazy ;

tree[i][left].lazy = tree[i][right].lazy  = tree[i][v].lazy ;

tree[i][v].lazy = -1;

}

}

void push_up(int v)

{

for(int i = 0 ;i < 2;i++)

{

tree[i][v].ma_l = tree[i][left].ma_l ;

tree[i][v].ma_r = tree[i][right].ma_r ;

tree[i][v].ma = max(max(tree[i][left].ma ,tree[i][right].ma) ,tree[i][left].ma_r+tree[i][right].ma_l) ;

if(tree[i][v].ma_l == (tree[i][left].r - tree[i][left].l + 1))

tree[i][v].ma_l += tree[i][right].ma_l ;

if(tree[i][v].ma_r == (tree[i][right].r - tree[i][right].l + 1))

tree[i][v].ma_r += tree[i][left].ma_r ;

}

}

int query(int v , const int flag , const int num)

{

if(tree[flag][v].l == tree[flag][v].r)

return tree[flag][v].l ;

push_down(v) ;

if(tree[flag][left].ma >= num)

return  query(left , flag ,num) ;

else if(tree[flag][left].ma_r + tree[flag][right].ma_l >= num)

return   tree[flag][left].r - tree[flag][left].ma_r + 1 ;

else return query(right , flag , num) ;

}

void update(int a , int b , int v , const int flag , const int tag)

{

if(tree[flag][v].l >= a && tree[flag][v].r <= b)

{

tree[flag][v].lazy = tag;

tree[flag][v].ma_l = tree[flag][v].ma = tree[flag][v].ma_r = (tree[flag][v].r  - tree[flag][v].l + 1)*tag ;

return ;

}

push_down(v) ;

int mid = (tree[flag][v].l + tree[flag][v].r) >> 1 ;

if(a <= mid)update(a , b , left , flag , tag) ;

if(b > mid)update(a , b , right , flag , tag) ;

push_up(v) ;

}

int main()

{

// freopen("in.txt" ,"r" , stdin) ;

int T ;

scanf("%d" , &T) ;

int cas = 0 ;

while(T--)

{

int N , Q ;

scanf("%d%d" ,&N , &Q) ;

build(1 , N , 1) ;

char ch[10] ;

int L , R , qt ;

printf("Case %d:\n" , ++cas) ;

while(Q--)

{

scanf("%s"  , ch) ;

if(ch[0] == ‘D‘)

{

scanf("%d" , &qt) ;

if(tree[1][1].ma < qt)

{

puts("fly with yourself");

continue ;

}

int pos = query(1 , 1 , qt) ;

update(pos , pos + qt - 1 , 1 , 1 , 0) ;

printf("%d,let‘s fly\n" , pos) ;

}

else if(ch[0] == ‘N‘)

{

scanf("%d" ,  &qt) ;

int pos ;

if(tree[1][1].ma < qt && tree[0][1].ma < qt)

{puts("wait for me"); continue ;}

else if(tree[1][1].ma >= qt)

pos = query(1 , 1 , qt) ;

else pos = query(1 , 0 , qt) ;

printf("%d,don‘t put my gezi\n"  , pos) ;

update(pos , pos + qt - 1 , 1 , 0 ,0) ;

update(pos , pos + qt - 1  , 1 , 1 , 0) ;

}

else if(ch[0] == ‘S‘)

{

scanf("%d%d" , &L , &R) ;

update(L , R , 1 , 0 , 1) ;

update(L , R , 1 , 1 , 1) ;

puts("I am the hope of chinese chengxuyuan!!") ;

}

}

}

return  0 ;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 07:12:31

hdu4553约会安排 线段树的相关文章

hdu4553约会安排(线段树区间合并)

链接 poj3667的加强版 当时的题解 这里只不过对于女神需要另开算,DS的占用的时间不加在女神身上,女神的时间都要加,清空的时候也都要算. 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath>

hdu 4453 约会安排(线段树区间合并)

约会安排 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 433    Accepted Submission(s): 145 Problem Description 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有

HDU4553 约会安排

http://www.mamicode.com/info-detail-422707.html 线段树区间覆盖,开两个线段树,一个记录DS,一个NS 1 // #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <sstream> 6

约会安排---hdu4553(线段树,麻烦的区间覆盖)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 算是poj3667的加强版,建立两颗线段树,一个是DS区间,另一个是NS区间.那么根据题意,如果是DS的请求,那么首先查找DS的区间,如果有满足的区间就更新DS区间,NS的区间不需要更新.如果是NS的请求,首先看DS区间是否有满足的区间,否则查找NS区间,如果有就同时更新DS区间和NS区间.那么可以归纳为,只要是NS的请求,就同时更新两颗线段树,否则只更新DS的线段树. 注意输出要从Outpu

HDU 4553 约会安排(二维线段树)

Problem Description 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复"呵呵",所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑,由于数量实在过于巨大,怎么安排时间便成了小明的一大心事. 我们已知小明一共有T的空闲时间,期间会有很多女神或者基友来找小明. 作为一个操作系统曾经怒考71分的大神,小明想到了一个算法,即"首次适应算法",根据操作系统课本的描述,就是找一段最

HDU 4553 约会安排 (区间合并)【线段树】

<题目链接> 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复"呵呵",所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑,由于数量实在过于巨大,怎么安排时间便成了小明的一大心事.  我们已知小明一共有T的空闲时间,期间会有很多女神或者基友来找小明.  作为一个操作系统曾经怒考71分的大神,小明想到了一个算法,即"首次适应算法",根据操作系统课本的描述,就是找一段最靠前的符

P4556 [Vani有约会]雨天的尾巴 树链剖分 线段树合并

P4556 [Vani有约会]雨天的尾巴 提交2.75k 通过789 时间限制1.00s 内存限制125.00MB 提交代码加入收藏 题目提供者yyy2015c01 难度省选/NOI- 历史分数100 提交记录查看题解 标签 查看算法标签 相关讨论 进入讨论版 查看讨论 推荐题目 查看推荐 展开 题目背景 深绘里一直很讨厌雨天.灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切.虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地里的粮

hdu4553(线段树)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 线段树功能:update:区间替换 query:询问满足条件的最左断点 分析:poj3667的加强版,这里需要在每个区间内设置女神区间和屌丝区间,每次询问女神的时候,先看屌丝区间有无空位,有就插到屌丝区间内,同时更新女神区间,否则插到女神区间内,但同时也要更新屌丝区间,因为只有女神可以占用屌丝的时间,屌丝不能占用女神的时间,每次更新屌丝区间的时候直接更新即可,清空的话就是对屌丝和女神的区间都清

P4556 [Vani有约会]雨天的尾巴(线段树合并)

传送门 一道线段树合并 首先不难看出树上差分 我们把每一次修改拆成四个,在\(u,v\)分别放上一个,在\(lca\)和\(fa[lca]\)各减去一个,那么只要统计一下子树里的总数即可 然而问题就在于怎么统计.直接暴力肯定是要咕咕的,那么线段树合并就派上用场了 总之就是每个点开一个动态开点线段树,然后一遍dfs,让它的所有儿子的线段树合并到它这里 我按以前的写法不知为什么写挂了--然后换抄了种写法还是挂--后来发现是写抄的时候没有注意合并的顺序-- //minamoto #include<bi