标签:
Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13382 Accepted Submission(s): 5770
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <vector> 6 #include <queue> 7 #include <cmath> 8 #include <set> 9 using namespace std; 10 11 #define N 200005 12 #define ll root<<1 13 #define rr root<<1|1 14 #define mid (a[root].l+a[root].r)/2 15 16 17 int max(int x,int y){return x>y?x:y;} 18 int min(int x,int y){return x<y?x:y;} 19 int abs(int x,int y){return x<0?-x:x;} 20 21 int n; 22 int b[N]; 23 int h, w; 24 int ans[N]; 25 26 struct node{ 27 int l, r, minw; 28 }a[N*4]; 29 30 void build(int l,int r,int root){ 31 a[root].l=l; 32 a[root].r=r; 33 a[root].minw=0; 34 if(l==r) return; 35 build(l,mid,ll); 36 build(mid+1,r,rr); 37 } 38 int flag; 39 40 void solve(int id,int root){ 41 if(b[id]+a[root].minw>w) return; //若这个区间最小的高度+要贴报纸的高度大于木板的高度则不能贴 42 if(a[root].l==a[root].r){ 43 ans[id]=a[root].l; 44 a[root].minw+=b[id]; 45 flag=1; 46 return ; 47 } 48 if(b[id]+a[ll].minw<=w) solve(id,ll); //优先贴最左边 49 else solve(id,rr); 50 a[root].minw=min(a[ll].minw,a[rr].minw);//向上更新 51 } 52 53 main() 54 { 55 int i, j, k; 56 while(scanf("%d %d %d",&h,&w,&n)==3){ 57 for(i=1;i<=n;i++) scanf("%d",&b[i]); 58 build(1,min(n,h),1); 59 for(i=1;i<=n;i++){ 60 if(b[i]>w){ //若b[i]>w,显然不能贴 61 ans[i]=-1;continue; 62 } 63 flag=0; 64 solve(i,1); 65 if(!flag) ans[i]=-1; //若不能贴 66 } 67 for(i=1;i<=n;i++) printf("%d\n",ans[i]); 68 } 69 }
标签:
原文地址:http://www.cnblogs.com/qq1012662902/p/4527594.html