求助 3-16tle 重构树解法 码风好看
查看原帖
求助 3-16tle 重构树解法 码风好看
150467
never_turn_right楼主2021/8/31 11:45
#include<bits/stdc++.h>
using namespace std;
#define N 1600005
int T,n,m;
struct edge
{
  int u,v,l,a;
}eg[N];
struct edg
{
  int v,dis;
}e[N];
int cnt;
vector<int> mp[N];
vector<int> tr[N];
int dis[N];
bool vis[N];
bool cmp(edge x,edge y)
{
  return x.a>y.a;
}
priority_queue<pair<int,int> > qu;
void dij()
{
  memset(vis,0,sizeof(vis));
  memset(dis,0x3f,sizeof(dis));
  dis[1]=0;
  qu.push(make_pair(0,1));
  while(qu.size())
  {
    int u=qu.top().second;
    qu.pop();
    if(vis[u])
      continue;
    vis[u]=1;
    for(int i=0;i<mp[u].size();i++)
    {
      int v=e[mp[u][i]].v,w=e[mp[u][i]].dis;
      if(dis[v]>dis[u]+w)
      {
        dis[v]=dis[u]+w;
        qu.push(make_pair(-dis[v],v));
      }
    }
  }
}
struct bcj
{
  int fa[N];
  int getfa(int x)
  {
    if(fa[x]==x)
      return x;
    else
      return fa[x]=getfa(fa[x]);
  }
}bc;
int kst[N];
int fa[N][20],zson[N];
void dfs(int x)
{
  for(int i=1;i<=19;i++)
    fa[x][i]=fa[fa[x][i-1]][i-1];
  for(int i=0;i<tr[x].size();i++)
  {
    fa[tr[x][i]][0]=x;
    dfs(tr[x][i]);
    zson[x]=min(zson[x],zson[tr[x][i]]);
  }
  if(tr[x].size()==0)
    zson[x]=dis[x];
}
int q,k,s;
int main()
{
  scanf("%d",&T);
  while(T--)
  {
    memset(zson,0x3f,sizeof(zson));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n<<1;i++)
      bc.fa[i]=i,mp[i].clear();
    for(int i=1;i<=m;i++)
    {
      int x,y,a,b;
      scanf("%d%d%d%d",&x,&y,&a,&b);
      eg[i]=(edge){x,y,a,b};
      mp[x].push_back(++cnt);
      e[cnt]=(edg){y,a};
      mp[y].push_back(++cnt);
      e[cnt]=(edg){x,a};
    }
    dij();
    sort(eg+1,eg+1+m,cmp);
    int cntcc=0;
    for(int i=1;i<=m&&cntcc<=n-1;i++)
    {
      int kk=bc.getfa(eg[i].u);
      int kt=bc.getfa(eg[i].v);
      if(kk!=kt)
      {
        cntcc++;
        kst[cntcc+n]=eg[i].a;
        tr[cntcc+n].push_back(kk);
        tr[cntcc+n].push_back(kt);
        bc.fa[kk]=bc.fa[kt]=n+cntcc; 
      }
    }
    dfs(n+cntcc);
    scanf("%d%d%d",&q,&k,&s);
    int lastans=0;
    for(int i=1;i<=q;i++)
    {
      int v,p;
      scanf("%d%d",&v,&p);
      v=(v+k*lastans-1)%n+1;
      p=(p+k*lastans)%(s+1);
      for(int i=19;i>=0;i--) 
        if(kst[fa[v][i]]>p)
          v=fa[v][i];
      printf("%d\n",zson[v]);
      lastans=zson[v];
    }   
  }
  return 0;
}
2021/8/31 11:45
加载中...