线段树专题#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;
}
唯一的坑点就是必须现在公告板的高度和小纸片的个数里面取最小值,否则数组会越界了。。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;
}
相关文章推荐
- 线段树专题#5_蒟蒻训练历程记录_HDU 1394 Minimum Inversion Number_单点更新+思维转换
- 线段树专题#4_蒟蒻训练历程记录_HDU1698_ 延迟标记、区间更新
- 线段树专题#2_蒟蒻训练历程记录_HDU5775
- 线段树专题#1_蒟蒻训练历程记录_HDU1166
- 线段树专题#3_蒟蒻训练历程记录_HDU1754_I hate It
- hdu 2795 Billboard(线段树单点更新)
- 线段树练习[单点更新] HDU 2795 Billboard
- HDU 2795 Billboard(线段树,单点更新)
- hdu 2795 Billboard(线段树+单点更新)
- hdu 2795 Billboard(线段树-单点更新)
- HDU-2795-Billboard-线段树单点更新
- HDU-2795 Billboard 线段树单点更新
- hdu 2795 Billboard (线段树,单点更新)
- hdu 2795 Billboard 线段树 单点更新
- hdu 2795 Billboard 线段树单点更新
- hdu 2795 Billboard(线段树单点更新)
- hdu 2795 Billboard 线段树单点更新(线段树+二分)
- hdu 2795 Billboard(线段树之 单点更新+区间最值)
- HDU 2795 Billboard (线段树单点更新)
- HDU 2795 Billboard // 线段树 单点更新