萌新6分重构树上倍增求助大佬,已经一天了,人麻了
查看原帖
萌新6分重构树上倍增求助大佬,已经一天了,人麻了
393674
jixiang楼主2022/5/6 10:53
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i = (j) ; i <= (k) ; i++)
#define frep(i,j,k) for (int  i = (j) ; i >= (k) ; i--)
#define debug puts("Debeg!!!!! wake up !!!")
#define Mset(a,v) memset(a,v,sizeof (a))
#define Mcpy(a,v) memcpy(a,v,sizeof (a))
#define mrep(i,j) for(int i=(h[j]);~i;i=ne[i])

using namespace std;
typedef long long LL;
typedef pair<int,int> pii;

const int N = 5005;
const int M = 2e6+9;
const int INF=1e8;
const double eps= 1e-8;
int n,m;
int fa[N];
bool vis[N];
LL d[N],w[M],g[N];
int h[N],e[M],ne[M],idx;
int f[N][23];
LL val[N];
int cnt;


struct que
{
    int id;
    LL dis;
    bool operator < (const que & rhs) const
    {
        return dis < rhs.dis;
    }
};

void add(int x,int y,LL z)
{
    ne[++idx] = h[x];
    h[x] = idx;
    e[idx] = y;
    w[idx] = z;
}

struct node
{
    int a,b;
    LL h;

    void init()
    {
        LL c;
        cin >> a >> b;
        cin >> c >> h;
        add(a,b,c); add(b,a,c);
    }

    bool operator < (const node & rhs) const
    {
        return h > rhs.h;
    }

}E[M];

void dij(int s)
{
    priority_queue<que>q;
    Mset(d,127);
    Mset(vis,0);

    d[s] = 0;
    q.push({s,0});
    while (q.size())
    {
        auto t = q.top();
        q.pop();
        int id = t.id;
        LL dis = t.dis;
        if(vis[id]) continue;
        vis[id] = 1;

        mrep(i,id)
        {
            int v = e[i];
            if(d[v] > d[id] + w[i])
            {
                d[v] = d[id] + w[i];
                q.push({v,d[v]});
            }
        }
    }
}

int getfa(int x)
{
    if(fa[x]==x)return x;
    else return fa[x] = getfa(fa[x]);
}

void dfs(int u)
{
    g[u] = d[u];
    mrep(i,u)
    {
        int v = e[i];
        f[v][0] = u;
        dfs(v);
        g[u] = min(g[u],g[v]);
    }
}

void kuruscal()
{
    sort(E+1,E+1+m);
    Mset(h,-1);
    idx = 0;

    rep(i,1,n) fa[i] = i;
    rep(i,1,m)
    {
        int pa = getfa(E[i].a);
        int pb = getfa(E[i].b);
        if(pa == pb) continue;
        val[++cnt] = E[i].h;
        fa[pa] = fa[pb] = fa[cnt]  = cnt;

        add(cnt,pa,0);
        add(cnt,pb,0);
    }

    dfs(cnt);
}


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin >> T;
    while (T--)
    {
        cin >> n >> m;
        Mset(h,-1);
        Mset(f,0);
        Mset(g,127);
        idx =  0;


        rep(i,1,m) E[i].init();
        cnt = n;

        LL q,k,s;
        LL lastans = 0;
        dij(1);
        kuruscal();

        for(int i = 1 ; (1<<i) <= cnt ; i ++)
                rep(j,1,cnt) f[j][i] = f[f[j][i-1]][i-1];

        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);


            frep(i,22,0) if(f[v][i] && val[f[v][i]] > p) v = f[v][i];

            lastans = g[v];

            cout << lastans << endl;
            puts("");
        }
    }


}

2022/5/6 10:53
加载中...