您的位置:首页 > 理论基础 > 数据结构算法

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

2016-07-30 18:50 417 查看
              这道题,很水的啦。。然而楼猪制杖,真的宛若制杖,居然把向上更新的函数写成了两个子节点的和,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 200010
int 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);
else
Update(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息