HDU - 2795 빌 보드 선분 트 리 | 트 리 배열

제목 링크:http://acm.hdu.edu.cn/showproblem.php?pid=2795
           제목: h * w 판 보 를 드 리 고 1 * w 포스터 를 차례대로 드 리 겠 습 니 다. 각 포스터 는 맨 위 에 놓 고 각 포스터 의 위 치 를 물 어보 세 요.
       선분 트 리 의 단일 업데이트, 각 단락 의 최 장 길 이 를 기록 하면 됩 니 다. 그리고 우선 상단 에 문의 하 십시오.
       My code: 
//STATUS:C++_AC_2234MS_2300KB  
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>
#include<queue>
#include<math.h>
#include<map>
#include<set>
using namespace std;
#define LL __int64
#define pii pair<int,int>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int MAX=200010,INF=200000000;
const double esp=1e-6;
int max(int x,int y){return x>y?x:y;}
void build(int l,int r,int rt);
int update(int l,int r,int rt);
int ret[MAX<<2];
int h,w,n,wi;
int main()
{
//	freopen("in.txt","r",stdin);
	while(~scanf("%d%d%d",&h,&w,&n))
	{
		if(h>n)h=n;
		build(1,h,1);
		while(n--)
		{
			scanf("%d",&wi);
			if(ret[1]>=wi)
				printf("%d
",update(1,h,1)); else printf("-1
"); } } return 0; } void build(int l,int r,int rt) { ret[rt]=w; if(l==r)return; int mid=(l+r)>>1; build(lson); build(rson); } int update(int l,int r,int rt) { if(l==r){ ret[rt]-=wi; return l; } int mid=(l+r)>>1,ans; if(ret[rt<<1]>=wi) ans=update(lson); else ans=update(rson); ret[rt]=max(ret[rt<<1],ret[rt<<1|1]); return ans; }

좋은 웹페이지 즐겨찾기