0105 总结

我是什么煞笔玩意儿

A - 过关斩将

多维最短路,记录一下到这个节点是什么状态,如需改变直接 \(+ x\) 即可

煞笔代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n, m, s, t, x;
typedef pair<int, int> pi;
typedef long long ll;
vector<pi> G[N];
void addedge (int u, int v, int w) {
	G[u].push_back({v, w});
	G[v].push_back({u, w});
}
char a[N];
int type[N];
bool vis[N][3];
ll dis[N][3];
void dijkstra (int s, int t) {
	priority_queue< pair<int, pi> , vector< pair<int, pi> >, greater< pair<int, pi> > > q;
	if(type[s]) q.push({0, {s, type[s]}}), dis[s][type[s]] = 0;
	else q.push({0, {s, 1}}), q.push({0, {s, 2}}), dis[s][1] = dis[s][2] = 0;
	while(!q.empty()) {
		int u = q.top().second.first, ty = q.top().second.second;
		q.pop();
		if(vis[u][ty]) continue;
		vis[u][ty] = 1;
		for (auto e : G[u]) {
			int v = e.first, w = e.second, toty = ty;
			if(type[v] && ty != type[v]) w += x, toty = type[v];
			if(dis[u][ty] + w < dis[v][toty]) {
				dis[v][toty] = dis[u][ty] + w;
				q.push({dis[v][toty], {v, toty}});
			}
		}
	}
}

signed main() {
	ios::sync_with_stdio(0);
	int T;
	cin >> T;
	while(T --) {
		cin >> n >> m >> s >> t >> x;
		for (int i = 1; i <= n; i ++) {
			dis[i][1] = dis[i][2] = 1e18;
			G[i].clear();
			vis[i][1] = vis[i][2] = 0;
		}
		cin >> (a + 1);
		for (int i = 1; i <= n; i ++) {
			if(a[i] == 'L') type[i] = 1;
			else if(a[i] == 'R') type[i] = 2;
			else type[i] = 0;
		}
		while(m --) {
			int u, v, w;
			cin >> u >> v >> w;
			addedge(u, v, w);
		}
		dijkstra(s, t);
		cout << min(dis[t][1], dis[t][2]) << endl;

	}
	return 0;
}

B - 翻转游戏

这个 *** 赛时连 NO 的情况都没想出来
赛后听 LHY 讲,半懂不懂的。

\(\mathtt{TAG}: 构造\)

NO

显然当 \(k \bmod 2 = 0(k \ne 0)\) 时无解。

因为第一次一定会翻一次 \(1\),你要么翻 \(1\),要么翻 \(0\),都会让 \(1\) 的数量变为奇数,然后你怎么凑都凑不出来了。

YES

考虑从全 \(0\) 串翻到 \(1 \dots 10\dots 0\)

人类智慧构造法:

  • \(k \le \frac{n}{2}\)
    如果前面的可以直接翻完,那么就直接翻。

    否则在后面翻出一段小的 \(1\),然后直接翻转整个 \(1\) 的区间。

  • \(k \le n\)
    zhw 讲得有点抽象。

C - 大模法师

\(\mathtt{TAG}:\) 随机化 / 数学

大模法师果果常用的一种模法需要 \(n\) 个施术单元,每一个单元都拥有初始能量 \(a_i\)。果果可以选择一个正整数 \(m\),尝试释放模为 \(m\) 的模法,这种模法会作用于每一个施术单元,使得它们的能量变为 \(a_i \bmod m\) 。这个模法的精髓在让施术单元的能量值变得尽可能一致,因此,它能够成功发动需要满足:作用后有不少于 \(\lceil \frac{n}{2}\rceil\) 的施术单元能量值相同。

果果想知道,他能成功发动的模最大的模法是多少。由于果果的能力有限,它最多只能尝试发动 \(10^5\) 的模法。

乱搞做法 - BY liduoduo

运用性质

\(x\) 不满足, \(x\) 的倍数均不满足

\(1\) 枚举到 \(\max(a_i)\),不满足就打标记。

然后卡时 + 去重,过了。

可以构造数据,使其卡至 \(\text{O}(n \sqrt{n})\)

真·乱搞

随机化做法 -- BY MikeZ

放弃挣扎了,听不懂力

posted @ 2024-01-06 13:34  固态H2O  阅读(18)  评论(0编辑  收藏  举报