M - 约会安排 HDU - 4553 线段树 (最长连续段)
中文题面
思路:维和两个区间 一个是女神区间 一个是基友区间 如果是基友要预约时间 直接在基友区间查询可满足的起点 (这里先判tree[1].m >=length也就是有没有这样的区间满足时间length) 预约成功后更新基友区间
如果是女神要预约区间 先在基友区间预约看有没有满足的区间 (同样看根节点的m) 如果有 同时更新两个区间 如果没有继续在女神区间查找 如果女神区间有 则同时更新基友和女神区间 如果没有 那就真没有了直接输出 题目要求的话
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
struct Node{
int l,r;
int ml,mr,m;
}tree1[maxn*],tree2[maxn*];
void build(int x,int l,int r){
tree1[x].l=tree2[x].l=l;
tree1[x].r=tree2[x].r=r;
tree1[x].ml=tree2[x].ml=tree1[x].mr=tree2[x].mr=tree1[x].m=tree2[x].m=r-l+;
if(l==r)return ;
int mid=l+r>>;
build(x<<,l,mid);
build(x<<|,mid+,r);
}
void push_up(int x){
int mid=tree1[x].r+tree1[x].l>>;
tree1[x].ml=tree1[x<<].ml;
tree1[x].mr=tree1[x<<|].mr;
tree1[x].m=max(max(tree1[x<<].m,tree1[x<<|].m),tree1[x<<].mr+tree1[x<<|].ml);
if(tree1[x<<].ml==mid-tree1[x].l+)tree1[x].ml+=tree1[x<<|].ml;
if(tree1[x<<|].mr==tree1[x].r-mid)tree1[x].mr+=tree1[x<<].mr; tree2[x].ml=tree2[x<<].ml;
tree2[x].mr=tree2[x<<|].mr;
tree2[x].m=max(max(tree2[x<<].m,tree2[x<<|].m),tree2[x<<].mr+tree2[x<<|].ml);
if(tree2[x<<].ml==mid-tree2[x].l+)tree2[x].ml+=tree2[x<<|].ml;
if(tree2[x<<|].mr==tree2[x].r-mid)tree2[x].mr+=tree2[x<<].mr; }
void push_down(int x){
int mid=tree1[x].l+tree1[x].r>>;
if(tree1[x].m==tree1[x].r-tree1[x].l+){
tree1[x<<].ml=tree1[x<<].mr=tree1[x<<].m=mid-tree1[x].l+;
tree1[x<<|].ml=tree1[x<<|].mr=tree1[x<<|].m=tree1[x].r-mid;
}
else if(tree1[x].m==){
tree1[x<<].ml=tree1[x<<].mr=tree1[x<<].m=;
tree1[x<<|].ml=tree1[x<<|].mr=tree1[x<<|].m=;
} if(tree2[x].m==tree2[x].r-tree2[x].l+){
tree2[x<<].ml=tree2[x<<].mr=tree2[x<<].m=mid-tree2[x].l+;
tree2[x<<|].mr=tree2[x<<|].ml=tree2[x<<|].m=tree2[x].r-mid;
}
else if(tree2[x].m==){
tree2[x<<].ml=tree2[x<<].mr=tree2[x<<].m=;
tree2[x<<|].mr=tree2[x<<|].ml=tree2[x<<|].m=;
}
}
void update(int x,int l,int r,int value){
if(tree1[x].l>=l&&tree1[x].r<=r){
if(value==){
tree1[x].ml=tree1[x].mr=tree1[x].m=;
}
else if(value==){
tree1[x].ml=tree1[x].mr=tree1[x].m=;
tree2[x].ml=tree2[x].mr=tree2[x].m=;
}
else {
tree1[x].ml=tree1[x].mr=tree1[x].m=tree1[x].r-tree1[x].l+;
tree2[x].ml=tree2[x].mr=tree2[x].m=tree1[x].r-tree1[x].l+;
}
return ;
}
int mid=tree1[x].l+tree1[x].r>>;
push_down(x);
if(mid>=l)update(x<<,l,r,value);
if(mid<r)update(x<<|,l,r,value);
push_up(x);
}
int query(int x,int length,int value){
if(tree1[x].l==tree1[x].r)return tree1[x].l;
push_down(x);
int mid=tree1[x].l+tree1[x].r>>;
if(value==){
if(tree1[x<<].m>=length){
return query(x<<,length,value);
}
else if(tree1[x<<].mr+tree1[x<<|].ml>=length){
return mid-tree1[x<<].mr+;
}
else return query(x<<|,length,value);
}
else {
if(tree2[x<<].m>=length){
return query(x<<,length,value);
}
else if(tree2[x<<].mr+tree2[x<<|].ml>=length){
return mid-tree2[x<<].mr+;
}
else return query(x<<|,length,value);
}
}
int main(){
int t;
int kase=;
scanf("%d",&t);
char s[];
int temp;
int q;
int n;
while(t--){
printf("Case %d:\n",kase++);
scanf("%d%d",&n,&q);
build(,,n);
while(q--){
scanf("%s%d",s,&temp);
if(s[]=='D'){
if(tree1[].m>=temp){
int start=query(,temp,);
update(,start,start+temp-,);
printf("%d,let's fly\n",start);
}
else printf("fly with yourself\n");
}
else if(s[]=='N'){
if(tree1[].m>=temp){
int start=query(,temp,);
update(,start,start+temp-,);
printf("%d,don't put my gezi\n",start);
}
else if(tree2[].m>=temp){
int start=query(,temp,);
update(,start,start+temp-,);
printf("%d,don't put my gezi\n",start);
}
else printf("wait for me\n");
}
else {
int zz;
scanf("%d",&zz);
update(,temp,zz,);
printf("I am the hope of chinese chengxuyuan!!\n");
}
} }
return ;
}
M - 约会安排 HDU - 4553 线段树 (最长连续段)的更多相关文章
- HDU 3308 线段树 最长连续上升子序列 单点更新 区间查询
题意: T个测试数据 n个数 q个查询 n个数 ( 下标从0开始) Q u v 查询 [u, v ] 区间最长连续上升子序列 U u v 把u位置改成v #include<iostream> ...
- E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并
E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...
- 约会安排HDU - 4553
寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复"呵呵",所以,小明的最爱就是和女神们约会.与此同时,也有很多基 ...
- 约会安排---hdu4553(线段树,麻烦的区间覆盖)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 算是poj3667的加强版,建立两颗线段树,一个是DS区间,另一个是NS区间.那么根据题意, ...
- 约会安排 HDU - 4553(线段树区间查询,区间修改,区间合并)
题目: 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑, ...
- M - 约会安排 - hdu 4553
寒假来了,又到了小明和女神们约会的季节. 小明虽为�丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑,由于数量 ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
随机推荐
- WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择
NETCore提供了三种不同类型用于生产的REST API: HttpWebRequest;WebClient;HttpClient,开源社区创建了另一个名为RestSharp的库.如此多的http库 ...
- Python—sys模块介绍
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxi ...
- iRate---一个跳转AppStore评分弹窗
https://www.aliyun.com/jiaocheng/357479.html 摘要:gitHub地址:https://github.com/nicklockwood/iRate可以通过配置 ...
- net core 小坑杂记之配置文件读取(不定期更新)
其实很早就想写了,原想等积累差不多了再写的,但是发现遇到一个当时记下效果会比较好,所以就不定期更新这个系列了,后面获取会整个整理一下. 此篇记载net core入门时踩的一些坑,网上教程太少了,也不规 ...
- Django 生成验证码或二维码 pillow模块
一.安装PIL PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,API也非常简单易用. PIL模块只支持到Python 2 ...
- 消息队列queue
一.queue 在多线程编程中,程序的解耦往往是一个麻烦的问题,以及在socket网络编程中也会有这样的问题.recv 和send之间,如果服务端有消息,问题需要发送给客户端,而那边的recv 被主程 ...
- Windows之PowerShell使用命令
Windows之PowerShell使用命令 切换 命令格式: cd [option] 切换到上一级目录 cd ../ 或者 cd .. 不同磁盘之间切换 盘符: 清屏 清空当前窗口的内容 cls 查 ...
- 多线程系列之七:Read-Write Lock模式
一,Read-Write Lock模式 在Read-Write Lock模式中,读取操作和写入操作是分开考虑的.在执行读取操作之前,线程必须获取用于读取的锁.在执行写入操作之前,线程必须获取用于写入的 ...
- C# 父子页面传值
业务需求是:父页面点击“选择任务”按钮进入任务列表页.(项目进度周报) 父页面如下: 任务列表页: 选择某一个任务,点击“确定”后返回父页面所需数据. 父页面“选择任务” 按钮触发事件. /// &l ...
- 手机端图像编辑上传-cropper
编辑头像,实现相册,照像功能,并能缩放裁剪功能,可自定义UI,引用'cropper.js', 'exif.js' /*初始化裁剪插件*/ var screenWidth = $(window).wid ...