公告栏(线段树维护)

题意说明:

解题说明:~

AC代码;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=2*1e5+10;
int s[(MAXN<<2)+10],n,m,w,ans;
void modify(int p,int l,int r,int x,int v){
    if(l==r){
        s[p]=v;
        return;
    }
    int mid=(l+r)/2;
    if(x<=mid)modify(p<<1,l,mid,x,v);
    else modify((p<<1)+1,mid+1,r,x,v);
    s[p]=max(s[p<<1],s[(p<<1)+1]);
    return;
}
bool query(int p,int l,int r,int v){
	 if(s[p]<v)return false;
     while(l<r){
        int mid=(l+r)/2;
        if(s[p<<1]>=v){
            r=mid;
            p<<=1;
            continue;
        }
        else {
            if(s[(p<<1)+1]<v)return false;
            else {
                l=mid+1;
                p=(p<<1)+1;
            }
        }
     }
     ans=l;
     if(l>=r&&s[p]>=v){
        modify(1,1,min(n,w),l,s[p]-v);
        return true;
     }
     else return false;
}
int main(){
   scanf("%d%d%d",&n,&m,&w);
   for(int i=1;i<=(MAXN<<2);i++){
      s[i]=m;
   }
   int ip;
   for(int i=1;i<=w;i++){
      scanf("%d",&ip);
      if(query(1,1,min(w,n),ip)){
        printf("%d\n",ans);
      }
      else puts("-1");
   }
  return 0;
}

猜你喜欢

转载自blog.csdn.net/zxk_hi/article/details/80376938