hdu4553约会安排(线段树区间合并)
poj3667的加强版 当时的题解
这里只不过对于女神需要另开算,DS的占用的时间不加在女神身上,女神的时间都要加,清空的时候也都要算。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }