http://www.mamicode.com/info-detail-422707.html

线段树区间覆盖,开两个线段树,一个记录DS,一个NS

 // #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
#include <conio.h>
using namespace std;
#define clc(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int N = ;
const int MOD = 1e9+;
#define LL long long
#define mi() (l+r)>>1
double const pi = acos(-);
void fre() {
freopen("in.txt","r",stdin);
}
// inline int r() {
// int x=0,f=1;char ch=getchar();
// while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}
// while(ch>='0'&&ch<='9') { x=x*10+ch-'0';ch=getchar();}return x*f;
// }
struct Edge {
int l,r;
int lazy;
int lm,rm,mm;
} e1[N<<],e2[N<<]; void pushdown(Edge e[],int rt) {
if(e[rt].lazy!=-) {
if(e[rt].lazy==) {
e[rt<<].lm=e[rt<<].rm=e[rt<<].mm=e[rt<<].r-e[rt<<].l+;
e[rt<<|].rm=e[rt<<|].lm=e[rt<<|].mm=e[rt<<|].r-e[rt<<|].l+;
e[rt<<].lazy=e[rt<<|].lazy=;
} else {
e[rt<<].lm=e[rt<<].rm=e[rt<<].mm=;
e[rt<<|].rm=e[rt<<|].lm=e[rt<<|].mm=;
e[rt<<].lazy=e[rt<<|].lazy=;
}
e[rt].lazy=-;
}
} void pushup(Edge e[],int rt) {
e[rt].lm=e[rt<<].lm;
e[rt].rm=e[rt<<|].rm;
if(e[rt<<].lm==e[rt<<].r-e[rt<<].l+) {
e[rt].lm+=e[rt<<|].lm;
}
if(e[rt<<|].rm==e[rt<<|].r-e[rt<<|].l+) {
e[rt].rm+=e[rt<<].rm;
}
e[rt].mm=max(max(e[rt<<].mm,e[rt<<|].mm),e[rt<<].rm+e[rt<<|].lm);
}
void build(int l,int r,int rt,Edge a[]) {
a[rt].l=l;
a[rt].r=r;
a[rt].lm=a[rt].rm=a[rt].mm=(r-l+);
a[rt].lazy=-;
if(l==r)
return;
int mid=mi();
build(lson,a);
build(rson,a);
} void update(Edge e[],int l,int r,int rt,int x) {
if(e[rt].l==l&&e[rt].r==r) {
if(x==) {
e[rt].lm=e[rt].rm=e[rt].mm=r-l+;
e[rt].lazy=;
} else {
e[rt].lm=e[rt].rm=e[rt].mm=;
e[rt].lazy=;
}
return;
}
pushdown(e,rt);
int mid=(e[rt].l+e[rt].r)>>;
if(r<=mid) update(e,l,r,rt<<,x);
else if(l>mid) update(e,l,r,rt<<|,x);
else {
update(e,l,mid,rt<<,x);
update(e,mid+,r,rt<<|,x);
}
pushup(e,rt);
} int query(Edge e[],int rt,int c) {
if(e[rt].l==e[rt].r) {
return e[rt].l;
}
pushdown(e,rt);
int mid=(e[rt].l+e[rt].r)>>;
if(e[rt<<].mm>=c) {
return query(e,rt<<,c);
} else if(e[rt<<].rm+e[rt<<|].lm>=c) {
return mid-e[rt<<].rm+;
} else {
return query(e,rt<<|,c);
}
}
int main() {
// fre();
int T;
int cas=;
cin>>T;
while(T--) {
printf("Case %d:\n",cas++);
int n,q;
cin>>n>>q;
build(,n,,e1);//D
build(,n,,e2);//N
while(q--) {
char s[];
int x,y;
scanf("%s",s);
if(s[]=='S') {
cin>>x>>y;
update(e1,x,y,,);
update(e2,x,y,,);
printf("I am the hope of chinese chengxuyuan!!\n");
} else if(s[]=='D') {
cin>>x;
if(e1[].mm<x) {
printf("fly with yourself\n");
} else {
int s=query(e1,,x);
printf("%d,let's fly\n",s);
update(e1,s,s+x-,,);
}
} else {
cin>>x;
if(e1[].mm>=x) {
int s=query(e1,,x);
printf("%d,don't put my gezi\n",s);
update(e1,s,s+x-,,);
update(e2,s,s+x-,,);
} else if(e2[].mm>=x) {
int s=query(e2,,x);
printf("%d,don't put my gezi\n",s);
update(e1,s,s+x-,,);
update(e2,s,s+x-,,);
} else {
printf("wait for me\n");
}
}
}
}
return ;
}

