hdu2795线段树

xiaoxiao2021-02-28  116

这道题将深度看作高度就可以了。。

struct node {     int l,r;     int value; } tree[N<<2];

每一个叶子的value就是这一行剩余的格子数

树枝的value是它两个叶子的较大value值,这样方便查找

注意递归

构造一颗树就好

#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int N=200005; struct node {     int l,r;     int value; } tree[N<<2]; int h,w,n; void build(int i,int l,int r) {     tree[i].r=r;     tree[i].l=l;     tree[i].value=w;     if(l==r)         return;     int mid=(l+r)/2;     build(i*2,l,mid);     build(i*2+1,mid+1,r); } int qurry(int i,int v) {     if(tree[i].r==tree[i].l)     {         tree[i].value-=v;         return tree[i].r;     }     else     {         int v1=0,v2=0;         int mid=(tree[i].l+tree[i].r)/2;         if(tree[i*2].value>=v)             v1=qurry(i*2,v);         else if(tree[i*2+1].value>=v)             v2=qurry(i*2+1,v);         tree[i].value=max(tree[i*2].value,tree[i*2+1].value);         return v1+v2;     } } int main() {     while(~scanf("%d %d %d",&h,&w,&n))     {         if(h>n)             h=n;         build(1,1,h);         int x,ans;         for(int i=1; i<=n; i++)         {             scanf("%d",&x);             if(x<=tree[1].value)                 printf("%d\n",qurry(1,x));             else                 printf("-1\n");         }     }     return 0; }

转载请注明原文地址: https://www.6miu.com/read-57874.html

最新回复(0)