abc350g 根号题,当 g[u].size() >= B 时暴力枚举然后构建 u 相关的答案,即 ans[u][*]。查询 ans 数组的时候也保证了 g[u].size() >= B,为什么会 WA 掉?把 ans[u][*] 和 ans[*][u] 同时存一下,就能 AC 了,实在看不出来哪里错了
这是 AC 代码,把带有 // WA 取消注释, // AC 注释掉,即可得到 WA 代码。
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long LL;
constexpr int N = 1e5 + 10, B = 400;
constexpr int p = 998244353;
int n, q, lstans;
unordered_set<int> g[N];
// vector<int> ans[N]; // WA
map<pair<int, int>, int> ans; // AC
void upd(int u, int v) {
if(g[u].size() == B) {
// ans[u].resize(n + 1); // WA
for(int w : g[u]) for(int v : g[w]) {
// ans[u][v] = w; // WA
ans[{u, v}] = ans[{v, u}] = w; // AC
}
} else if(g[u].size() > B) {
for(int w : g[v]) {
// ans[u][w] = v; // WA
ans[{u, w}] = ans[{w, u}] = v; // AC
}
}
}
void solve()
{
cin >> n >> q;
while(q -- ) {
LL a, b, c; cin >> a >> b >> c;
int op = ((a * (1 + lstans)) % p % 2) + 1;
int u = ((b * (1 + lstans)) % p % n) + 1;
int v = ((c * (1 + lstans)) % p % n) + 1;
if(op == 1) {
g[u].insert(v);
g[v].insert(u);
upd(u, v);
upd(v, u);
} else {
if(g[u].size() > g[v].size()) {
swap(u, v);
}
if(g[u].size() < B) {
int id = 0;
for(int x : g[u]) {
if(g[v].count(x)) {
id = x;
}
}
cout << (lstans = id) << endl;
} else {
// cout << (lstans = ans[u][v]) << endl; // WA
cout << (lstans = ans[{u, v}]) << endl; // AC
}
}
}
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
solve();
return 0;
}