首页 > 代码库 > HDU2795 Billboard

HDU2795 Billboard

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2795

 

 

 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 #define lson l,m,rt<<1 5 #define rson m+1,r,rt<<1|1 6 const int maxn = 222222; 7 int MAX[maxn << 2]; 8 int h, w, n; 9 void pushup(int rt)10 {11     MAX[rt] = max(MAX[rt << 1], MAX[rt << 1 | 1]);12 }13 void build(int l, int r, int rt)14 {15     MAX[rt] = w;16     if (l == r) return;17     int m = (l + r) >> 1;18     build(lson);19     build(rson);20 }21 int query(int p, int l, int r, int rt)//这里由于query和update都是对单点操作,所以将两个函数合并为一个了22 {23     if (l == r){24         MAX[rt] -= p;25         return l;26     }27     int m = (l + r) >> 1;28     int ret = (MAX[rt<<1] >= p ? query(p, lson) : query(p, rson));//这里判断左子节点是否还有相应的空间,若没有则递归右子节点。29     pushup(rt);30     return ret;31 }32 int main()33 {34     while (~scanf("%d%d%d", &h, &w, &n)){35         if (h > n) h = n;//通知小于h时可以直接缩小h的范围36         build(1, h, 1);37         while(n--){38             int p;39             scanf("%d", &p);40             if (MAX[1] < p) puts("-1");41             else printf("%d\n",query(p, 1, h, 1));42         }43     }44     return 0;45 }

 

HDU2795 Billboard