萌新刚学oi,请求帮助
查看原帖
萌新刚学oi,请求帮助
215806
GodMan、、楼主2021/9/28 09:51
#include <bits/stdc++.h>
using namespace std;
#define N 100101
int m,n,root;
//
struct node{
    int v,nxt,w;
}e[N<<1];
int first[N],cnt;
inline void add(int u,int v,int w){
    e[++cnt].v=v;e[cnt].nxt=first[u];
    first[u]=cnt;e[cnt].w=w;
}
int head[N],nxt[N],to[N],last;
inline void addtr(int u,int v){
    nxt[++last]=head[u];head[u]=last;
    to[last]=v;
}
//
struct edge{
    int u,v,len;
}p[N];
inline bool cmp(const edge& a,const edge& b){
    return a.len>b.len;
}
int f[N<<1],val[N<<1];
inline int getfa(int x){
    return f[x]==x?x:f[x]=getfa(f[x]);
}
inline void merge(int x,int y){
    x=getfa(x),y=getfa(y);
    f[y]=x;
}
void kruscal(){
    int tot=n;sort(p+1,p+m+1,cmp);
    for(int i=1;i<=2*n-1;++i) f[i]=i;
    for(int i=1;i<=m;++i){
        int u=p[i].u,v=p[i].v,len=p[i].len;
        u=getfa(u),v=getfa(v);
        if(u!=v){
            addtr(++tot,u);addtr(tot,v);
            // printf("@%d %d %d\n",tot,u,v);
            merge(tot,u);merge(tot,v);
            val[tot]=len;
        }
        if(tot==2*n-1) break;
    }
    root=tot;
}
//
typedef pair<int,int> T;
int dis[N],vis[N];
void dijstra(){
    memset(dis,0x3f,sizeof dis);
    priority_queue< T,vector<T>,greater<T> > q;
    q.push(make_pair(dis[1]=0,1));
    while(!q.empty()){
        T t=q.top();q.pop();
        int u=t.second,d=t.first;
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=first[u];i;i=e[i].nxt){
            int v=e[i].v,w=e[i].w;
            if(dis[v]>w+d){
                dis[v]=w+d;
                q.push(make_pair(dis[v],v));
            }
        }
    }
}
//
int fa[N<<1][20],siz[N<<1],st[N],pre[N],ed[N<<1],tot;
int dfs1(int u,int ff){
    // printf("**%d\n",u);
    fa[u][0]=ff;siz[u]=1;
    int x=0x3f3f3f3f;
    for(int i=head[u];i;i=nxt[i]){
        int v=to[i];
        x=min(x,dfs1(v,u));
        siz[u]+=siz[v];
        // printf("#%d %d\n",u,v);
    }
    if(siz[u]==1) x=st[u]=++tot,x,pre[tot]=u;
    ed[u]=tot;
    return x;
}
void init(){
    for(int j=1;j<=19;j++)
    for(int i=1;i<=n;i++)
    fa[i][j]=fa[fa[i][j-1]][j-1];
} 
int find(int x,int lim){
    for(int j=19;j>=0;j--)
        if(val[fa[x][j]]>lim) x=fa[x][j];
    return x;
}
//
#define lc p<<1
#define rc p<<1|1
struct segment{
    int l,r,minn;
}t[N<<2];
void build(int p,int l,int r){
    t[p].l=l,t[p].r=r;t[p].minn=0x3f3f3f3f;
    if(l==r) return void(t[p].minn=dis[pre[l]]);
    int mid=l+r>>1;
    build(lc,l,mid);
    build(rc,mid+1,r);
    return void(t[p].minn=min(t[lc].minn,t[rc].minn));
}
int query(int p,int ql,int qr){
    if(ql<=t[p].l&&t[p].r<=qr) return t[p].minn;
    int mid=t[p].l+t[p].r>>1;
    int ans=0x3f3f3f3f;
    if(ql<=mid) ans=min(ans,query(lc,ql,qr));
    if(qr>mid) ans=min(ans,query(rc,ql,qr));
    return ans;
}
//
int solve(int x,int lim){
    x=find(x,lim);
    return query(1,st[x],ed[x]);
}
inline int rd(){
    char c=getchar();int v=0;
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') v=(v<<3)+(v<<1)+(c^48),c=getchar();
    return v;
}
void clear(){
    memset(first,0,sizeof first);
    memset(head,0,sizeof head);
    memset(fa,0,sizeof fa);
    memset(vis,0,sizeof vis);
    cnt=last=tot=0;
}
int main(){
    freopen("1.in","r",stdin);
    int type=rd();
    while(type--){
        n=rd(),m=rd();
        for(int i=1;i<=m;++i){
            int u=rd(),v=rd(),w=rd(),len=rd();
            p[i].u=u,p[i].v=v,p[i].len=len;
            add(u,v,w);add(v,u,w);
        }
        kruscal();
        // printf("#%#$%d",root);
        dfs1(root,0);init();
        dijstra();
        build(1,1,n);
        int q=rd(),k=rd(),S=rd();
        int lastans=0;
        while(q--){
            int u=(rd()+k*lastans-1)%n+1,lim=(rd()+k*lastans)%(S+1);
            printf("%d\n",lastans=solve(u,lim));
        }
        clear();
    }
    return 0;
}

只过了两个点评测记录

2021/9/28 09:51
加载中...