标签:des style blog http io ar color os sp
Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11861 Accepted Submission(s): 5223
题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子
思路:每次找到最大值的位子,然后减去L
线段树功能:query:区间求最大值的位子
1 #include<cstdio> 2 #include<string.h> 3 #include<algorithm> 4 5 #define clr(x,y) memset(x,y,sizeof(x)) 6 #define lson l,m,rt<<1 7 #define rson m+1,r,rt<<1|1 8 9 const int N=2e5+3511; 10 using namespace std; 11 12 int h,w,n,MAX[N<<2]; 13 14 void PushUp(int rt) 15 { 16 MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]); 17 } 18 19 void build(int l,int r,int rt) 20 { 21 int m; 22 23 MAX[rt]=w; 24 if(l==r) { 25 return; 26 } 27 28 m=(l+r)>>1; 29 build(lson); 30 build(rson); 31 } 32 33 int query(int x,int l,int r,int rt) 34 { 35 int m,ret; 36 if(l==r) { 37 MAX[rt]-=x; 38 return l; 39 } 40 m=(l+r)>>1; 41 ret=(MAX[rt<<1]>=x) ? query(x,lson) : query(x,rson); 42 PushUp(rt); 43 return ret; 44 } 45 46 int main() 47 { 48 int x; 49 while(~scanf("%d%d%d",&h,&w,&n)) { 50 if(h>n) h=n; 51 build(1,h,1); 52 while(n--) { 53 scanf("%d",&x); 54 if(MAX[1]<x) puts("-1"); 55 else printf("%d\n",query(x,1,h,1)); 56 57 } 58 59 } 60 61 return 0; 62 }
[HDU] 2795 Billboard [线段树区间求最值]
标签:des style blog http io ar color os sp
原文地址:http://www.cnblogs.com/sxiszero/p/4125866.html