板子题:比赛时,思路比较乱…,而且直接抄了个板子,在改的…
代码:
#include <bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define fo1(a,b) for(int a=0;a<b;++a)
#define fo2(a,b) for(int a=1;a<=b;++a)
using namespace std;
const int maxn=5e5+5;
const int mod=1e9+7;
int t[maxn<<2];
void pushup(int k){
t[k]=max(t[k<<1],t[k<<1|1]);
}
void build(int k,int l,int r,int w){
if(l==r)
t[k]=w;
else{
int mid=l+r>>1;
build(k<<1,l,mid,w);
build(k<<1|1,mid+1,r,w);
pushup(k);
}
}
//void update(int p,int v,int l,int r,int k)
//{
// if(l==r)
// a[k]+=v,t[k]+=v;
// else{
// int mid=l+r>>1;
// if(p<=mid)
// update(p,v,l,mid,k<<1);
// else
// update(p,v,mid+1,r,k<<1|1);
// pushup(k);
// }
//}
int query(int L,int R,int l,int r,int k,int tt)
{
int ans=0;
if(l==r){
if(t[k]-tt>=0){
t[k]-=tt;
return l;
}
else
return -1;
}
else{
int mid=l+r>>1;
if(t[k<<1]>=tt)
ans=query(L,R,l,mid,k<<1,tt);
else
ans=query(L,R,mid+1,r,k<<1|1,tt);
pushup(k);
return ans;
}
}
int main()
{
int h,w,n,tt;
while(cin>>h>>w>>n){
build(1,1,min(h,n),w);
fo2(i,n){
scanf("%d",&tt);
cout<<query(1,min(h,n),1,min(h,n),1,tt)<<endl;
}
}
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~分割线 ~~~~~~~~~~~~~~~~~~~~~~~~~~
时间,空间都开的比较大,而且没看清多组输入,WA了4次…
第二天,没看板子又打了一次…
代码:
#include <bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define fo1(a,b) for(int a=0;a<b;++a)
#define fo2(a,b) for(int a=1;a<=b;++a)
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=2e5+5;
const int mod=1e9+7;
int t[maxn<<2];
int h,w,n;
void pushup(int k){
t[k]=max(t[k<<1],t[k<<1|1]);
}
void build(int l,int r,int k){
if(l==r){
t[k]=w;
return ;
}
int mid=l+r>>1;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
pushup(k);
}
int query(int l,int r,int k){
int ans;
if(l==r){
t[k]-=w;
return l;
}
int mid=l+r>>1;
if(t[k<<1]>=w)
ans=query(l,mid,k<<1);
else
ans=query(mid+1,r,k<<1|1);
pushup(k);
return ans;
}
int main()
{
while(~scanf("%d%d%d",&h,&w,&n)){
h=min(h,n);
build(1,h,1);
fo2(i,n){
scanf("%d",&w);
if(w>t[1]){
puts("-1");
}
else
printf("%d\n",query(1,h,1));
}
}
return 0;
}
以后加油!!!!!!!!!!