poj3667的加强版 当时的题解
这里只不过对于女神需要另开算,DS的占用的时间不加在女神身上,女神的时间都要加,清空的时候也都要算。
1 #include <iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<stdlib.h>
6 #include<vector>
7 #include<cmath>
8 #include<queue>
9 #include<set>
10 using namespace std;
11 #define N 100010
12 #define LL long long
13 #define INF 0xfffffff
14 const double eps = 1e-8;
15 const double pi = acos(-1.0);
16 const double inf = ~0u>>2;
17 int lm[N<<2],ll[N<<2],lr[N<<2];
18 int nlm[N<<2],nll[N<<2],nlr[N<<2];
19 int lz[N<<2],nlz[N<<2];
20 void up(int w,int m)
21 {
22 ll[w] = ll[w<<1]==(m-m/2)?ll[w<<1|1]+ll[w<<1]:ll[w<<1];
23 lr[w] = lr[w<<1|1]==(m/2)?lr[w<<1]+lr[w<<1|1]:lr[w<<1|1];
24 lm[w] = max(max(lm[w<<1],lm[w<<1|1]),lr[w<<1]+ll[w<<1|1]);
25 nll[w] = nll[w<<1]==(m-m/2)?nll[w<<1|1]+nll[w<<1]:nll[w<<1];
26 nlr[w] = nlr[w<<1|1]==(m/2)?nlr[w<<1]+nlr[w<<1|1]:nlr[w<<1|1];
27 nlm[w] = max(max(nlm[w<<1],nlm[w<<1|1]),nlr[w<<1]+nll[w<<1|1]);
28 }
29 void down(int w,int m)
30 {
31 if(lz[w]!=-1)
32 {
33 ll[w<<1] = lr[w<<1] = lm[w<<1] = lz[w]?(m-m/2):0;
34 ll[w<<1|1] = lr[w<<1|1] = lm[w<<1|1] = lz[w]?(m/2):0;
35 lz[w<<1] = lz[w<<1|1] = lz[w];
36 lz[w] = -1;
37 }
38 if(nlz[w]!=-1)
39 {
40 nll[w<<1] = nlr[w<<1] = nlm[w<<1] = nlz[w]?(m-m/2):0;
41 nll[w<<1|1] = nlr[w<<1|1] = nlm[w<<1|1] = nlz[w]?(m/2):0;
42 nlz[w<<1] = nlz[w<<1|1] = nlz[w];
43 nlz[w] = -1;
44 }
45 }
46 void build(int l,int r,int w)
47 {
48 if(l==r)
49 {
50 lm[w] = ll[w] = lr[w] = 1;
51 nlm[w] = nll[w] = nlr[w] = 1;
52 return ;
53 }
54 int m = (l+r)>>1;
55 build(l,m,w<<1);
56 build(m+1,r,w<<1|1);
57 up(w,r-l+1);
58 }
59 void update(int a,int b,int d,int flag,int l,int r,int w)
60 {
61 if(a<=l&&b>=r)
62 {
63 if(flag)
64 {
65 nlm[w] = nll[w] = nlr[w] = d*(r-l+1);
66 nlz[w] = d;
67 }
68 lm[w] = ll[w] = lr[w] = d*(r-l+1);
69 lz[w] = d;
70 return ;
71 }
72 down(w,r-l+1);
73 int m = (l+r)>>1;
74 if(a<=m)
75 update(a,b,d,flag,l,m,w<<1);
76 if(b>m)
77 update(a,b,d,flag,m+1,r,w<<1|1);
78 up(w,r-l+1);
79 }
80 int find(int k,int f,int l,int r,int w)
81 {
82 if(l==r)
83 {
84 return l;
85 }
86 int m = (l+r)>>1;
87 down(w,r-l+1);
88 if(f)
89 {
90 if(lm[w<<1]>=k)
91 return find(k,f,l,m,w<<1);
92 else if(lr[w<<1]+ll[w<<1|1]>=k)
93 return m-lr[w<<1]+1;
94 else return find(k,f,m+1,r,w<<1|1);
95 }
96 else
97 {
98 if(nlm[w<<1]>=k)
99 return find(k,f,l,m,w<<1);
100 else if(nlr[w<<1]+nll[w<<1|1]>=k)
101 return m-nlr[w<<1]+1;
102 else return find(k,f,m+1,r,w<<1|1);
103 }
104 }
105 int main()
106 {
107 int n,kk=0,t,q;
108 int x,y;
109 char s[20];
110 scanf("%d",&t);
111 while(t--)
112 {
113 memset(lz,-1,sizeof(lz));
114 memset(nlz,-1,sizeof(nlz));
115 scanf("%d%d",&n,&q);
116 build(1,n,1);
117 printf("Case %d:\n",++kk);
118 while(q--)
119 {
120 scanf("%s%d",s,&x);
121 if(s[0]==‘D‘)
122 {
123 if(lm[1]<x)
124 puts("fly with yourself");
125 else
126 {
127 int k = find(x,1,1,n,1);
128 update(k,k+x-1,0,0,1,n,1);
129 printf("%d,let‘s fly\n",k);
130 }
131 }
132 else if(s[0]==‘N‘)
133 {
134 if(lm[1]>=x)
135 {
136 int k = find(x,1,1,n,1);
137 printf("%d,don‘t put my gezi\n",k);
138 update(k,k+x-1,0,1,1,n,1);
139 }
140 else if(nlm[1]>=x)
141 {
142 int k = find(x,0,1,n,1);
143 printf("%d,don‘t put my gezi\n",k);
144 update(k,k+x-1,0,1,1,n,1);
145 }
146 else puts("wait for me");
147 }
148 else
149 {
150 scanf("%d",&y);
151 update(x,y,1,1,1,n,1);
152 printf("I am the hope of chinese chengxuyuan!!\n");
153 }
154 }
155 }
156 return 0;
157 }
hdu4553约会安排(线段树区间合并),布布扣,bubuko.com
时间: 2024-10-10 10:51:49