hdu 4614 Vases and Flowers(线段树:成段更新)
线段树裸题。自己写复杂了,准确说是没想清楚就敲了。
先是建点为已插花之和,其实和未插花是一个道理,可是开始是小绕,后来滚雪球了,跪了。
重新建图,分解询问1为:找出真正插画的开始点和终止点,做成段更新。
再次向notonlysuccess大神致谢,清晰的代码+清晰的思路=ac
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 6 #define lson l,m,rt<<1 7 #define rson m+1,r,rt<<1|1 8 9 const int MAXN=55555; 10 int sum[MAXN<<2]; 11 int lag[MAXN<<2]; 12 int n; 13 14 void PushUp(int rt) 15 { 16 if(lag[rt<<1]==lag[rt<<1|1]&&lag[rt<<1]!=-1) 17 lag[rt]=lag[rt<<1]; 18 else 19 lag[rt]=-1; 20 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 21 } 22 23 void PushDown(int rt,int m) 24 { 25 if(lag[rt]!=-1){ 26 lag[rt<<1]=lag[rt<<1|1]=lag[rt]; 27 sum[rt<<1]=(m-(m>>1))*(1-lag[rt]); 28 sum[rt<<1|1]=(m>>1)*(1-lag[rt]); 29 lag[rt]=-1; 30 31 } 32 } 33 34 void Build(int l,int r,int rt) 35 { 36 lag[rt]=-1; 37 if(l==r){ 38 sum[rt]=1; 39 return ; 40 } 41 int m=(l+r)>>1; 42 Build(lson); 43 Build(rson); 44 PushUp(rt); 45 } 46 47 void updata(int L,int R,int c,int l,int r,int rt) 48 { 49 if(L<=l&&r<=R){ 50 sum[rt]=(r-l+1)*(1-c); 51 lag[rt]=c; 52 return ; 53 } 54 PushDown(rt,r-l+1); 55 int m=(l+r)>>1; 56 if(L<=m)updata(L,R,c,lson); 57 if(m<R)updata(L,R,c,rson); 58 PushUp(rt); 59 } 60 61 int Query1(int L,int R,int l,int r,int rt) 62 { 63 if(L>R) 64 return 0; 65 if(L<=l&&r<=R) 66 return sum[rt]; 67 PushDown(rt,r-l+1); 68 int m=(l+r)>>1; 69 int res=0; 70 if(L<=m) 71 res+=Query1(L,R,lson); 72 if(m<R) 73 res+=Query1(L,R,rson); 74 return res; 75 } 76 77 int Query2(int p,int l,int r,int rt) 78 { 79 if(l==r) 80 return l; 81 PushDown(rt,r-l+1); 82 int m=(l+r)>>1; 83 if(p<=sum[rt<<1]) 84 return Query2(p,lson); 85 else 86 return Query2(p-sum[rt<<1],rson); 87 } 88 int main() 89 { 90 int T,m; 91 int op,a,b,k; 92 int flag=0; 93 scanf("%d",&T); 94 while(T--) 95 { 96 scanf("%d%d",&n,&m); 97 98 Build(0,n-1,1); 99 100 for(k=0;k<m;k++) 101 { 102 scanf("%d%d%d",&op,&a,&b); 103 104 if(op==1){ 105 int s=Query1(a,n-1,0,n-1,1); 106 if(!s) 107 printf("Can not put any one.\n"); 108 else { 109 int left=Query1(0,a-1,0,n-1,1); 110 111 int l=Query2(left+1,0,n-1,1); 112 int r=Query2(left+min(s,b),0,n-1,1); 113 printf("%d %d\n",l,r); 114 updata(l,r,1,0,n-1,1); 115 } 116 }else { 117 printf("%d\n",b-a+1-Query1(a,b,0,n-1,1)); 118 updata(a,b,0,0,n-1,1); 119 } 120 } 121 printf("\n"); 122 } 123 return 0; 124 }