社区讨论

悬5+关

P11673[USACO25JAN] Median Heap G参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mlkw8dv3
此快照首次捕获于
2026/02/13 20:58
6 天前
此快照最后确认于
2026/02/14 13:36
5 天前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q;
int a[200005],c[200005];
int dp[200005][3];
struct ph{
	int p,a;
}h[200005];
struct edge2{
	int p,m,ans;
}w[200005];
bool cmp1(ph x,ph y){
	return x.a<y.a;
}
bool cmp2(edge2 x,edge2 y){
	return x.m<y.m;
}
bool cmp3(edge2 x,edge2 y){
	return x.p<y.p;
}
int zws(int a,int b,int c){
	return a+b+c-max({a,b,c})-min({a,b,c});
}
void ch(int x,int m){
	dp[x][0]=1e18,dp[x][1]=1e18,dp[x][2]=1e18;
	int dpc0=(a[x]<m)?(0):(c[x]);
	int dpc1=(a[x]==m)?(0):(c[x]);
	int dpc2=(a[x]>m)?(0):(c[x]);
	if(x*2>n&&x*2+1>n){
		dp[x][0]=dpc0;
		dp[x][1]=dpc1;
		dp[x][2]=dpc2;
		return;
	}
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			for(int k=0;k<3;k++){
				if(zws(i,j,k)==i){
					if(i==0) dp[x][i]=min(dp[x][i],dp[x*2][j]+dp[x*2+1][k]+dpc0);
					if(i==1) dp[x][i]=min(dp[x][i],dp[x*2][j]+dp[x*2+1][k]+dpc1);
					if(i==2) dp[x][i]=min(dp[x][i],dp[x*2][j]+dp[x*2+1][k]+dpc2);
				}
			}
		}
	}
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>c[i];
		dp[i][0]=1e18,dp[i][1]=1e18,dp[i][2]=1e18;
		h[i].p=i,h[i].a=a[i];
	}
	sort(h+1,h+n+1,cmp1);
	cin>>q;
	for(int i=1;i<=q;i++){
		cin>>w[i].m;
		w[i].p=i; 
	}
	sort(w+1,w+q+1,cmp2);
	for(int i=n;i>=1;i--){
		ch(i,w[1].m);
	}
	w[1].ans=dp[1][1];
	int cnt1=1,cnt2=1;
	for(int i=2;i<=q;i++){
		for(;cnt1<=n&&h[cnt1].a<w[i].m;cnt1++){
			for(int x=h[cnt1].p;x;x>>=1){
				ch(x,w[i].m);
			}
		}
		for(;cnt2<=n&&h[cnt2].a<=w[i].m;cnt2++){
			for(int x=h[cnt2].p;x;x>>=1){
				ch(x,w[i].m);
			}
		}	
		w[i].ans=dp[1][1];	
	}
	sort(w+1,w+q+1,cmp3);
	for(int i=1;i<=q;i++){
		cout<<w[i].ans<<endl;
	}
	return 0;
}

回复

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

正在加载回复...