为什么预处理答案的一个写法差异导致 WA?
查看原帖
为什么预处理答案的一个写法差异导致 WA?
488448
py_practice楼主2024/8/29 19:19

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;
}
2024/8/29 19:19
加载中...