99 pts 求条
查看原帖
99 pts 求条
941431
Autream楼主2024/10/25 08:21

最后一个 hack 过不了

// Problem: P2538 [SCOI2008] 城堡
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2538
// Memory Limit: 128 MB
// Time Limit: 800000 ms
// Date: 2024/10/24 20:56:00
// Author: Li_Feiy

#include <bits/stdc++.h>
#define arrout(a, n) rep(i, 1, n) printk(a[i])
#define arrin(a, n) rep(i, 1, n) a[i] = read()
#define rep(i, x, n) for(int i = x; i <= n; i++)
#define dep(i, x, n) for(int i = x; i >= n; i--)
#define erg(i, x) for(int i = head[x]; i; i = e[i].nex)
#define dbg(x) std::cout << #x << ":" << x << " "
#define mem(a, x) memset(a, x, sizeof a)
#define all(x) x.begin(), x.end()
#define arrall(a, n) a + 1, a + 1 + n
#define PII std::pair<int, int>
#define m_p std::make_pair
#define u_b upper_bound
#define l_b lower_bound
#define p_b push_back
#define CD const double
#define CI const int
#define int long long
#define il inline
#define ss second
#define ff first
#define itn int
int read() {
	char ch = getchar();
	int r = 0, w = 1;
	while(ch < '0' || ch > '9') w = ch == '-' ? -1 : w, ch = getchar();
	while(ch >= '0' && ch <= '9') r = (r << 3) + (r << 1) + (ch ^ 48), ch = getchar();
	return r * w;
}

void print(int x) {
	if(x < 0) putchar('-'), x = -x;
	if(x >= 10) print(x / 10);
	putchar(x % 10 + '0');
} template<typename ...Args>
void print(int t, Args... args) { print(t), print(args...); }

void printl(int x) { print(x), putchar('\n'); }
template<typename ...Args>
void printl(int t, Args... args) { printl(t), printl(args...); }

void printk(int x) { print(x), putchar(' '); }
template<typename ...Args>
void printk(int t, Args ... args) { printk(t), printk(args...); }

CI N = 55;
int n, m, k, tot, ans, c[N], mk[N], id[N], mi[N], vis[N], dis[N][N], head[N];
struct edge {
	int to, nex, data;
} e[N << 1];
struct node {
	int to, dis;
	bool operator<(const node& b) const { return dis > b.dis; }
};
void add(int x, int y, int z) {
	e[++tot].to = y;
	e[tot].data = z;
	e[tot].nex = head[x];
	head[x] = tot;
}
void dijkstra(int st, int id) {
	std::priority_queue<node> q;
	mem(dis[id], 0x3f);
	q.push((node){st, 0});
	dis[id][st] = 0;
	while(!q.empty()) {
		auto u = q.top();
		q.pop();
		int x = u.to;
		if(dis[id][x] != u.dis) continue;
		erg(i, x) {
			int y = e[i].to, z = e[i].data;
			if(dis[id][y] > dis[id][x] + z) dis[id][y] = dis[id][x] + z, q.push((node){y, dis[id][y]});
		}
	}
}
int calc() {
	int val = 0;
	mem(mi, 0x3f);
	rep(i, 1, k) vis[id[i]] = 1;
	rep(i, 1, n) if(vis[i]) rep(j, 1, n) if(!vis[j]) mi[j] = std::min(mi[j], dis[i][j]);
	rep(i, 1, n) if(!vis[i]) val = std::max(val, mi[i]);
	rep(i, 1, k) vis[id[i]] = 0;
	return val;
}
void SA() {
	double t = 1000, tk = 1e-6, d = 0.997;
	while(t > tk) {
		while((double)clock() / CLOCKS_PER_SEC > 0.795) print(ans), exit(0);
		int x = rand() % id[0] + 1, y = rand() % id[0] + 1;
		std::swap(id[x], id[y]);
		int now = calc(), delta = now - ans;
		if(delta < 0) ans = now;
		else if(exp(-delta / t) * RAND_MAX < rand()) std::swap(id[x], id[y]);
		t *= d;
	}
}
signed main() {
	srand(19260817);
	srand(rand());
	srand(rand());
	n = read(), m = read(), k = read();
	arrin(mk, n);
	rep(i, 1, n) {
		int z = read();
		add(i, mk[i] + 1, z), add(mk[i] + 1, i, z);
	}
	rep(i, 1, n) dijkstra(i, i);
	rep(i, 1, m) vis[read() + 1] = 1;
	rep(i, 1, n) if(!vis[i]) id[++id[0]] = i;
	rep(i, 1, k) vis[id[i]] = 1;
	ans = calc();
	rep(i, 1, k) vis[id[i]] = 0;
	while(1) SA();
	print(ans);
	return 0;
}
2024/10/25 08:21
加载中...