題意: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 關鍵點是...