算是poj3667的加强版,建立两颗线段树,一个是DS区间,另一个是NS区间。那么根据题意,如果是DS的请求,那么首先查找DS的区间,如果有满足的区间就更新DS区间,NS的区间不需要更新。如果是NS的请求,首先看DS区间是否有满足的区间,否则查找NS区间,如果有就同时更新DS区间和NS区间。那么可以归纳为,只要是NS的请求,就同时更新两颗线段树,否则只更新DS的线段树。
注意输出要从Output中复制,不然会wa道底,还有就是Up函数中的if顺序不能变;
 
这两道题写了一天,不过值了,当然如果不是因为有学长的博客在,我一天根本写不出来,学长毕竟是学长;
 
#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(线段树,麻烦的区间覆盖)的更多相关文章

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

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

  2. codeforces 652C C. Foe Pairs(尺取法+线段树查询一个区间覆盖线段)

    题目链接: C. Foe Pairs time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  3. HDU 4553 约会安排(线段树区间合并+双重标记)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 题目大意:就是有三种操作: ①DS x,安排一段长度为x的空闲时间跟屌丝一起,输出这段时间的起点 ...

  4. HDU 1754 I Hate It(线段树单点替换+区间最值)

    I Hate It [题目链接]I Hate It [题目类型]线段树单点替换+区间最值 &题意: 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0 ...

  5. HDU 3577Fast Arrangement(线段树模板之区间增减更新 区间求和查询)

    Fast Arrangement Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  6. POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 140120 ...

  7. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  8. POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)

    POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...

  9. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  10. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

随机推荐

  1. TF42064: The build number already exists for build definition error in TFS2010

    In TFS2008, deleting a build removes it from the database itself. If you delete a build called Build ...

  2. 【Java面试题】28 简述synchronized和java.util.concurrent.locks.Lock的异同 ?

    主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要 ...

  3. 如何在word文档中添加mathtype加载项

    MathType是强大的数学公式编辑器,通常与office一起使用,mathtype安装完成后,正常情况下会在word文档中的菜单中自动添加mathtype加载项,但有时也会出现小意外,mathtyp ...

  4. 搭建 FTP 文件服务vsftpd

    安装并启动 FTP 服务 安装 VSFTPD 使用 yum 安装 vsftpd: yum install vsftpd -y vsftpd 是在 Linux 上被广泛使用的 FTP 服务器,根据其[官 ...

  5. unity 打包apk安装失败

    Unity 打包Apk安装失败,错误提示:安卓未完成. 解决方案:检查BundleID是否一致

  6. 如何使用CodeSmith批量生成代码(原创系列教程)

    在上一篇我们已经用PowerDesigner创建好了需要的测试数据库,下面就可以开始用它完成批量代码生成的工作啦. 下面我会一步步的解释如何用CodeSmith实现预期的结果的,事先声明一下,在此只做 ...

  7. Java 实现选择排序

    选择排序: 原理:依次从数组最左边取一个元素,与之后的位置上的元素比較,假设大于/小于(取决于须要升序排还是降序排).则保存较大/较小元素的索引 当一轮比較后,将保存的较大/较小元素的索引与 这轮開始 ...

  8. memcache和memcached的区别

    用了段时间的memcache和memcached总结下认识,看很多人在用cache的时候,刚刚都没有搞清楚memcache和 memcached的区别,还有就是使用的时候基本都是 get/set  用 ...

  9. JS对象添加新的字段

    var test={name:"name",age:"12"}; test.id = "12345"; 直接定义添加就成了

  10. 通过身份证分析出生年月日、性别、年龄的SQL语句

    ),) ) ),)<>'X' ) ) )<>'X' ),)),)),)) ),)),)),)) ) as int)) where [出生日期]<>'' #字符串格式 ...