CSP-S T1歪解求hack
  • 板块学术版
  • 楼主Satrpx
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/10/31 21:15
  • 上次更新2023/10/27 04:40:41
查看原帖
CSP-S T1歪解求hack
240021
Satrpx楼主2022/10/31 21:15

RT

#include<bits/stdc++.h>

#define x first
#define y second
#define pf push_front
#define pb push_back

#define rep(i,a,b) for(int i=a;i<(int)(b);i++)
#define r0p(i,n) rep(i,0,n)
#define r1p(i,n) rep(i,1,n+1)
#define all(a) a.begin(),a.end()
#define dbg(a) cerr<<#a<<": "<<a<<endl
#define sz(a) (int)(a.size())
#define re(a) cout<<a<<endl,exit(0)

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

const int intmx=0x3f3f3f3f;
const ll llmx=LLONG_MAX-10000ll*INT_MAX;

template <typename T> inline T abs(T a){return a<0?-a:a;}

void IO(string s=""){
	if(!sz(s)) return;
	freopen((s+".in").c_str(),"r",stdin);
	freopen((s+".out").c_str(),"w",stdout);
}

bool stt;

#define N 2505
#define M 10005
#define L 17

int n,m,k;
ll v[N]={0};
ll dp[N][6][L][6]={0};
vector<int>b[N];
vector<int>a[N];
bool ok[N][N]={0};
queue<pair<int,int> >q;

inline void upd(int i,int e,int lev){
	if(lev!=-1&&dp[i][e][lev][0]<dp[i][e][lev+1][0]){
		for(int tmp=0;tmp<=e;tmp++) swap(dp[i][e][lev+1][tmp],dp[i][e][lev][tmp]);
		upd(i,e,lev-1);
	}
}

inline bool conf(int i,int j,int e,int l){
	for(int tmp=1;tmp<=e;tmp++) if(j==dp[i][e][l][tmp]) return 1;
	return 0;
}

void dfs(int st,int i,int dis){
	ok[st][i]=1;
	if(st!=i) a[st].push_back(i);
	if(dis==k) return;
	for(auto j:b[i]) if(!ok[st][j]){
		dfs(st,j,dis+1);
	}
}

struct P40_{
	bool vis[N]={0};
	ll ans=0;
	void dfs(int i,int st,ll res){
		if(st==4){
			if(ok[i][1]) ans=max(ans,res);
			return;
		}
		vis[i]=1;
		for(auto j:a[i]) if(!vis[j]) dfs(j,st+1,res+v[j]);
		vis[i]=0;
	}
	void solve(){
		dfs(1,0,0);
		re(ans);
	}
}P40;

bool edd;

signed main(){
//	cerr<<(&edd-&stt)/1024.0/1024.0<<endl;
//	IO("holiday");
	scanf("%d%d%d",&n,&m,&k);
	rep(i,2,n+1) scanf("%lld",&v[i]);
	r0p(i,m){
		int u,vv;
		scanf("%d%d",&u,&vv);
		b[u].pb(vv);
		b[vv].pb(u);
	}
	r1p(i,n){
		q.push({i,-1});
		ok[i][i]=1;
		while(!q.empty()){
			int j=q.front().x,val=q.front().y;
			q.pop();
			if(val==k) continue;
			for(auto l:b[j]) if(!ok[i][l]){
				ok[i][l]=1;
				a[i].pb(l);
				q.push({l,val+1});
			}
		}
//		dfs(i,i,-1);//check i=i case
		r0p(j,6) r0p(l,L) dp[i][j][l][0]=-1;
	}
	if(n<=50) P40.solve();
	//WA: a-b-a is considered?
	//split point
	dp[1][0][0][0]=0;
	r0p(e,5){
//		dbg(e);
		r1p(i,n) r0p(l,L) if(dp[i][e][l][0]>=0){
			for(auto j:a[i]) if(e==4?j==1:!conf(i,j,e,l)&&dp[j][e+1][L-1][0]<dp[i][e][l][0]+v[j]){
				dp[j][e+1][L-1][0]=dp[i][e][l][0]+v[j];
//				dbg(l);
				for(int tmp=1;tmp<=e;tmp++) dp[j][e+1][L-1][tmp]=dp[i][e][l][tmp];
				dp[j][e+1][L-1][e+1]=j;
				upd(j,e+1,L-2);
			}
		}
	}
	re(dp[1][5][0][0]);
	exit(0);
}
2022/10/31 21:15
加载中...