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
放弃挣扎了,听不懂力