hdu 4614 線段樹 二分

2021-07-22 09:11:05 字數 1416 閱讀 8691

題意:n個花瓶,m個操作,花瓶裡面有的有花,有的是空的。1操作是從a開始往右放b朵花,花瓶有了的不放,跳過,直到a右邊都放滿了花,多餘的扔了。輸出本次放花的起始位置

求和操作可以用線段樹解決,操作1的放置的起始位置,通過二分求就可以

#include #include #include #include #include #define rep(i, j, k) for(int i = j; i <= k; i++)

#define maxn 100009

using namespace std;

int n, m, a[maxn * 8], is[8 * maxn];

void build (int x, int l, int r)

int mid = (l + r) >> 1;

build (2 * x, l, mid);

build (2 * x + 1, mid + 1, r);

a[x] = a[2 * x] + a[2 * x + 1];

is[x] = -1;

return;

}int ask (int x, int l, int r, int la, int ra)

int mid = (l + r) >> 1;

if (is[x] != -1)

return ask (2 * x, l, mid, la, ra) + ask (2 * x + 1, mid + 1, r, la, ra);

}void set (int x, int l, int r, int la, int ra, int color)

int mid = (l + r) >> 1;

if (is[x] != -1)

set (2 * x, l, mid, la, ra, color);

set (2 * x + 1, mid + 1, r, la, ra, color);

a[x] = a[2 * x] + a[2 * x + 1];

}void print (int x, int l, int r)

void debug ()

int main ()

int l = x, r = n;

while (l <= r)

/*if (max <= y)

*///last

l = l, r = n;

while (l <= r)

printf ("%d %d\n", l - 1, r - 1);

set (1, 1, n, l, r, 0);

//printf ("ask ------ %d\n", ask (1, 1, n, l, r));

}else

}printf ("\n");

} return 0;

}

hdu 4614 線段樹 二分

這題感覺有點坑,陣列越界了,看來以後陣列要盡可能的開大一些了。include include include include include using namespace std define maxn 60005 struct ee tree maxn 4 int n,m void build ...

HDU 4614(線段樹 二分)

題目 click 題意 操作是1,則從a開始插花f個,多了丟棄,沒有瓶子可放則輸出。2的話,區間內的所有花丟出。用二分去確定操作1中的起始位置以及終止位置,其他的線段樹維護。include include include include include include include include...

hdu4614 二分 線段樹

題意 給你1 n的花瓶 剛開始全是空的,現在有兩種操作,1 從花瓶a開始插入b朵花 如果不能插進去 輸出字串 否則輸出最多插入的起點和終點 結構體陣列num i 表示節點i空瓶的數目 線段樹 開始deal函式對整個樹初始化,update 更新函式 find 查詢區間有多少個空瓶 對於操作1 關鍵點是...