`
v5browser
  • 浏览: 1137606 次
社区版块
存档分类
最新评论

线段树练习[单点更新] HUD 2795 Billboard

 
阅读更多

题目大意:有一个h*w的公告榜,可以依次在上面添加信息。每个信息的长度为x,高为1.

优先在最上面加入,如果空间足够的话,然后优先放在最左面。统计每条公告最终的位置,即它所在的行数。

这里是线段树来存储当前区间(i,j)的所有位置,剩余的最大空间。 初始化即为w,公告榜的宽。


Problem Description
At the entrance to the university, there is a huge rectangular billboard of size h*w (h is its height and w is its width). The board is the place where all possible announcements are posted: nearest programming competitions, changes in the dining room menu, and other important information.

On September 1, the billboard was empty. One by one, the announcements started being put on the billboard.

Each announcement is a stripe of paper of unit height. More specifically, the i-th announcement is a rectangle of size 1 * wi.

When someone puts a new announcement on the billboard, she would always choose the topmost possible position for the announcement. Among all possible topmost positions she would always choose the leftmost one.

If there is no valid location for a new announcement, it is not put on the billboard (that's why some programming contests have no participants from this university).

Given the sizes of the billboard and the announcements, your task is to find the numbers of rows in which the announcements are placed.

Input
There are multiple cases (no more than 40 cases).

The first line of the input file contains three integer numbers, h, w, and n (1 <= h,w <= 10^9; 1 <= n <= 200,000) - the dimensions of the billboard and the number of announcements.

Each of the next n lines contains an integer number wi (1 <= wi <= 10^9) - the width of i-th announcement.

Output
For each announcement (in the order they are given in the input file) output one number - the number of the row in which this announcement is placed. Rows are numbered from 1 to h, starting with the top row. If an announcement can't be put on the billboard, output "-1" for this announcement.

Sample Input
3 5 5 2 4 3 3 3

Sample Output
1 2 1 3 -1


#include <iostream>
#include <stdio.h>
using namespace std;

int tree[1000000]; // 记录当前区间所有位置,剩余的最大空间
int h,w,n,t;

int max(int a,int b){
    return a > b ? a : b;
}
void build(int l,int r,int k) {
    tree[k] = w;
    if (l == r) return ;
    int m = (l + r) >> 1;
    build(l,m,k*2);
    build(m+1,r,k*2+1);
}
void update(int t,int l, int r, int k){
    if(t > tree[k]){ // 如果当前无法加入,就直接返回
        printf("-1\n");
        return;
    }
    if(l == r){ //说明找到了合适位置可加入。
        printf("%d\n", l);
        tree[k] -= t;
        return;
    }
    int m = (l+r)/2;
    if(t <= tree[k*2])
        update(t, l, m, k*2);  //优先加入左子树,即上面
    else if(t <= tree[k*2+1])
        update(t, m+1, r, k*2+1);
    tree[k] = max(tree[k*2], tree[2*k+1]);
}

int main() {
	freopen("in.txt", "r" ,stdin);
    while(scanf("%d %d %d", &h, &w, &n) != EOF){
        if(h > n)
            h = n;
        build(1,h,1);
        while(n--){ //更新
           scanf("%d", &t);
            update(t, 1, h ,1);
        }
    }
    return 0;
}


分享到:
评论

相关推荐

    线段树区间更新code

    线段树区间更新代码线段树区间更新代码线段树区间更新代码线段树区间更新代码

    线段树函数

    线段树的几个主要函数,包括线段树的单点更新以及成段更新

    线段树的一种实现

    一种简单的线段树的实现 ,基础功能比较完善

    点节点更新线段树

    可移植代码,用于单点更新,内有代码移植及运用的详解

    pascal区间线段树

    一个讲述线段树的好资料,这里主要是程序部分,希望对广大成员能够有所帮助

    acm程序设计竞赛_培训_线段树

    浙江大学_acm程序设计竞赛_培训_线段树浙江大学_acm程序设计竞赛_培训_线段树浙江大学_acm程序设计竞赛_培训_线段树浙江大学_acm程序设计竞赛_培训_线段树浙江大学_acm程序设计竞赛_培训_线段树浙江大学_acm程序设计...

    几道经典线段树题目及代码

    线段树、线段树啊、线段树,线段树啊、线段树

    线段树模板

    线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的...

    线段树.pdf

    线段树完全版,涉及到线段树的所有用法。 包括单点更新(增减,替换),区间求和,区间最值。 区间求最大值的位置。 成段更新(延迟标记,增减)。 离散化 扫描线

    线段树高级数据结构实现

    线段树点更新

    线段树ppt的好东东

    线段树ppt,线段树ppt,线段树ppt,树ppt,线段树ppt,线段树ppt,

    线段树六题

    著名的线段树六题 囊括线段树整个知识点, 十分实用 当年凭借此六题, NOIP+NOI秒杀线段树题

    线段树动态问题

    如何解决动态范围求和问题,如何简单地了解线段树。 附有模板以及习题

    权值线段树和主席树入门

    权值线段树和主席树入门PPT,权值线段树,顾名思义就是记录权值的线段树,普通的线段树直接以坐标为l,r建树,而权值线段树是以大小来建树,树上寸的信息是该权值的数量,而通过建树时二分从小到大的性质,可以用这...

    线段树乘法模板(从基础线段树扩展)

    线段树(Segment Tree)是一种强大的数据结构,特别适用于处理区间查询和更新问题。本资源不仅提供了线段树的基础模板,还特别包含了线段树乘法操作的实现,进一步扩展了线段树的应用范围。 核心特性: 基础与进阶...

    线段树初步(C++)

    讲解线段树基本应用,适合初学者下载使用!

    线段树学习ppt

    线段树学习ppt

    线段树完整版

    ACM学习中 涉及到线段树的代码分析模板

    线段树(单点查询+区间求和)无lazy标记

    原理就大概如图所示,线段树的每个节点都是原数组的一段区间和,而叶子节点就是原数组对应 的值 建树代码: void build(int p,int lf,int rt){//建树 ans[p]=0; if(lf==rt) { ans[p]=A[lf]; return ; } int mid...

    线段树模板 zoj1128

    本资源是对线段树操作比较完整的操作,包括线段树的动态插入,动态删除和维护,可以查询区段的最大值,最小值,完成线段树的基本操作。

Global site tag (gtag.js) - Google Analytics