一开始用cout,cin超时了,后来改成scanf,printf就过了
方法是每次找一个最靠近左边的最大值就行了,update和query可以合并到一块处理
#include <iostream> #include<stdio.h> #include<string.h> #include<vector> #include<algorithm> #include<queue> using namespace std; const int maxn=222222; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int sum[maxn<<2],h,w; //int a[maxn]; void PushUp(int rt){ sum[rt]=max(sum[rt<<1],sum[rt<<1|1]); } void build(int l,int r,int rt){ sum[rt]=w;//所有的节点最开始都是w长度 if(l==r) return ; int m=(l+r)>>1; build(lson); build(rson); } void update(int p,int l,int r,int rt){ if(l==r){ sum[rt]=w; return ; } int m=(l+r)>>1; if(p<=m) update(p,lson); else update(p,rson); PushUp(rt); } int query(int p,int l,int r,int rt){ if(l==r){ sum[rt]-=p; return l; } int m=(l+r)>>1; int ret=(sum[rt<<1]>=p)?query(p,lson):query(p,rson);//左边优先,如果不行才换右边 PushUp(rt); return ret; } int main(){ //freopen("aaa.txt","r",stdin); int n; while(cin>>h>>w>>n){ if(h>n) h=n; build(1,h,1); //int ans=0; int tmp; for(int i=0;i<n;i++){ scanf("%d",&tmp); if(tmp>sum[1]) puts("-1");//如果超过最大值,就不可能了 else printf("%d\n",query(tmp,1,h,1)); } } return 0; }