HDU4553 约会安排

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

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

  1 // #pragma comment(linker, "/STACK:1024000000,1024000000")
  2 #include <iostream>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <sstream>
  6 #include <string>
  7 #include <algorithm>
  8 #include <list>
  9 #include <map>
 10 #include <vector>
 11 #include <queue>
 12 #include <stack>
 13 #include <cmath>
 14 #include <cstdlib>
 15 #include <conio.h>
 16 using namespace std;
 17 #define clc(a,b) memset(a,b,sizeof(a))
 18 #define inf 0x3f3f3f3f
 19 #define lson l,mid,rt<<1
 20 #define rson mid+1,r,rt<<1|1
 21 const int N = 100010;
 22 const int MOD = 1e9+7;
 23 #define LL long long
 24 #define mi() (l+r)>>1
 25 double const pi = acos(-1);
 26 void fre() {
 27     freopen("in.txt","r",stdin);
 28 }
 29 // inline int r() {
 30 //     int x=0,f=1;char ch=getchar();
 31 //     while(ch>‘9‘||ch<‘0‘) {if(ch==‘-‘) f=-1;ch=getchar();}
 32 //     while(ch>=‘0‘&&ch<=‘9‘) { x=x*10+ch-‘0‘;ch=getchar();}return x*f;
 33 // }
 34 struct Edge {
 35     int l,r;
 36     int lazy;
 37     int lm,rm,mm;
 38 } e1[N<<2],e2[N<<2];
 39
 40 void pushdown(Edge e[],int rt) {
 41     if(e[rt].lazy!=-1) {
 42         if(e[rt].lazy==0) {
 43             e[rt<<1].lm=e[rt<<1].rm=e[rt<<1].mm=e[rt<<1].r-e[rt<<1].l+1;
 44             e[rt<<1|1].rm=e[rt<<1|1].lm=e[rt<<1|1].mm=e[rt<<1|1].r-e[rt<<1|1].l+1;
 45             e[rt<<1].lazy=e[rt<<1|1].lazy=0;
 46         } else {
 47             e[rt<<1].lm=e[rt<<1].rm=e[rt<<1].mm=0;
 48             e[rt<<1|1].rm=e[rt<<1|1].lm=e[rt<<1|1].mm=0;
 49             e[rt<<1].lazy=e[rt<<1|1].lazy=1;
 50         }
 51         e[rt].lazy=-1;
 52     }
 53 }
 54
 55 void pushup(Edge e[],int rt) {
 56     e[rt].lm=e[rt<<1].lm;
 57     e[rt].rm=e[rt<<1|1].rm;
 58     if(e[rt<<1].lm==e[rt<<1].r-e[rt<<1].l+1) {
 59         e[rt].lm+=e[rt<<1|1].lm;
 60     }
 61     if(e[rt<<1|1].rm==e[rt<<1|1].r-e[rt<<1|1].l+1) {
 62         e[rt].rm+=e[rt<<1].rm;
 63     }
 64     e[rt].mm=max(max(e[rt<<1].mm,e[rt<<1|1].mm),e[rt<<1].rm+e[rt<<1|1].lm);
 65 }
 66 void build(int l,int r,int rt,Edge a[]) {
 67     a[rt].l=l;
 68     a[rt].r=r;
 69     a[rt].lm=a[rt].rm=a[rt].mm=(r-l+1);
 70     a[rt].lazy=-1;
 71     if(l==r)
 72         return;
 73     int mid=mi();
 74     build(lson,a);
 75     build(rson,a);
 76 }
 77
 78 void update(Edge e[],int l,int r,int rt,int x) {
 79     if(e[rt].l==l&&e[rt].r==r) {
 80         if(x==0) {
 81             e[rt].lm=e[rt].rm=e[rt].mm=r-l+1;
 82             e[rt].lazy=0;
 83         } else {
 84             e[rt].lm=e[rt].rm=e[rt].mm=0;
 85             e[rt].lazy=1;
 86         }
 87         return;
 88     }
 89     pushdown(e,rt);
 90     int mid=(e[rt].l+e[rt].r)>>1;
 91     if(r<=mid) update(e,l,r,rt<<1,x);
 92     else if(l>mid) update(e,l,r,rt<<1|1,x);
 93     else {
 94         update(e,l,mid,rt<<1,x);
 95         update(e,mid+1,r,rt<<1|1,x);
 96     }
 97     pushup(e,rt);
 98 }
 99
100 int query(Edge e[],int rt,int c) {
101     if(e[rt].l==e[rt].r) {
102         return e[rt].l;
103     }
104     pushdown(e,rt);
105     int mid=(e[rt].l+e[rt].r)>>1;
106     if(e[rt<<1].mm>=c) {
107         return query(e,rt<<1,c);
108     } else if(e[rt<<1].rm+e[rt<<1|1].lm>=c) {
109         return mid-e[rt<<1].rm+1;
110     } else {
111         return query(e,rt<<1|1,c);
112     }
113 }
114 int main() {
115     // fre();
116     int T;
117     int cas=1;
118     cin>>T;
119     while(T--) {
120         printf("Case %d:\n",cas++);
121         int n,q;
122         cin>>n>>q;
123         build(1,n,1,e1);//D
124         build(1,n,1,e2);//N
125         while(q--) {
126             char s[20];
127             int x,y;
128             scanf("%s",s);
129             if(s[0]==‘S‘) {
130                 cin>>x>>y;
131                 update(e1,x,y,1,0);
132                 update(e2,x,y,1,0);
133                 printf("I am the hope of chinese chengxuyuan!!\n");
134             } else if(s[0]==‘D‘) {
135                 cin>>x;
136                 if(e1[1].mm<x) {
137                     printf("fly with yourself\n");
138                 } else {
139                     int s=query(e1,1,x);
140                     printf("%d,let‘s fly\n",s);
141                     update(e1,s,s+x-1,1,1);
142                 }
143             } else {
144                 cin>>x;
145                 if(e1[1].mm>=x) {
146                     int s=query(e1,1,x);
147                     printf("%d,don‘t put my gezi\n",s);
148                     update(e1,s,s+x-1,1,1);
149                     update(e2,s,s+x-1,1,1);
150                 } else if(e2[1].mm>=x) {
151                     int s=query(e2,1,x);
152                     printf("%d,don‘t put my gezi\n",s);
153                     update(e1,s,s+x-1,1,1);
154                     update(e2,s,s+x-1,1,1);
155                 } else {
156                     printf("wait for me\n");
157                 }
158             }
159         }
160     }
161     return 0;
162 }
时间: 2024-07-28 15:53:52

HDU4553 约会安排的相关文章

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

链接 poj3667的加强版 当时的题解 这里只不过对于女神需要另开算,DS的占用的时间不加在女神身上,女神的时间都要加,清空的时候也都要算. 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath>

hdu4553约会安排 线段树

//DS QT  找一段最靠前的长度为QT的空间 //NS QT  找一段最靠前的长度为QT的空间,如果没找到可以将DS占据的空间当做空闲空间,找一段最靠前的空间 //STUDY!! L R  清空L ,R的空间 //用两个线段树,一个处理DS的情况,一个处理NS的情况 //线段树维护,ma_l , ma_r , ma 区间[l,r]的左边的空闲区间,右边的以及最大的空闲区间 #include<cstdio> #include<cstring> #include<iostre

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

约会安排 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 433    Accepted Submission(s): 145 Problem Description 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有

hdu 4553 约会安排

约会安排 http://acm.hdu.edu.cn/showproblem.php?pid=4553 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Problem Description 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑

约会安排 (区间合并)毒瘤题

约会安排 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 2705    Accepted Submission(s): 768 Problem Description 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复"呵呵",所以,小明的最爱就是和女神们约会.与

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 算是poj3667的加强版,建立两颗线段树,一个是DS区间,另一个是NS区间.那么根据题意,如果是DS的请求,那么首先查找DS的区间,如果有满足的区间就更新DS区间,NS的区间不需要更新.如果是NS的请求,首先看DS区间是否有满足的区间,否则查找NS区间,如果有就同时更新DS区间和NS区间.那么可以归纳为,只要是NS的请求,就同时更新两颗线段树,否则只更新DS的线段树. 注意输出要从Outpu

HDU 4553 约会安排(二维线段树)

Problem Description 寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复"呵呵",所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑,由于数量实在过于巨大,怎么安排时间便成了小明的一大心事. 我们已知小明一共有T的空闲时间,期间会有很多女神或者基友来找小明. 作为一个操作系统曾经怒考71分的大神,小明想到了一个算法,即"首次适应算法",根据操作系统课本的描述,就是找一段最

M - 约会安排 - hdu 4553

寒假来了,又到了小明和女神们约会的季节.  小明虽为?丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑,由于数量实在过于巨大,怎么安排时间便成了小明的一大心事.  我们已知小明一共有T的空闲时间,期间会有很多女神或者基友来找小明.  作为一个操作系统曾经怒考71分的大神,小明想到了一个算法,即“首次适应算法”,根据操作系统课本的描述,就是找一段最靠前的符合要求的连续空间分配给每个请求,由此小明做出了一个决定:

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

<题目链接> 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复"呵呵",所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑,由于数量实在过于巨大,怎么安排时间便成了小明的一大心事.  我们已知小明一共有T的空闲时间,期间会有很多女神或者基友来找小明.  作为一个操作系统曾经怒考71分的大神,小明想到了一个算法,即"首次适应算法",根据操作系统课本的描述,就是找一段最靠前的符