http://acm.hdu.edu.cn/showproblem.php?pid=2795
下午做的题,线段树单点更新
广告牌高h宽w,尽可能在高处挂广告。注意h可能很大,但是我们注意到h比n大就没有意义了,这时我们让h=n(开始因为这个re了)
View Code
#include <iostream> using namespace std ; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn=200002 ; int h,w,n ; int MAX[maxn<<2] ; void pushup(int rt) { MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]) ; } void build(int l,int r,int rt) { MAX[rt]=w ; if(l==r) return ; int m=(l+r)>>1 ; build(lson) ; build(rson) ; } int query(int p,int l,int r,int rt) { if(l==r) { MAX[rt]-=p ; return l ; } int m=(l+r)>>1 ; int ans ; if(MAX[rt<<1]<p) ans=query(p,rson) ; else ans=query(p,lson) ; pushup(rt) ; return ans ; } int main() { while(~scanf("%d%d%d",&h,&w,&n)) { if(h>n) h=n ; build(1,h,1) ; int wi ; for(int i=0;i<n;i++) { scanf("%d",&wi) ; if(MAX[1]<wi) puts("-1") ; else printf("%d\n",query(wi,1,h,1)) ; } } return 0 ; }