hdu4553 约会安排 线段树
寒假来了,又到了小明和女神们约会的季节。
小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会。与此同时,也有很多基友找他开黑,由于数量实在过于巨大,怎么安排时间便成了小明的一大心事。
我们已知小明一共有T的空闲时间,期间会有很多女神或者基友来找小明。
作为一个操作系统曾经怒考71分的大神,小明想到了一个算法,即“首次适应算法”,根据操作系统课本的描述,就是找一段最靠前的符合要求的连续空间分配给每个请求,由此小明做出了一个决定:
当一个基友来找小明时,小明就根据“首次适应算法”来找一段空闲的时间来和基友约好,如果找到,就说“X,let’s fly”(此处,X为开始时间),否则就说“fly with yourself”;
当女神来找小明时,先使用一次“首次适应算法”,如果没有找到,小明就冒着木叽叽的风险无视所有屌丝基友的约定,再次使用“无视基友首次适应算法”,两次只要有一次找到,就说“X,don’t put my gezi”(此处,X为开始时间),否则就说“wait for me”
当然,我们知道小明不是一个节操负无穷的人,如果和女神约会完,还有剩余时间,他还是会和原来约好的基友去dota的。(举个例子:小西(屌丝)和小明约好在1~5这个时间单位段内打dota,这时候,女神来和小明预约长度为3的时间段,那么最终就是1~3小明去和女神约会,搞定后在4~5和小西打dota)
小明偶尔也会想要学习新知识,此时小明就会把某一个时间区间的所有已经预定的时间全部清空用来学习并且怒吼“I am the hope of chinese chengxuyuan!!”,不过小明一般都是三分钟热度,再有人来预定的话,小明就会按耐不住寂寞把学习新知识的时间分配出去。
记录区间最大段的空闲和区间最大段的和基友约的时间,lazy记录被占用或被清除
然后普通的线段树区间操作,分两种查询树上二分查询即可。
#include<stdio.h>
#include<string.h>
const int maxm=;
const int INF=0x3f3f3f3f; int st[][maxm<<],stl[][maxm<<],str[][maxm<<],stx[][maxm<<];
int la[][maxm<<]; //-1 beizhanyong 1 beiqingchu
int sta;
//nvshen 0 diaosi 1 int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;} void build(int o,int l,int r){
st[][o]=st[][o]=stl[][o]=stl[][o]=str[][o]=str[][o]=r-l+;
stx[][o]=stx[][o]=l;
la[][o]=la[][o]=;
if(l==r)return;
int m=l+((r-l)>>);
build(o<<,l,m);
build(o<<|,m+,r);
} void pushup(int o,int l,int r,int t){
int m=l+((r-l)>>);
if(stl[t][o<<]==m-l+)stl[t][o]=stl[t][o<<]+stl[t][o<<|];
else stl[t][o]=stl[t][o<<];
if(str[t][o<<|]==r-m)str[t][o]=str[t][o<<]+str[t][o<<|];
else str[t][o]=str[t][o<<|];
if(st[t][o<<]>st[t][o<<|]){
st[t][o]=st[t][o<<];
stx[t][o]=stx[t][o<<];
}
else{
st[t][o]=st[t][o<<|];
stx[t][o]=stx[t][o<<|];
}
if(str[t][o<<]+stl[t][o<<|]>st[t][o]){
st[t][o]=str[t][o<<]+stl[t][o<<|];
stx[t][o]=m-str[t][o<<]+;
}
} void pushdown(int o,int l,int r,int t){
if(la[t][o]==-){
la[t][o<<]=la[t][o<<|]=-;
stl[t][o<<]=str[t][o<<]=stl[t][o<<|]=str[t][o<<|]=st[t][o<<]=st[t][o<<|]=;
stx[t][o<<]=stx[t][o<<|]=INF;
la[t][o]=;
}
else if(la[t][o]==){
la[t][o<<]=la[t][o<<|]=;
int m=l+((r-l)>>);
stl[t][o<<]=str[t][o<<]=st[t][o<<]=m-l+;
stl[t][o<<|]=str[t][o<<|]=st[t][o<<|]=r-m;
stx[t][o<<]=l;
stx[t][o<<|]=m+;
la[t][o]=;
}
} void query(int o,int l,int r,int c,int t){
if(st[t][o]>=c)sta=min(sta,stx[t][o]);
else return;
if(l==r)return;
pushdown(o,l,r,t);
int m=l+((r-l)>>);
if(str[t][o<<]+stl[t][o<<|]>=c&&m-str[t][o<<]+<sta)sta=m-str[t][o<<]+;
if(l<sta)query(o<<,l,m,c,t);
if(m+<sta)query(o<<|,m+,r,c,t);
} void update(int o,int l,int r,int ql,int qr,int c,int t){
if(ql<=l&&qr>=r){
if(c==-){
la[t][o]=-;
stl[t][o]=str[t][o]=st[t][o]=;
stx[t][o]=INF;
}
else if(c==){
la[t][o]=;
stl[t][o]=str[t][o]=st[t][o]=r-l+;
stx[t][o]=l;
}
return;
}
pushdown(o,l,r,t);
int m=l+((r-l)>>);
if(ql<=m)update(o<<,l,m,ql,qr,c,t);
if(qr>=m+)update(o<<|,m+,r,ql,qr,c,t);
pushup(o,l,r,t);
} char s[]; int main(){
int T;
scanf("%d",&T);
for(int q=;q<=T;++q){
int n,m;
scanf("%d%d",&n,&m);
printf("Case %d:\n",q);
build(,,n);
for(int i=;i<=m;++i){
scanf("%s",s);
if(s[]=='D'){
int c;
scanf("%d",&c);
sta=INF;
query(,,n,c,);
if(sta==INF)printf("fly with yourself\n");
else{
update(,,n,sta,sta+c-,-,);
printf("%d,let's fly\n",sta);
}
}
else if(s[]=='N'){
int c;
scanf("%d",&c);
sta=INF;
query(,,n,c,);
if(sta==INF){
query(,,n,c,);
if(sta==INF)printf("wait for me\n");
else{
update(,,n,sta,sta+c-,-,);
update(,,n,sta,sta+c-,-,);
printf("%d,don't put my gezi\n",sta);
}
}
else{
update(,,n,sta,sta+c-,-,);
update(,,n,sta,sta+c-,-,);
printf("%d,don't put my gezi\n",sta);
}
}
else if(s[]=='S'){
int a,b;
scanf("%d%d",&a,&b);
update(,,n,a,b,,);
update(,,n,a,b,,);
printf("I am the hope of chinese chengxuyuan!!\n");
}
}
}
}
hdu4553 约会安排 线段树的更多相关文章
- hdu4553约会安排 线段树
//DS QT 找一段最靠前的长度为QT的空间 //NS QT 找一段最靠前的长度为QT的空间.假设没找到能够将DS占领的空间当做空暇空间,找一段最靠前的空间 //STUDY!! L R 清空L ...
- hdu4553约会安排(线段树区间合并)
链接 poj3667的加强版 当时的题解 这里只不过对于女神需要另开算,DS的占用的时间不加在女神身上,女神的时间都要加,清空的时候也都要算. #include <iostream> #i ...
- hdu 4453 约会安排(线段树区间合并)
约会安排 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- HDU-4553 约会安排(线段树维护连续区间)
http://acm.hdu.edu.cn/showproblem.php?pid=4553 Problem Description 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但 ...
- HDU4553 约会安排
http://www.mamicode.com/info-detail-422707.html 线段树区间覆盖,开两个线段树,一个记录DS,一个NS // #pragma comment(linker ...
- 约会安排---hdu4553(线段树,麻烦的区间覆盖)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 算是poj3667的加强版,建立两颗线段树,一个是DS区间,另一个是NS区间.那么根据题意, ...
- HDU 4553 约会安排 (区间合并)【线段树】
<题目链接> 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有 ...
- [Vani有约会]雨天的尾巴 线段树合并
[Vani有约会]雨天的尾巴 LG传送门 线段树合并入门好题. 先别急着上线段树合并,考虑一下这题的暴力.一看就是树上差分,对于每一个节点统计每种救济粮的数量,再一遍dfs把差分的结果统计成答案.如果 ...
- P4556 [Vani有约会]雨天的尾巴(线段树合并+lca)
P4556 [Vani有约会]雨天的尾巴 每个操作拆成4个进行树上差分,动态开点线段树维护每个点的操作. 离线处理完向上合并就好了 luogu倍增lca被卡了5分.....于是用rmq维护.... 常 ...
随机推荐
- webpack分离打包css和less
github仓库:https://github.com/llcMite/webpack.git 为什么要分离打包? 答:刚开始学webpack的时候就很郁闷,明明没几个文件,打包出来体积特 ...
- ActiveMQ的安装与配置
ActiveMQ的安装与配置详情 (1)ActiveMQ的简介 MQ: (message queue) ,消息队列,也就是用来处理消息的,(处理JMS的).主要用于大型企业内部或与企业之间的传递数据信 ...
- C++标准异常概述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 使用DevExpress Reports和PDF Viewer创建AcroForm Designer
众所周知,交互式表单(AcroForms)是PDF标准的重要组成部分,AcroForms允许开发者和开发者的用户创建可填写的PDF文档.尽管WinForms和WPF PDF Viewers不支持交互式 ...
- Android开发---基本UI组件1:自动拨电话,自动上网,输入框不换行、只输数字、只输文本、只输密码
1.activity_main.xml 描述:构建一个按钮 <?xml version="1.0" encoding="utf-8"?> <L ...
- JAVA 中的MessageDigest类和Mac类的使用
MessageDigest 消息摘要 例子: MD5加密: try{ MessageDigest md5 = MessageDigest.getInstance("MD5"); m ...
- Oracle hint手动优化
例子 select/*+FULL(fortest)*/ * from fortest where id = 2000000 //使用0.70s时间 select* from fortest where ...
- springMVC学习五(转发和乱码)
摘录http://www.cnblogs.com/xdp-gacl/p/3798347.html http://www.cnblogs.com/xdp-gacl/p/3798347.html 四个很重 ...
- Python 基础day3
1.简述bit,byte,kb,MB,GB,TB的关系 1TB=1024GB; 1GB=1024MB ; 1MB=1024kb: 1kb=1024byte ; 1byte=8bit 2.简述as ...
- nginx防DOS攻击
将 timeout 设低来防止 DOS 攻击 client_body_timeout 10; client_header_timeout 10; keepalive_timeout 5 5; send ...