求助! 数组开大十倍就能AC,但不知道为什么
查看原帖
求助! 数组开大十倍就能AC,但不知道为什么
486056
xuzishuai楼主2024/7/28 15:55

RE代码,求调

#include<bits/stdc++.h>
#define fq(i,d,u) for(int i(d); i<=u; ++i)
#define fr(i,u,d) for(int i(u); i>=d; --i)
#define sf scanf
#define pf printf
using namespace std;
const int N = 2e5,M = 4e5,inf = 2e9 + 5;

int n,m;
struct E{int u,v,l,w;} e[M];
typedef pair<int,int> pii;
vector<pii> mp[M];
int dis[M]; bool vis[M];

namespace B {
    int fa[M << 1];
    void init () {fq(i,1,n * 2 - 1) fa[i] = i;}
    int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);}
}

namespace R {

    int cnt;
    int val[M << 1],w[M << 1]; //height,distance
    struct nd {int l,r;} tr[M << 1];

    int fa[M << 1][21];
    void dfs(int x,int f) {
        if(!x) return;
        fa[x][0] = f;
        dfs(tr[x].l,x);
        dfs(tr[x].r,x);
        w[x] = min({w[x],w[tr[x].l],w[tr[x].r]});
    }

    void work() {

        B::init();
        sort(e + 1,e + 1 + m,[](E a,E b) {return a.w > b.w;});
        cnt = n;
        fq(i,1,m) {
            auto [u,v,l,w] = e[i];
            u = B::find(u),v = B::find(v);
            if(u == v) continue;
            tr[++cnt].l = u,tr[cnt].r = v;
            val[cnt] = w;
            B::fa[u] = B::fa[v] = cnt;
        }

        fq(i,n + 1,cnt) w[i] = inf;
        fq(i,1,n) w[i] = dis[i];
        // cerr << cnt << "#\n";
        dfs(cnt,cnt);
        fq(k,1,20) fq(i,1,cnt) fa[i][k] = fa[fa[i][k - 1]][k - 1];

        int q,K,S,lastans(0); cin >> q >> K >> S;
        while(q--) {
            int v,p; cin >> v >> p;
            v = (v + K * lastans - 1) % n + 1;
            p = (p + K * lastans) % (S + 1);
            fr(k,20,0) if(val[fa[v][k]] > p) v = fa[v][k];
            // cout << v << " " << p << "#\n";
            cout << (lastans = w[v]) << "\n";
        }

        fq(i,1,cnt) tr[i].l = tr[i].r = 0,val[i] = 0;
        fq(k,0,20) fq(i,1,cnt) fa[i][k] = 0;

    }
}

void solve() {

    cin >> n >> m;
    fq(i,1,n) mp[i].clear();
    fq(i,1,m) {
        auto &[u,v,l,w] = e[i];
        cin >> u >> v >> l >> w;
        mp[u].push_back({v,l});
        mp[v].push_back({u,l});
    }

    fq(i,1,n) dis[i] = inf,vis[i] = 0;
    priority_queue<pii,vector<pii>,greater<pii>> q;
    q.push({0,1}); dis[1] = 0;
    while(q.size()) {
        auto [s,u] = q.top(); q.pop();
        if(vis[u]) {continue;} vis[u] = 1;
        for(auto [v,w] : mp[u]) {
            if(dis[v] > s + w) {
                dis[v] = s + w;
                q.push({s + w,v});
            }
        }
    }

    // fq(i,1,n) cout << dis[i] << " ";
    // cout << "#\n";

    R::work();

}

int main(){

    // freopen("return.in","r",stdin);
    // freopen("return.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    R::w[0] = inf;
    int T; cin >> T;
    while(T--) solve();

    return 0;
}
2024/7/28 15:55
加载中...