求助set解法
查看原帖
求助set解法
1313903
SHLKST楼主2024/8/14 12:16

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;
}
2024/8/14 12:16
加载中...