ACM ICPC 2008–2009, NEERC, Northern Subregional Contest: B. Billboard
题目链接:
B 题思路
查询 暴力 一定是会超时的, 所以肯定用树状数组或者 线段树进行 logn 级别的查询。
但是题目又想要求满足, 在满足的情况下尽可能的选择前面, 用线段树 维护, 得到的
就是答案;
【code】
#include <iostream>
#include <bits/stdc++.h>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid + 1,r
typedef long long ll;
const int MAXN=3e5+5;
const int INF=0x3f3f3f3f;
using namespace std;
ll add[MAXN<<2],sum[MAXN<<2];
int n;
int w,h,ans;
void PushUP(int rt)
{
sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
void build(int rt,int l,int r)
{
if(l==r)
{
// sum[rt]=w;
return ;
}
else
{
int mid=(l+r)>>1;
build(lson);
build(rson);
PushUP(rt);
}
}
void update(int rt,int l,int r,int L,int R)
{
//cout<<rt<<" "<<sum[rt]<<endl;
if(sum[rt]<R || ans!=-1)
return ;
if(l==r)
{
sum[rt]-=R;
ans=l;
return ;
}
int mid=(l+r)>>1;
update(lson,L,R);
update(rson,L,R);
PushUP(rt);
return;
}
int main()
{
freopen("billboard.in","r",stdin);
freopen("billboard.out","w",stdout);
cin>>h>>w>>n;
for(int i=0;i<4*min(h,n);i++)
{
sum[i]=w;
}
build(1,1,min(h,n));
for(int i=1;i<=n;i++)
{
ans=-1;
int x;
cin>>x;
if(x<=w)
update(1,1,min(h,n),i,x);
cout<<ans<<endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}
岂曰无衣?与子同袍。王于兴师,修我戈矛。与子同仇!
岂曰无衣?与子同泽。王于兴师,修我矛戟。与子偕作!
岂曰无衣?与子同裳。王于兴师,修我甲兵。与子偕行!

浙公网安备 33010602011771号