约会安排---hdu4553(线段树,麻烦的区间覆盖)
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; #define INF 0xfffffff
#define N 110050
#define Lson r<<1
#define Rson r<<1|1 struct SegmentTree
{
int L, R;
bool ns, ds, study; ///0代表
int lsum[], rsum[], sum[]; ///0是屌丝,1女神; ///lsum区间左边(从L开始)连续最大不被覆盖的值
///rsum区间右边(到R介绍)连续最大不被覆盖的值
///sum整个区间连续最大不被覆盖的值 int Mid() { return (L+R)>>;}
int len() { return R-L+; } void clearPlan(bool x)///清空;
{
if(x)
{
lsum[] = lsum[] = len();
rsum[] = rsum[] = len();
sum[] = sum[] = len();
ns = ds = false; study = true;
}
} void NS(bool x)///女神;
{
if(x)
{
lsum[] = lsum[] = ;
rsum[] = rsum[] = ;
sum[] = sum[] = ;
ns = true; ds = false;
}
}
void DS(bool x)///屌丝;
{
if(x)
{
lsum[] = rsum[] = sum[] = ;
ds = true;
}
}
} a[N<<]; void Build(int r, int L, int R)
{
a[r].L = L, a[r].R = R;
a[r].clearPlan(true);///清空 ;
a[r].ns = a[r].ds = a[r].study = false; if(L == R)return ; Build(Lson, L, a[r].Mid());
Build(Rson, a[r].Mid()+, R);
} void Up(int r, int who)
{
if(a[r].L != a[r].R)
{
a[r].lsum[who] = a[Lson].lsum[who];
a[r].rsum[who] = a[Rson].rsum[who]; if(a[Lson].lsum[who] == a[Lson].len())
a[r].lsum[who] += a[Rson].lsum[who];
if(a[Rson].rsum[who] == a[Rson].len())
a[r].rsum[who] += a[Lson].rsum[who]; a[r].sum[who] = max(a[Lson].rsum[who] + a[Rson].lsum[who],
max(a[Lson].sum[who], a[Rson].sum[who]));
}
} void Down(int r)///这个顺序不能反
{
if(a[r].study)
{
a[Lson].clearPlan(true);
a[Rson].clearPlan(true);
a[r].study = false;
}
if(a[r].ns)
{
a[Lson].NS(true);
a[Rson].NS(true);
a[r].ns = a[r].ds = false;
}
if(a[r].ds)
{
a[Lson].DS(true);
a[Rson].DS(true);
a[r].ds = false;
}
} void Update(int r, int L, int R, int flag)
{
if(a[r].L == L && a[r].R == R)
{
if(flag == ) a[r].DS(true);
if(flag == ) a[r].NS(true);
if(flag == ) a[r].clearPlan(true); return;
} Down(r); if( R <= a[r].Mid())
Update(Lson, L, R, flag);
else if( L > a[r].Mid())
Update(Rson, L, R, flag);
else
{
Update(Lson, L, a[r].Mid(), flag);
Update(Rson, a[r].Mid()+, R, flag);
}
Up(r, );
Up(r, );
} int Query(int r, int num, int who)
{
Down(r); if(a[r].sum[who] < num) return ; if(a[r].lsum[who] >= num) return a[r].L;
if(a[Lson].sum[who] >= num) return Query(Lson, num, who); if(a[Lson].rsum[who]+a[Rson].lsum[who] >= num)
return a[Lson].R - a[Lson].rsum[who] + ;
return Query(Rson, num, who);
} int main()
{
int n, m, T, t = , R, L, time; scanf("%d", &T);
while(T--)
{
scanf("%d %d", &n, &m);
Build(, , n); printf("Case %d:\n", t++);
while(m--)
{
char s[];
scanf("%s", s);
if(s[] == 'D')
{
scanf("%d", &time);
L = Query(, time, );///屌丝是0; if( !L )printf("fly with yourself\n");
else
{
Update(, L, L+time-, );
printf("%d,let's fly\n", L);
}
}
else if(s[] == 'N')
{
scanf("%d", &time); L = Query(, time, );///先在屌丝时间里找;当在屌丝时间里没时间时在女神时间里找;
if( !L ) L = Query(, time, );///女神是1; if( !L )printf("wait for me\n");
else
{
Update(, L, L+time-, );
printf("%d,don't put my gezi\n", L);
}
}
else
{
scanf("%d %d", &L, &R);
Update(, L, R, );
printf("I am the hope of chinese chengxuyuan!!\n");
}
}
}
return ;
}
约会安排---hdu4553(线段树,麻烦的区间覆盖)的更多相关文章
- HDU-4553 约会安排(线段树维护连续区间)
http://acm.hdu.edu.cn/showproblem.php?pid=4553 Problem Description 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但 ...
- codeforces 652C C. Foe Pairs(尺取法+线段树查询一个区间覆盖线段)
题目链接: C. Foe Pairs time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- HDU 4553 约会安排(线段树区间合并+双重标记)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 题目大意:就是有三种操作: ①DS x,安排一段长度为x的空闲时间跟屌丝一起,输出这段时间的起点 ...
- HDU 1754 I Hate It(线段树单点替换+区间最值)
I Hate It [题目链接]I Hate It [题目类型]线段树单点替换+区间最值 &题意: 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0 ...
- HDU 3577Fast Arrangement(线段树模板之区间增减更新 区间求和查询)
Fast Arrangement Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 140120 ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
随机推荐
- iOS: Assertion failure on picker view
Q:I'm getting an assertion failure while scrolling a picker view w/ zero data(zero rows). While scro ...
- gradle教程 [原创](eclipse/ADT下 非插件 非Android Studio/AS)纯手打 第三篇:gradle完整的实战
上两篇的地址 安装配置 http://www.cnblogs.com/uncle2000/p/4276833.html 简单实战 http://www.cnblogs.com/uncle2000/p/ ...
- linux mint 19解决 输入法问题
安装搜狗后出现 You're currently running Fcitx with GUI, but fcitx-configtool couldn't be found, the package ...
- 如何将ppt转换为高清图片?
PPT2010版本直接提供了“另存为”图片的功能,但另存为后的图片清晰度不够,这是因为office提供的默认点每英寸点数 (dpi)为96dpi,也就是说图片的尺寸为960x720像素,通过注册表可以 ...
- LazyValue<T>
public void ExtendFuncT() { //():匿名无参方法.() =>方法名,指派匿名无参方法去执行另外一个方法. LazyValue<int> lazyOne ...
- SQLServer------聚集索引和非聚集索引的区别
转载: http://www.cnblogs.com/flashicp/archive/2007/05/08/739245.html 建立非聚集索引(vid不是主键) create index idx ...
- GIS-010-ArcGIS JS 三种查询模式(转)
QueryTask.FindTask.IdentifyTask都是继承自ESRI.ArcGIS.Client.Tasks: 1.QueryTask:是一个进行空间和属性查询的功能类,它可以在某个地图服 ...
- len()
len() 用于统计序列的长度,字符串 .元组 .列表都属于序列 In [1]: str = "hello world" In [2]: len(str) Out[2]: 11
- Tomcat在Linux下的安装与配置
一.安装配置JDK 1.官网下载JDK1.7 mkdir /usr/java cd /uar/java wget http://download.oracle.com/otn/java/jdk/7u8 ...
- js积累
动态加载JS文件(function (d) { var t=d.createElement("script");t.type="text/javascript" ...