HDU 2795 Billboard(线段树-水题,模板题)

来源:互联网 发布:浪拍云的淘宝人生 编辑:程序博客网 时间:2024/06/05 02:40
#include <iostream>#include <cstdio>#include <fstream>#include <algorithm>#include <cmath>#include <deque>#include <vector>#include <queue>#include <string>#include <cstring>#include <map>#include <stack>#include <set>#include <list>#define INF 0x3f3f3f#define maxn 200000 + 50#define juzheng 300#define ll long longusing namespace std;//Date:2017-9-6//Author:HarryBlackCatstruct xx {    int left;    int right;    int val;} tree[maxn + maxn + maxn + maxn];int h,w,n,arr[maxn + 1000],ans;void bulid_tree(int node,int left,int right) {//每个节点为,各区间的最大长度     tree[node].left = left;    tree[node].right = right;    if(left == right)        tree[node].val = w;//初始化为w     else {        int mid = (left + right) / 2;        bulid_tree(node * 2,left,mid);        bulid_tree(node * 2 + 1,mid + 1,right);        tree[node].val = max(tree[node * 2].val,tree[node * 2 + 1].val);    }}void add(int node,int val) {    if(tree[node].left == tree[node].right) {         ans = tree[node].left;//找到最左最上的行数         tree[node].val -= val;//更新剩余的长度         return;    }     else {        if(tree[node * 2].val >= val)            add(node * 2,val);        else if(tree[node * 2 + 1].val >= val)            add(node * 2 + 1,val);        tree[node].val = max(tree[node * 2].val,tree[node * 2 + 1].val);//求区间最长长度     }}int main() {    while(~scanf("%d %d %d",&h,&w,&n)) {        if(h > n)//当h大于n时无意义             h = n;        bulid_tree(1,1,h);        for(int i = 1; i <= n; i++)            scanf("%d",&arr[i]);        for(int i = 1; i <= n; i++){            if(tree[1].val >= arr[i]){//如果总区间都大于第i个公告,搜索得到合适的行数                 add(1,arr[i]);                printf("%d\n",ans);            }            else//否则直接输出-1                 printf("-1\n");        }        }    return 0;}