社区讨论

萌新求助 85pts

P8817[CSP-S 2022] 假期计划参与者 1已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lo7luxhw
此快照首次捕获于
2023/10/27 03:56
2 年前
此快照最后确认于
2023/10/27 03:56
2 年前
查看原帖
RT WA on #7 #11 #17
枚举前三大值
CPP
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
struct EDGE{
	int v,last;
}Edge[20005];
ull ans;
int ecnt;
int n,m,k;
ll f[2505];
ll g[2505];
ll s[2505];
int p[2505];
int maxp[2505][5];
int dis[2505][2505];
priority_queue<pi,vector<pi>,greater<pi> > pq;
template<typename T>
inline void input(T &x){
	x=0;char c=getchar();
	while((c<'0'||c>'9')&&c!='-') c=getchar();
	int p=1;if (c=='-') {p=-1;c=getchar();}
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();x*=p;
}
void write(ull x){
	if (x<10){
		putchar((char)(x+'0'));return;
	}
	write(x/10);
	putchar((char)(x%10+'0'));
}
inline void output(ull x,char c){
	write(x);putchar(c);
}
inline ull max(ull a,ull b){
	return a>b?a:b;
}
inline void doit(int st){
	memset(dis[st],0x3f,sizeof(dis[st]));
	dis[st][st]=0;pq.push(make_pair(0,st));
	while(!pq.empty()){
		pi now=pq.top();pq.pop();
		int d=now.first;
		int u=now.second;
		if (d>dis[st][u]) continue;
		for (int i=p[u];i!=-1;i=Edge[i].last){
			int v=Edge[i].v;
			if (d+1<dis[st][v]){
				dis[st][v]=d+1;
				pq.push(make_pair(dis[st][v],v));
			}
		}
	}
}
inline void init(){
	ecnt=0;memset(p,-1,sizeof(p));
}
inline void insert(int u,int v){
	Edge[++ecnt].v=v;
	Edge[ecnt].last=p[u];
	p[u]=ecnt;
}
int main(){
	freopen("holiday.in","r",stdin);
	freopen("holiday.out","w",stdout);
	input(n);input(m);input(k);
	for (int i=2;i<=n;i++){
		input(s[i]);
	}
	init();
	for (int i=0;i<m;i++){
		int u,v;
		input(u);input(v);
		insert(u,v);insert(v,u);
	}
	for (int i=1;i<=n;i++) doit(i);
	for (int u=1;u<=n;u++){
		for (int v=2;v<=n;v++){
			if (v==u) continue;
			if (dis[1][v]<=k+1&&dis[v][u]<=k+1){
				if (s[v]>s[maxp[u][1]]){
					maxp[u][3]=maxp[u][2];
					maxp[u][2]=maxp[u][1];
					maxp[u][1]=v;
				}
				else if (s[v]>s[maxp[u][2]]){
					maxp[u][3]=maxp[u][2];
					maxp[u][2]=v;
				}
				else if (s[v]>s[maxp[u][3]]){
					maxp[u][3]=v;
				}
			}
		}
	}
	for (int b=2;b<=n;b++){
		if (!maxp[b][1]) continue;
		for (int c=2;c<=n;c++){
			if (!maxp[c][1]) continue;
			if (b==c) continue;
			if (dis[b][c]<=k+1){
				ull now=0;
				for (int j=1;j<4;j++){
					for (int k=1;k<4;k++){
						if (maxp[b][j]!=maxp[c][k]&&maxp[b][j]!=c&&maxp[c][k]!=b){
							now=max(now,s[maxp[b][j]]+s[b]+s[c]+s[maxp[c][k]]);
						}
					}
				}
				ans=max(ans,now);
			}
		}
	}
	output(ans,'\n');
	return 0;
}

回复

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

正在加载回复...