HDU4553 约会安排的更多相关文章

  1. hdu4553 约会安排 线段树

    寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑,由于数量实 ...

  2. HDU-4553 约会安排(线段树维护连续区间)

    http://acm.hdu.edu.cn/showproblem.php?pid=4553 Problem Description 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但 ...

  3. hdu4553约会安排 线段树

    //DS QT  找一段最靠前的长度为QT的空间 //NS QT  找一段最靠前的长度为QT的空间.假设没找到能够将DS占领的空间当做空暇空间,找一段最靠前的空间 //STUDY!! L R  清空L ...

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

    链接 poj3667的加强版 当时的题解 这里只不过对于女神需要另开算,DS的占用的时间不加在女神身上,女神的时间都要加,清空的时候也都要算. #include <iostream> #i ...

  5. hdu 4553 约会安排

    约会安排 http://acm.hdu.edu.cn/showproblem.php?pid=4553 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

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

    约会安排 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  7. E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并

    E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...

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

      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 算是poj3667的加强版,建立两颗线段树,一个是DS区间,另一个是NS区间.那么根据题意, ...

  9. HDU - 4553 约会安排(区间合并)

    https://cn.vjudge.net/problem/HDU-4553 Description 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的 ...

随机推荐

  1. React-用Jest测试

    一. 1.目录结构 二.代码 1.CheckboxWithLabel.jsx var React = require('react/addons'); var CheckboxWithLabel = ...

  2. arcengine C# 读写lyr(转)

    写lyr { IFeatureLayer LineLayer = axMapControl1.get_Layer(0) as IFeatureLayer;            ILayerFile ...

  3. JavaScript DOM编程基础精华01(DOM入门,DOM模型和获取页面元素,事件,window对象的方法)

    DOM入门 DOM就是Html页面的模型,将每个标签都做为一个对象,JavaScript通过调用DOM中的属性.方法就可以对网页中的文本框.层等元素进行编程控制.比如通过操作文本框的DOM对象,就可以 ...

  4. 在Hadoop伪分布式模式下安装Hive(derby,mysql)

    我的Hadoop版本是1.2.0,mysql版本是5.6.12. 先介绍一下嵌入式derby模式: 1.下载/解压 在hive官网上选择要下载的版本,我选择的版本是hive-0.10.0. 下载好解压 ...

  5. svn 版本升级的问题

    原创文章,转载请注明 svn本地版本由1.6升级到1.7后,再使用时遇到一些问题,这里记录一下以备忘. 升级后,使用任何命令 不能用了,提示的意思大致是本地的workcopy版本太低了(之前用1.6版 ...

  6. bash: ./device/nexell/tools/build.sh: 权限不够

    /bin/bash: build/tools/diff_package_overlays.py: 鏉冮檺涓嶅 i686-linux-gcc: error trying to exec 'cc1': ...

  7. Android权限安全(13)4.3前后root原理不同

    在JB MR2(4.3)之前 Apk内部可以通过Java的Runtime执行一个具有Root-setUID的可执行文件而 提升Effective UID来完成一些特权操作,典型的Root包中的su就是 ...

  8. 方法Equals和操作符==的区别

    http://www.codeproject.com/Articles/584128/What-is-the-difference-between-equalsequals-and-Eq When w ...

  9. sdut 2351 In Danger (找规律)

    题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2351 题意:xyez, xy表示一个十进 ...

  10. Qt之进程间通信(Windows消息)

    简述 通过上一节的了解,我们可以看出进程通信的方式很多,今天分享下如何利用Windows消息机制来进行不同进程间的通信. 简述 效果 发送消息 自定义类型与接收窗体 发送数据 接收消息 设置标题 重写 ...