HDU_2795_线段树

来源:互联网 发布:ppt软件下载 编辑:程序博客网 时间:2024/05/16 18:44

题意:h*w的广告牌,每次放一个1*a的广告,且最先放到最上边。线段树的简单题区间查找最大值的位置然后放进去,更新放进后的信息:

#include <cstdio>#include <cstring>using namespace std;const int N = 200000 << 2;int n, h, w;int Max[N];int MAX(int a, int b){    return a>b ? a : b;}void build(int l, int r, int rt){    Max[rt] = w;    if(l == r) return ;    int m = (l+r) >> 1, rtt = rt << 1;    build(l, m, rtt);    build(m+1, r, rtt+1);}int query(int x, int l, int r, int rt){    if(l == r)    {        Max[rt] -= x;        return l;    }    int m = (l+r) >> 1, rtt = rt << 1;    int ret = (Max[rtt]<x) ? query(x, m+1, r, rtt+1) : query(x, l, m, rtt);    Max[rt] =  MAX(Max[rtt], Max[rtt+1]);    return ret;}int main(){    int a;    while(~scanf("%d%d%d", &h, &w, &n))    {        memset(Max, 0, sizeof(Max));        if(h>n) h=n;        build(1, h, 1);        for(int i=0; i<n; ++i)        {            scanf("%d", &a);            if(Max[1] < a)  printf("-1\n");            else            printf("%d\n", query(a, 1, h, 1));        }    }    return 0;}
其它线段树水题:

HDU1754单点替换题解:Here

HDU1166区间最值题解:Here
HDU1394最小逆序数题解:Here

0 0
原创粉丝点击