HDU_2795 Billboard(线段树)
生活随笔
收集整理的這篇文章主要介紹了
HDU_2795 Billboard(线段树)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*題意:輸出每次貼上的海報所在的行號,行號為1...h;
開始拿到這題沒思路,后來問了問本校的大牛,終于找到思路。這題是按high建樹,
結構體中定義一個len變量,存放當前該結點的空閑長度。某結點的父結點存放其子結
點的最大空閑長度值;
比如(len = 10):
1
len = max(len2,len3)
/ \
2 3
(len = max(len4,len5))
/ \ / \
4 5 6 7
(len = 6) (len = 7)
這樣每次更新時,如果父結點的node[t].len < w,則父結點之下的結點都不符合條件,
可以跳過。*/
/*My Code:*/
#include <iostream>
#include <cstdio>
#define L(t) t << 1
#define R(t) t << 1 | 1
using namespace std;
const int N = 200005;
struct node
{
int l, r;
int w;
}node[N*4];
int w, ans;
void creat(int t, int l, int r)
{
node[t].l = l;
node[t].r = r;
node[t].w = w;
if(l == r) return;
int mid = (l + r) >> 1;
creat(L(t), l, mid);
creat(R(t), mid+1, r);
}
void updata(int t, int len)
{
if(node[t].l == node[t].r)
{
if(node[t].w < len)
return;
node[t].w -= len;
ans = node[t].l;
return;
}
if(len <= node[L(t)].w)
updata(L(t), len);
else
updata(R(t), len);
node[t].w = node[L(t)].w > node[R(t)].w ? node[L(t)].w : node[R(t)].w;
}
int main()
{
//freopen("data.in", "r", stdin);
int h, n, i, b;
while(~scanf("%d%d%d", &h, &w, &n))
{
if(h > n) h = n; //注意這里,如果h>n則n以后的數都更新不到,最大建樹建到n就可以。
creat(1, 1, h);
for(i = 1; i <= n; i++)
{
scanf("%d", &b);
ans = 0;
updata(1, b);
printf("%d\n", ans ? ans : -1);
}
}
return 0;
}
?????????????????
總結
以上是生活随笔為你收集整理的HDU_2795 Billboard(线段树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杏子用什么催熟,摘下来的青杏子如何催熟
- 下一篇: 0207.Domino R8.0.x群集