标签:输出 ble desc str top rectangle ret 位置 mission
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=2795
Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 28743 Accepted Submission(s): 11651
有一个 高为H 宽为W 的公告墙,要在上面贴 N 个 高恒为1 宽为 W 的广告(每次都是优先左上方向),输出广告贴的高度 h;
线段树的子节点维护 1~H 每一层的所剩的最大值 Wi,每次查询不是找最大值,而是找到最大值所在的结点位置(第几层)
Push操作从叶子结点往上更新;
线段树最大的边界不一定是输入的 H ,也可能是 N(极限每一层只贴一个)
但用min会超时很多,淳朴的 if 语句判断 H 还是 N 小就好
查询先遍历左子树后遍历右子树,因为优先贴左边。
看似简单的东西要自己亲手去敲代码才能发现问题所在。
AC code:
1 #include <bits/stdc++.h> 2 #define lson l, mid, root<<1 3 #define rson mid+1, r, root<<1|1 4 using namespace std; 5 6 const int MAXN = 2e5+10; 7 int maxh[MAXN<<2], hb; 8 int H, W, N; 9 int read() 10 { 11 int f=1,x=0;char s=getchar(); 12 while(s<‘0‘||s>‘9‘){if(s==‘-‘)f=-1;s=getchar();} 13 while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();} 14 x*=f; 15 return x; 16 } 17 void Build(int l, int r, int root) 18 { 19 maxh[root] = W; 20 if(l == r) return; 21 //int mid = l+((r-l)>>1); 22 int mid = (l+r)>>1; 23 Build(lson);Build(rson); 24 } 25 void Push(int Root) 26 { 27 maxh[Root] = max(maxh[Root<<1], maxh[Root<<1|1]); 28 } 29 30 void Update(int pos, int l, int r, int root, int len) 31 { 32 if(l == r){maxh[root]+=len;return;} 33 //int mid = l+((r-l)>>1); 34 int mid = (l+r)>>1; 35 if(pos <= mid) Update(pos, lson, len); 36 else Update(pos, rson, len); 37 Push(root); 38 } 39 int Query(int l, int r, int root) 40 { 41 if(l == r) return l; 42 int mid = (l+r)>>1; 43 int res = 0; 44 if(maxh[root<<1] >= hb) res = Query(lson); 45 else res = Query(rson); 46 return res; 47 } 48 int main() 49 { 50 while(~scanf("%d %d %d", &H, &W, &N)){ 51 if(H > N) H = N; 52 Build(1, H, 1); 53 for(int i = 1; i <= N; i++) 54 { 55 hb = read(); 56 //scanf("%d", &hb); 57 if(maxh[1] < hb) printf("-1\n"); 58 else{ 59 int now = Query(1, H, 1); 60 Update(now, 1, H, 1, -hb); 61 printf("%d\n", now); 62 } 63 } 64 } 65 return 0; 66 }
HDU 2795 Billboard 【线段树维护区间最大值&&查询变形】
标签:输出 ble desc str top rectangle ret 位置 mission
原文地址:https://www.cnblogs.com/ymzjj/p/9557877.html