日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU_2795 Billboard(线段树)

發布時間:2024/9/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(线段树)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。