35pts求调教
查看原帖
35pts求调教
399475
_XHY20180718_楼主2023/10/8 19:50

https://www.luogu.com.cn/record/128302512

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5,inf=1e15;
int T,n,m,q,k,s,ans;
int fa[N][21],a[N],f[N];
int head[N],ei,hc[N],dis[N],id;
bool vis[N];
struct edg{
    int u,v,l,a,nxt;
    bool operator<(const edg &t)
    const {return a==t.a?l<t.l:a>t.a;}
}eg[N],egc[N],egs[N];
struct node{
    int u,w;
    bool operator<(const node &t)
    const {return w>t.w;}
};
inline void add(int u,int v,int l,int a){
    egs[++ei]={u,v,l,a,head[u]};head[u]=ei;
}
inline void addc(int u,int v){
    egc[++ei]={u,v,0,0,hc[u]};hc[u]=ei;
}
priority_queue<node>qu;
inline void dijkstra(int s){
    for(int i=1; i<=n; ++i)dis[i]=inf;
    dis[s]=0,qu.push({s,0});
    while(!qu.empty()){
        const int u=qu.top().u;qu.pop();
        if(vis[u])continue;vis[u]=1;
        for(int i=head[u]; i; i=egs[i].nxt){
            const int v=egs[i].v,w=egs[i].l;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                qu.push({v,dis[v]});
            }
        }
    }
}

inline int find(int x){while(x!=f[x])x=f[x]=f[f[x]];return x;}
inline void Kruskal(){
    sort(eg+1,eg+1+m);id=n;
    for(int i=1; i<=(n<<1); ++i)f[i]=i;
    for(int i=1; i<=m&&id<2*n-1; ++i){
        int u=find(eg[i].u),v=find(eg[i].v);
        a[++id]=eg[i].a,dis[id]=min(dis[u],dis[v]);
        fa[u][0]=fa[v][0]=f[u]=f[v]=id;
        addc(id,u),addc(id,v);
    }
}
inline void dfs(int u){
    for(int i=1; i<21; ++i)
        fa[u][i]=fa[fa[u][i-1]][i-1];
    for(int i=hc[u]; i; i=egc[i].nxt){
        const int v=egc[i].v;
        if(fa[u][0]==v)continue;
        fa[v][0]=u,dfs(v);
    }
}
inline int jump(int u,int x){
    int k=20;for(; ~k; --k){
        if(a[fa[u][k]]>x)u=fa[u][k];
    }return u;
}
inline void init(){ei=ans=0;
    memset(egs,0,sizeof(egs));
    memset(egc,0,sizeof(egc));
    memset(fa,0,sizeof(fa));
    memset(hc,0,sizeof(hc));
    memset(vis,0,sizeof(vis));
    memset(head,0,sizeof(head));
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);dis[0]=-inf;
    cin>>T;while(T--){init();
        cin>>n>>m;int u,v,l,a,p;
        for(int i=1; i<=m; ++i)
            cin>>u>>v>>l>>a,eg[i]={u,v,l,a},
            add(u,v,l,a),add(v,u,l,a);ei=0;
        dijkstra(1);Kruskal();dfs(id);
        cin>>q>>k>>s;while(q--){
            cin>>v>>p;
            v=(v+k*ans-1)%n+1;
            p=(p+k*ans)%(s+1);
            cout<<(ans=dis[jump(v,p)])<<'\n';
        }
    }
    return 0;
}

2023/10/8 19:50
加载中...