HDU 2795

线段树递归查询,取最大值建树

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string.h>
#include <queue>
#include <cmath>
#include <map>
#include <vector>
#define LL  __int64
using namespace std;
const int N=200050;
const int root=1;
struct Node {
	int val,left,right;
}tree[N*4];
int h,w,n,wi;
	
void build(int now,int l,int r){
	tree[now].val=w;
	tree[now].left=l;
	tree[now].right=r;
	if(l==r) return ;
	int m=(l+r)/2;
	build(now*2,l,m);
	build(now*2+1,m+1,r);
}

int query(int now,int l,int r){
	if(l==r){
		tree[now].val-=wi;
		return l;
	}
	int m=(tree[now].left+tree[now].right)/2;
	int ret;
	if(wi<=tree[now*2].val){
		ret=query(now*2,l,m);
	}
	else if(wi<=tree[now*2+1].val)
	ret=query(now*2+1,m+1,r);
	tree[now].val=max(tree[now*2].val,tree[now*2+1].val);
	return ret;
}

int main(){
	while(scanf("%d%d%d",&h,&w,&n)!=EOF){
		int l=min(h,n);
		build(root,1,l);
		for(int i=1;i<=n;i++){
			scanf("%d",&wi);
			if(wi>tree[root].val) printf("-1
");
			else{
				printf("%d
",query(root,1,l));
			}
		}
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/jie-dcai/p/4315139.html