线段树。线段树的细节很重要,小数据遍历可以发现问题。

 /* 4553 */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 typedef struct {
int l, r;
int nls, nrs, nms;
int dls, drs, dms;
} node_t; const int study = ;
const int ds = ;
const int ns = ;
const int maxn = 1e5+;
node_t nd[maxn<<]; void Build(int l, int r, int rt) {
nd[rt].l = l;
nd[rt].r = r;
nd[rt].nls = nd[rt].nrs = nd[rt].nms = r-l+;
nd[rt].dls = nd[rt].drs = nd[rt].dms = r-l+;
if (l == r)
return ; int mid = (l + r) >> ;
Build(lson);
Build(rson);
} void PushDown(int rt) {
int l = nd[rt].l, r = nd[rt].r;
if (l == r) return ;
int lb = rt<<;
int rb = lb |;
int mid = (l + r) >> ; if (nd[rt].dms == ) {
nd[lb].dls = nd[lb].drs = nd[lb].dms = ;
nd[rb].dls = nd[rb].drs = nd[rb].dms = ;
} else if (nd[rt].dms == r-l+) {
nd[lb].dls = nd[lb].drs = nd[lb].dms = mid - l + ;
nd[rb].dls = nd[rb].drs = nd[rb].dms = r - mid;
} if (nd[rt].nms == ) {
nd[lb].nls = nd[lb].nrs = nd[lb].nms = ;
nd[rb].nls = nd[rb].nrs = nd[rb].nms = ;
} else if (nd[rt].nms == r-l+) {
nd[lb].nls = nd[lb].nrs = nd[lb].nms = mid - l + ;
nd[rb].nls = nd[rb].nrs = nd[rb].nms = r - mid;
}
} void PushUp1(int rt) {
int l = nd[rt].l, r = nd[rt].r;
if (l == r) return ;
int lb = rt<<;
int rb = lb |;
int mid = (l + r) >> ; nd[rt].dls = nd[lb].dls;
nd[rt].drs = nd[rb].drs;
nd[rt].dms = max(nd[lb].dms, nd[rb].dms);
nd[rt].dms = max(nd[rt].dms, nd[lb].drs+nd[rb].dls); if (nd[lb].dls == mid - l + )
nd[rt].dls += nd[rb].dls;
if (nd[rb].drs == r - mid)
nd[rt].drs += nd[lb].drs;
} void PushUp2(int rt) {
int l = nd[rt].l, r = nd[rt].r;
if (l == r) return ;
int lb = rt<<;
int rb = lb |;
int mid = (l + r) >> ; nd[rt].nls = nd[lb].nls;
nd[rt].nrs = nd[rb].nrs;
nd[rt].nms = max(nd[lb].nms, nd[rb].nms);
nd[rt].nms = max(nd[rt].nms, nd[lb].nrs+nd[rb].nls); if (nd[lb].nls == mid - l + )
nd[rt].nls += nd[rb].nls;
if (nd[rb].nrs == r - mid)
nd[rt].nrs += nd[lb].nrs;
} int query1(int qt, int rt) {
PushDown(rt); if (nd[rt].dms < qt)
return ; if (nd[rt].dls >= qt)
return nd[rt].l; if (nd[rt<<].dms >= qt)
return query1(qt, rt<<); if (nd[rt<<].drs + nd[rt<<|].dls >= qt)
return nd[rt<<].r - nd[rt<<].drs + ; return query1(qt, rt<<|);
} int query2(int qt, int rt) {
PushDown(rt); if (nd[rt].nms < qt)
return ; if (nd[rt].nls >= qt)
return nd[rt].l; if (nd[rt<<].nms >= qt)
return query2(qt, rt<<); if (nd[rt<<].nrs + nd[rt<<|].nls >= qt)
return nd[rt<<].r - nd[rt<<].nrs + ; return query2(qt, rt<<|);
} void update0(int L, int R, int rt) {
if (L<=nd[rt].l && nd[rt].r<=R) {
nd[rt].nls = nd[rt].nrs = nd[rt].nms = nd[rt].r-nd[rt].l+;
nd[rt].dls = nd[rt].drs = nd[rt].dms = nd[rt].r-nd[rt].l+;
return ;
} PushDown(rt);
int mid = (nd[rt].l + nd[rt].r) >> ; if (mid >= R) {
update0(L, R, rt<<);
} else if (mid < L) {
update0(L, R, rt<<|);
} else {
update0(L, R, rt<<);
update0(L, R, rt<<|);
} PushUp1(rt);
PushUp2(rt);
} void update1(int L, int R, int rt) {
if (L<=nd[rt].l && nd[rt].r<=R) {
nd[rt].dls = nd[rt].drs = nd[rt].dms = ;
return ;
} PushDown(rt);
int mid = (nd[rt].l + nd[rt].r) >> ; if (mid >= R) {
update1(L, R, rt<<);
} else if (mid < L) {
update1(L, R, rt<<|);
} else {
update1(L, R, rt<<);
update1(L, R, rt<<|);
} PushUp1(rt);
} void update2(int L, int R, int rt) {
if (L<=nd[rt].l && nd[rt].r<=R) {
nd[rt].nls = nd[rt].nrs = nd[rt].nms = ;
nd[rt].dls = nd[rt].drs = nd[rt].dms = ;
return ;
} PushDown(rt);
int mid = (nd[rt].l + nd[rt].r) >> ; if (mid >= R) {
update2(L, R, rt<<);
} else if (mid < L) {
update2(L, R, rt<<|);
} else {
update2(L, R, rt<<);
update2(L, R, rt<<|);
} PushUp1(rt);
PushUp2(rt);
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t;
int n, q;
int qt, l, r, ans;
char cmd[]; scanf("%d", &t);
rep(tt, , t+) {
scanf("%d %d", &n, &q);
Build(, n, );
printf("Case %d:\n", tt);
while (q--) {
scanf("%s", cmd);
if (cmd[] == 'S') {
scanf("%d %d", &l, &r);
update0(l, r, );
puts("I am the hope of chinese chengxuyuan!!");
} else if (cmd[] == 'D') {
scanf("%d", &qt);
l = query1(qt, );
if (l == ) {
puts("fly with yourself");
} else {
printf("%d,let's fly\n", l);
update1(l, l+qt-, );
}
} else if (cmd[] == 'N') {
scanf("%d", &qt);
l = query1(qt, );
if (l == )
l = query2(qt, );
if (l == ) {
puts("wait for me");
} else {
printf("%d,don't put my gezi\n", l);
update2(l, l+qt-, );
}
}
}
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

【HDOJ】4553 约会安排的更多相关文章

  1. hdu 4553 约会安排

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

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

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

  3. HDU 4553 约会安排 (区间合并)【线段树】

    <题目链接> 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有 ...

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

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

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

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

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

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

  7. M - 约会安排 - hdu 4553

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

  8. 约会安排HDU - 4553

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

  9. 约会安排 HDU - 4553(线段树区间查询,区间修改,区间合并)

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

随机推荐

  1. NUnit使用详解(一)

    转载:http://hi.baidu.com/grayworm/item/38e246165aa7b9433a176e90 NUnit是一个单元测试框架,专门针对于.NET来写的,它是是xUnit的一 ...

  2. c语言学习之基础知识点介绍(十四):指针的进阶

    一.指针的加.减法运算 /* 1.加法运算 1).可以跟整数进行加法运算,得到的还是一个地址 公式: 地址 + 1 = 地址 + 1 * 类型所占的字节数 地址 + n = 地址 + n * 类型所占 ...

  3. Ubuntu 使用top/free查看内存占用大的原因

    Ubuntu 使用top/free查看内存占用大的原因     linux/ubuntu下free/top查看内存占用大的原因 使用free/top查看内存占用的时候,吓了一大跳,机器4GB的内存,显 ...

  4. 【BZOJ3270】【高斯消元】博物馆

    Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n间房间,并且满足可以从任何一 ...

  5. WP8手机解锁时提示“请确保IPOVERUSBSVC服务正常运行”解决方法

    如果你各种重启服务 卸载手机 重装驱动都试过了还不行,请看看你是否安装了Hyper-v或Vitualbox虚拟机,很有可能是虚拟交换机造成的. 我在网络连接属性里看到这个 把它卸载后,解锁成功. 解锁 ...

  6. 简单Linq笔记

    Linq是.net 3.5才引入的 要引入命名空间System.Linq. Linq  to XML要引入System.Xml.Linq Linq to ADO.NET要引入System.Data.L ...

  7. PL/SQL学习(五)异常处理

    原文参考:http://plsql-tutorial.com/ 组成: 1) 异常类型 2) 错误码 3) 错误信息   代码结构: DECLARE Declaration section BEGIN ...

  8. SQLSERVER与C#中数据类型的对应关系

    SQLSERVER与C#中数据类型的对应关系 ///<summary> ///数据库中与C#中的数据类型对照 ///</summary> ///<paramname=&q ...

  9. Inspiron 14 7000 系列 (7447) 游匣14 拆机图

    Inspiron 14 7000 系列 (7447)   游匣14 拆机图   游匣配置不多说,i5起步,标配4G GTX850M显卡,这么霸道的配置给我玩扫雷肯定不卡.配置高功耗就大,不过游匣的散热 ...

  10. 黑马程序员-------.net基础知识一

    一 初识.net  .net是一种多语言的编程平台,可以用多达几十种的语言来进行开发,而C#就是基于.net平台的其中一种开发语言. 它的特点是: ⒈多平台:该系统可以在广泛的计算机上运行,包括从服务 ...