标签:
题意:有一块矩形板,依次给定高,宽,和要贴的广告条的数量。广告条的高度都是1,宽度依次给定。
问:假设我们先按照从最上边开始贴,再按照从左边开始贴的顺序贴广告条,输出每条广告条应当贴在哪一行。如果不能贴上,输出-1
思路:将广告条的行数看作线段树的元素(这里有坑,因为题目所给的10^9次方是不能被记录下来的,但是最多只有200000张纸条所以最多也只有这么多行)。记录每个区间可贴的最长的广告条。
#include<stdio.h> #include<iostream> using namespace std; int h,w,n,tmp; bool ok; int max(int a,int b) { if(a>b) return a; return b; } struct tr { int l,r,num; }; tr me[200000<<2]; void build(int s,int e,int k) { me[k].l=s; me[k].r=e; me[k].num=w; if(s==e) { return; } int m=(s+e)>>1; build(s,m,k<<1); build(m+1,e,k<<1|1); } void ans(int k) { if(me[k].num<tmp||(!ok)) return; if(me[k].l==me[k].r&&ok) { printf("%d\n",me[k].l); ok=0; me[k].num-=tmp; return; } ans(k<<1); ans(k<<1|1); me[k].num=max(me[k<<1].num,me[k<<1|1].num); } void solve() { ok=1; scanf("%d",&tmp); ans(1); if(ok) printf("-1\n"); } int main() { while(scanf("%d%d%d",&h,&w,&n)!=EOF) { h=h<n?h:n; build(1,h,1); for(int i=1;i<=n;i++) { solve(); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/tun117/p/4525800.html