社区讨论

求卡常喵QAQ

P14827吃吃饱参与者 9已保存回复 19

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
18 条
当前快照
1 份
快照标识符
@mjfms7ug
此快照首次捕获于
2025/12/21 19:15
2 个月前
此快照最后确认于
2025/12/24 14:00
2 个月前
查看原帖
赛事 2h2h 卡常卡不出来
心态炸了QAQ
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=6e5+10,inf=0x3f3f3f3f3f3f3f;

ll n,q,x0,x,qst[N],qstb[N],a[N][2],b[N][2],dp[N];
ll tung[N],tot;

struct sgt{
	
	sgt *ls,*rs;
	ll l,r,mi;
	
	inline sgt(ll lx,ll rx):l(lx),r(rx),mi(inf){
		
		if(l==r){
			
			ls=rs=nullptr;
			return;
		}
		
		ll mid=(lx+rx)>>1;
		
		ls=new sgt(lx,mid),rs=new sgt(mid+1,rx);
		return;
	}
	
	inline void push_up(){
		
		mi=min(ls->mi,rs->mi);
		return;
	}
	
	inline void update(ll x,ll k){
		
		if(l>x||r<x) return;
		if(l==r&&l==x){
			
			mi=min(mi,k);
			return;
		}
		
		if(ls->r>=x) ls->update(x,k);
		else rs->update(x,k);
		
		push_up();
		
		return;
	}
	
	inline ll querymin(ll x,ll y){
		
		if(l>y||r<x) return inf;
		if(l>=x&&r<=y) return mi;
		
		return min(ls->querymin(x,y),rs->querymin(x,y));
	}
};

int main(){
	
	ios::sync_with_stdio(0),cin.tie(0);
	
	cin>>n>>q>>x0;
	for(int i=1;i<=n;i++){ 
		
		cin>>a[i][0]>>a[i][1];
		
		tung[++tot]=a[i][0];
		tung[++tot]=a[i][1];
	}
	for(int i=1;i<=q;i++) cin>>qst[i],tung[++tot]=qst[i];
	
	sort(tung+1,tung+1+tot);
	tot=unique(tung+1,tung+1+tot)-tung-1;
	
	for(int i=1;i<=n;i++){
		
		b[i][0]=lower_bound(tung+1,tung+1+tot,a[i][0])-tung;
		b[i][1]=lower_bound(tung+1,tung+1+tot,a[i][1])-tung;
	}
	for(int i=1;i<=q;i++) qstb[i]=lower_bound(tung+1,tung+1+tot,qst[i])-tung;
	
	auto left=new sgt(1,tot);
	auto right=new sgt(1,tot);
	
	for(int i=1;i<=n;i++){
		
		dp[i]=min(abs(x0-a[i][0]),abs(x0-a[i][1]));
		
		ll op=a[i][0]+left->querymin(1,b[i][0]);
		op=min(op,right->querymin(b[i][0],tot)-a[i][0]);
		op=min(op,a[i][1]+left->querymin(1,b[i][1]));
		op=min(op,right->querymin(b[i][1],tot)-a[i][1]);
		
		dp[i]=min(dp[i],op);
		
		left->update(b[i][0],dp[i]-a[i][0]);
		left->update(b[i][1],dp[i]-a[i][1]);
		right->update(b[i][0],dp[i]+a[i][0]);
		right->update(b[i][1],dp[i]+a[i][1]);
	}
	
	for(int i=1;i<=q;i++){
		
		ll ans=abs(x0-qst[i]);
		
		ll op=qst[i]+left->querymin(1,qstb[i]);
		op=min(op,right->querymin(qstb[i],tot)-qst[i]);
		
		ans=min(ans,op);
		
		cout<<ans+n-1<<'\n';
	}
	
	return 0;
}

回复

19 条回复,欢迎继续交流。

正在加载回复...