rt。 思路都差不多,打了个set。 然后用lower_bound,RE(还有T的点不知道怎么回事)了。 已知的是lower_bound找到了一个0的点,跳到了begin的位置,但是看数据条件是没有两个球放在一块的情况。 原码在下面,换成数组维护就直接A了。
#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
#define qr qr()
#define ps push_back
#define pa pair<int,int>
#define ve vector
#define fi first
#define se second
using namespace std;
const int N=2e5+200;
const ll INF=0x3fffffffffffffff;
int n,m;
ll pos[N],mn,mx,sum,ans[N];
inline ll qr{
ll x=0;char ch=getchar();bool f=0;
while(ch>57||ch<48)f=(ch=='-')?1:0,ch=getchar();
while(ch>=48&&ch<=57)x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
struct node{
ll l,r,lval,rval;bool op;
bool operator<(const node &A)const{
return l<A.l;
}
};
set<node>t;
void init(){
n=qr;m=qr;
for(int i=1;i<=n;++i)pos[i]=qr;
ll la=0;
for(int i=1;i<=m;++i){
sum+=qr;
if(sum>mx)
la=(mx-mn),mx=sum,
t.insert({la?la+1:la,mx-mn,mx,-mn,1});
else if(sum<mn)
la=(mx-mn),mn=sum,
t.insert({la?la+1:la,mx-mn,mx,-mn,0});
}
for(int i=1;i<n;++i){
ll len=pos[i+1]-pos[i];
auto it=lower_bound(t.begin(),t.end(),(node){len});
// cout<<(it==t.begin())<<' '<<len<<endl;
assert(it!=t.begin());
if(it==t.end()||it->l!=len)--it;
if(it->op&1)ans[i]+=min(len-it->rval,it->lval),ans[i+1]+=it->rval;
else ans[i]+=it->lval,ans[i+1]+=min(len-it->lval,it->rval);
}ans[1]-=mn;
ans[n]+=mx;
for(int i=1;i<=n;++i)
cout<<ans[i]<<'\n';
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
init();
return 0;
}