线段树专题#6_蒟蒻训练历程记录_HDU 2705 Billboard_单点更新

来源:互联网 发布:c语言获取开机时间 编辑:程序博客网 时间:2024/06/05 01:54

              这道题,很水的啦。。然而楼猪制杖,真的宛若制杖,居然把向上更新的函数写成了两个子节点的和,WA了几发愣是没有发现。。。ORZ制杖专卖,假一罚十!

             唯一的坑点就是必须现在公告板的高度和小纸片的个数里面取最小值,否则数组会越界了。。1e9ORZ就爆了。以下是AC代码:

             声明:本人蒟蒻,本系列博客为了勉励更多的初学者,在学习算法的路上越走越远欧耶╰( ̄▽ ̄)╭

#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<cstdlib>#include<cstdio>#include<cmath>#include<cstring>#include<vector>#include<map>#include<algorithm>#include<queue>#include<stack>//线段树单点更新查询,这道去年不会的超级难题,现在竟然感觉很简单 using namespace std;typedef long long ll;#define N 200010int g[4*N];int h, w, n, key;void init(int rt, int l, int r){if(l == r){g[rt] = w;return;}int mid = (l+r)>>1;init(rt<<1, l, mid);init(rt<<1|1, mid+1, r);g[rt] = max(g[rt<<1], g[rt<<1|1]);}void Update(int rt, int l, int r, int x){if(l == r){if(g[rt] >= x){g[rt] -= x;//printf("l:%d g[rt]:%d\n", l, g[rt]);key = l;}return;}int mid = (l+r)>>1;if(g[rt<<1] >= x)Update(rt<<1, l, mid, x);elseUpdate(rt<<1|1, mid+1, r, x);g[rt] = max(g[rt<<1], g[rt<<1|1]);}int main(){while(~scanf("%d%d%d", &h, &w, &n)){h = min(h, n);init(1, 1, h);while(n--){int tt;key = -1;scanf("%d", &tt);Update(1, 1, h, tt);printf("%d\n", key);}} return 0;} 


0 0