2 条题解

  • 0
    @ 2025-10-8 17:02:01

    by hansang:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=4e4+10;
    struct node{
        LL x, y;
        node() {x=y=0;}
    } d[N];
    struct at{int u, v; LL l; char s[5];} a[N];
    struct qt{int u, v, k, id;} b[N];
    node operator+(node n1, node n2){
        n1.x+=n2.x; n1.y+=n2.y;
        return n1;
    }
    node operator-(node n1, node n2){
        n1.x-=n2.x; n1.y-=n2.y;
        return n1;
    }
    bool cmp(qt q1, qt q2){
        return q1.k<q2.k;
    }
    int fa[N]; LL ans[N]; bool v[N];
    int findfa(int x){
        if(fa[x]==x) return fa[x];
        int f=fa[x];
        int tx=findfa(fa[x]);
        d[x]=d[x]+d[f];
        return fa[x]=tx;
    }
    void merge(int u, int v, LL l, char s[]){
        int tx=findfa(u), ty=findfa(v);
        if(tx==ty) return ;
        fa[tx]=ty; node no;
        if(s[0]=='E') no.x=0, no.y=l;
        if(s[0]=='S') no.x=-l, no.y=0;
        if(s[0]=='W') no.x=0, no.y=-l;
        if(s[0]=='N') no.x=l, no.y=0;
        d[tx]=no-d[u]+d[v];
    }
    int dis(node n1, node n2){
        return abs(n1.x-n2.x)+abs(n1.y-n2.y);
    }
    int main(){
        int n, q; scanf("%d%d", &n, &q);
        for(int i=1; i<=n; i++) fa[i]=i;
        for(int i=1; i<=q; i++){
            scanf("%d%d%lld%s", &a[i].u, &a[i].v, &a[i].l, a[i].s);
        }
        int m; scanf("%d", &m);
        for(int i=1; i<=m; i++){
            scanf("%d%d%d", &b[i].u, &b[i].v, &b[i].k);
            b[i].id=i;
        }
        sort(b+1, b+m+1, cmp);
        memset(v, 0, sizeof(v)); int now=0;
        for(int i=1; i<=m; i++){
            while(now<=b[i].k) merge(a[now].u, a[now].v, a[now].l, a[now].s), now++;
            int tx=findfa(b[i].u), ty=findfa(b[i].v);
            if(tx!=ty){
                ans[b[i].id]=-1;
            }
            else{
                ans[b[i].id]=dis(d[b[i].u], d[b[i].v]);
            }
        }
        for(int k=1; k<=m; k++) printf("%lld\n", ans[k]);
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:01:49

      by hansang:

      #include<bits/stdc++.h>
      using namespace std;
      typedef long long LL;
      const int N=4e4+10;
      struct node{
          LL x, y;
          node() {x=y=0;}
      } d[N];
      struct at{int u, v; LL l; char s[5];} a[N];
      struct qt{int u, v, k, id;} b[N];
      node operator+(node n1, node n2){
          n1.x+=n2.x; n1.y+=n2.y;
          return n1;
      }
      node operator-(node n1, node n2){
          n1.x-=n2.x; n1.y-=n2.y;
          return n1;
      }
      bool cmp(qt q1, qt q2){
          return q1.k<q2.k;
      }
      int fa[N]; LL ans[N]; bool v[N];
      int findfa(int x){
          if(fa[x]==x) return fa[x];
          int f=fa[x];
          int tx=findfa(fa[x]);
          d[x]=d[x]+d[f];
          return fa[x]=tx;
      }
      void merge(int u, int v, LL l, char s[]){
          int tx=findfa(u), ty=findfa(v);
          if(tx==ty) return ;
          fa[tx]=ty; node no;
          if(s[0]=='E') no.x=0, no.y=l;
          if(s[0]=='S') no.x=-l, no.y=0;
          if(s[0]=='W') no.x=0, no.y=-l;
          if(s[0]=='N') no.x=l, no.y=0;
          d[tx]=no-d[ u ]+d[v];
      }
      int dis(node n1, node n2){
          return abs(n1.x-n2.x)+abs(n1.y-n2.y);
      }
      int main(){
          int n, q; scanf("%d%d", &n, &q);
          for(int i=1; i<=n; i++) fa[i]=i;
          for(int i=1; i<=q; i++){
              scanf("%d%d%lld%s", &a[i].u, &a[i].v, &a[i].l, a[i].s);
          }
          int m; scanf("%d", &m);
          for(int i=1; i<=m; i++){
              scanf("%d%d%d", &b[i].u, &b[i].v, &b[i].k);
              b[i].id=i;
          }
          sort(b+1, b+m+1, cmp);
          memset(v, 0, sizeof(v)); int now=0;
          for(int i=1; i<=m; i++){
              while(now<=b[i].k) merge(a[now].u, a[now].v, a[now].l, a[now].s), now++;
              int tx=findfa(b[i].u), ty=findfa(b[i].v);
              if(tx!=ty){
                  ans[b[i].id]=-1;
              }
              else{
                  ans[b[i].id]=dis(d[b[i].u], d[b[i].v]);
              }
          }
          for(int k=1; k<=m; k++) printf("%lld\n", ans[k]);
          return 0;
      } 
      • 1

      USACO(48)并查集3:导航难题[Navigation Nightmare&#44; 2004 Feb]

      信息

      ID
      2645
      时间
      1000ms
      内存
      128MiB
      难度
      9
      标签
      递交数
      19
      已通过
      2
      上传者