2 条题解

  • 0
    @ 2025-10-8 16:58:03
    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    
    const int N = 1e5 + 10;
    
    struct node1 { ll t, res; int id; } ask[N];
    inline bool cmp1(node1 x, node1 y) { return x.t < y.t; }
    inline bool cmp2(node1 x, node1 y) { return x.id < y.id; }
    
    struct node2 {
        ll t; int x;
        inline bool operator <(const node2& b)const { return t > b.t; }
    };
    
    priority_queue<node2> q;
    int fa[N];
    int findfa(int x) { return fa[x] == x ? x : fa[x] = findfa(fa[x]); }
    
    int up[N]; ll cow[N], M[N], pass[N];
    
    int main() {
        int n, m; scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; ++i) fa[i] = i;
        for (int i = 2; i <= n; ++i) {
            scanf("%d%lld%lld", &up[i], &cow[i], &M[i]), pass[up[i]] -= M[i], pass[i] += M[i];
        }
    
        for (int i = 1; i <= m; ++i) scanf("%lld", &ask[i].t), ask[i].id = i;
        sort(ask + 1, ask + 1 + m, cmp1);
    
        for (int i = 2; i <= n; ++i) if (pass[i] > 0) q.push({ cow[i] / pass[i], i });
    
        int l = 1, x, tp;
        while (!q.empty() && l <= m) {
    
            for (; l <= m && ask[l].t <= q.top().t; ++l)
                ask[l].res = cow[1] - pass[1] * ask[l].t;
    
            if (fa[q.top().x] != q.top().x) { q.pop(); continue; }
    
            x = q.top().x, tp = findfa(up[x]);
    
            cow[tp] += cow[x], pass[tp] += pass[x], fa[x] = tp;
    
            if (pass[tp] > 0) q.push({ cow[tp] / pass[tp], tp });
    
            q.pop();
        }
        sort(ask + 1, ask + 1 + m, cmp2);
        for (int i = 1; i <= m; ++i) printf("%lld\n", ask[i].res);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:57:49
      #include<bits/stdc++.h>
      #define ll long long
      using namespace std;
       
      const int N=1e5+10;
       
      struct node1{ll t,res;int id;}ask[N];
      inline bool cmp1(node1 x,node1 y){return x.t<y.t;}
      inline bool cmp2(node1 x,node1 y){return x.id<y.id;}
       
      struct node2
      {
          ll t;int x;
          inline bool operator <(const node2 &b)const {return t>b.t;}
      };
       
      priority_queue<node2> q;
      int fa[N];
      int findfa(int x){return fa[x]==x?x:fa[x]=findfa(fa[x]);}
       
      int up[N];ll cow[N],M[N],pass[N];
      
      int main(){
          int n,m;scanf("%d%d",&n,&m);
          for(int i=1;i<=n;++i) fa[i]=i;
          for(int i=2;i<=n;++i) {
              scanf("%d%lld%lld",&up[i],&cow[i],&M[i]), 
              pass[up[i]]-=M[i],pass[i]+=M[i];
          }
       
          for(int i=1;i<=m;++i) scanf("%lld",&ask[i].t),ask[i].id=i;
          sort(ask+1,ask+1+m,cmp1);
       
          for(int i=2;i<=n;++i) if(pass[i]>0) q.push({cow[i]/pass[i],i});
       
          int l=1,x,tp;
          while(!q.empty()&&l<=m) {
       
              for(;l<=m&&ask[l].t<=q.top().t;++l)
                  ask[l].res=cow[1]-pass[1]*ask[l].t;
       
              if(fa[q.top().x]!=q.top().x){ q.pop(); continue; }
       
              x=q.top().x , tp=findfa(up[x]);
       
              cow[tp]+=cow[x],  pass[tp]+=pass[x] , fa[x]=tp;
       
              if(pass[tp]>0) q.push({cow[tp]/pass[tp],tp});
       
              q.pop();
          }
          sort(ask+1,ask+1+m,cmp2);
          for(int i=1;i<=m;++i) printf("%lld\n",ask[i].res);
          return 0;
      }

      • 1

      信息

      ID
      1568
      时间
      1000ms
      内存
      128MiB
      难度
      10
      标签
      递交数
      2
      已通过
      1
      上传者