求调qwq
查看原帖
求调qwq
1147171
Merge_all楼主2025/7/25 23:40

AC*19

WA*34

#include <bits/stdc++.h>
#define int long long
#define mkp(a, b) make_pair(a, b)
using namespace std;
using LL = long long;
using ULL = unsigned long long;
const int N = 4e5 + 10, M = 2e2 + 10, Mod = 998244353;
int n, m, k;
int h[N], e[N], ne[N], idx, nxt[N], id;
bool is[N];
int f[N][M], ans;
bool inq[N][M];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
void add_edge(int u, int v) {
    e[idx] = v, ne[idx] = h[u], h[u] = idx ++;
}
void add(int &x, int y) {
    x += y;
    if(x >= Mod) x -= Mod;
}
int calc(int u, int v) {
    if(u > v) return n - u + v;
    return v - u;
}
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    memset(h, -1, sizeof h);
    cin >> n >> m >> k;
    if(!m) return cout << "1\n", 0;
    for(int i = 1, u, v; i <= m; i ++) {
        cin >> u >> v;
        add_edge(u, v);
        is[u] = is[v] = true;
    }
    for(; id <= n && !is[id]; id ++);
    int i = id;
    for(int j = i + 1; i <= n;) {
        while(j <= n && !is[j]) j ++;
        if(j > n) break;
        for(; i < j; i ++) nxt[i] = j;
        i = j ++;
    }
    for(; i <= n; i ++) nxt[i] = id;
    for(i = 1; i < id; i ++) nxt[i] = id;
    q.push(mkp(0, 1)), inq[0][1] = true, f[0][1] = 1;
    while(q.size()) {
        auto [t, u] = q.top(); q.pop();
        // cout << "t = " << t << " u = " << u << " f[t][u] = " << f[t][u] << '\n';
        // 走环
        if(t == k) {
            add(ans, f[t][u]);
            continue;
        }
        if(t + calc(u, nxt[u]) >= k) {
            // cout << "ans changed when t = " << t << " , u = " << u << " and f[t][u] = " << f[t][u] << '\n';
            add(ans, f[t][u]);
            // continue;
        }
        else {
            // cout << "update from : " << u << " to : " << nxt[u] << '\n';
            add(f[t + calc(u, nxt[u])][nxt[u]], f[t][u]);
            if(!inq[t + calc(u, nxt[u])][nxt[u]]) {
                inq[t + calc(u, nxt[u])][nxt[u]] = true;
                q.push(mkp(t + calc(u, nxt[u]), nxt[u]));
            }
        }
        for(int i = h[u]; ~i; i = ne[i]) {
            int j = e[i];
            add(f[t + 1][j], f[t][u]);
            // cout << "circle from : " << u << " to : " << j << '\n';
            if(!inq[t + 1][j]) {
                inq[t + 1][j] = true;
                q.push(mkp(t + 1, j));
            }
        }
    }
    cout << ans << '\n';
    return 0;
}
/*

*/
2025/7/25 23:40
加载中...