【线段树】 HDOJ 2795 Billboard

来源:互联网 发布:校外mac连不上知网 编辑:程序博客网 时间:2024/05/22 08:25

简单的线段树,线段树记录每一条线段中的最大值,不能记录线段中剩余的和。。。。。

#include <iostream>#include <sstream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <climits>#define maxn 200005#define eps 1e-6#define mod 200000007#define INF 99999999#define lowbit(x) (x&(-x))#define lson o<<1, L, mid#define rson o<<1 | 1, mid+1, Rtypedef long long LL;using namespace std;LL segtree[maxn<<2];LL h, w, n;LL ans, ok;LL cnt;void pushup(LL o){segtree[o]=max(segtree[o<<1], segtree[o<<1 | 1]);}void build(LL o, LL L, LL R){if(L==R){segtree[o]=w;return;}LL mid=(R+L)>>1;build(lson);build(rson);pushup(o);}void updata(LL o, LL L, LL R){if(segtree[o]<cnt) return;if(L==R){ans=L;ok=1;segtree[o]-=cnt;return;}LL mid=(R+L)>>1;if(segtree[o<<1]>=cnt) updata(lson);else updata(rson);pushup(o);}void solve(void){while(n--){scanf("%I64d",&cnt);ok=0;updata(1, 1, h);if(ok) printf("%I64d\n", ans);else printf("-1\n");}}int main(void){while(scanf("%I64d%I64d%I64d",&h,&w,&n)!=EOF){if(h>n) h=n;build(1, 1, h);solve();}return 0;}


0 0
原创粉丝点击