データ構造線分樹HDU 2795 Billboard(単点更新)

1260 ワード

h**wの広告板があります.今はn回の広告を追加したいです.各広告の幅は全部1で、しかも横に置くしかないです.順次各広告の長さxを入力して、広告がどの行に挿入されているかを聞きます.出力-1は挿入できません.
解法:線分樹、単点更新、残りのところの最大値を返します.udateはそのままqueryで行います.
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N=222222;
//           
//n          ,   n        h  
//   h    ,     2X10^5,  10^9
int Max[N<<2]; 
int h,w,n;
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(l,m,rt<<1);
	build(m+1,r,rt<<1|1);
}
int query(int x,int l,int r,int rt){
	//x      
	if(l==r){
		Max[rt]-=x;
		return l;//      
	}
	int m=(l + r)>>1;
	int ret=0;
	//        x ,    
	if(Max[rt<<1]>= x)
		ret=query(x,l,m,rt<<1);
	else ret=query(x,m+1,r,rt<<1|1);
	PushUP(rt);
	return ret;
}
int main()
{
	while(~scanf("%d%d%d",&h,&w,&n))
	{
		// n       ,h   
		// n       h             
		if(h>n) h=n;
		build(1,h,1);
		while(n--)
		{
			int x;
			scanf("%d",&x);
			// Max[1]          
			if(Max[1]