列表

详情


NC24609. [USACO 2011 Jan G]Bottleneck

描述

Farmer John is gathering the cows. His farm contains a network of N (1 <= N <= 100,000) fields conveniently numbered 1..N and connected by N-1 unidirectional paths that eventually lead to field 1. The fields and paths form a tree.
Each field i > 1 has a single one-way, exiting path to field P_i, and currently contains C_i cows (1 <= C_i <= 1,000,000,000). In each time unit, no more than M_i (0 <= M_i <= 1,000,000,000) cows can travel from field i to field P_i (1 <= P_i <= N) (i.e., only M_i cows can traverse the path).
Farmer John wants all the cows to congregate in field 1 (which has no limit on the number of cows it may have). Rules are as follows:
* Time is considered in discrete units.
* Any given cow might traverse multiple paths in the same time unit. However, no more than M_i total cows can leave field i (i.e., traverse its exit path) in the same time unit.
* Cows never move *away* from field #1.
In other words, every time step, each cow has the choice either to
a) stay in its current field
b) move through one or more fields toward field #1, as long as the bottleneck constraints for each path are not violated
Farmer John wants to know how many cows can arrive in field 1 by certain times. In particular, he has a list of K (1 <= K <= 10,000) times T_i (1 <= T_i <= 1,000,000,000), and he wants to know, for each T_i in the list, the maximum number of cows that can arrive at field 1 by T_i if scheduled to optimize this quantity.
Consider an example where the tree is a straight line, and the T_i list contains only T_1=5, and cows are distibuted as shown:
Locn: 1---2---3---4 <-- Pasture ID numbers  C_i: 0 1 12 12 <-- Current number of cows  M_i: 5 8 3 <-- Limits on path traversal; field 1 has no limit since it has no exit The solution is as follows; the goal is to move cows to field 1:

Tree: 1---2---3---4

t=0 0 1 12 12 <-- Initial state  t=1 5 4 7 9 <-- field 1 has cows from field 2 and 3 t=2 10 7 2 6 t=3 15 7 0 3 t=4 20 5 0 0 t=5 25 0 0 0 Thus, the answer is 25: all 25 cows can arrive at field 1 by time t=5. 

输入描述

* Line 1: Two space-separated integers: N and K
* Lines 2..N: Line i (not i+1) describes field i with three space-separated integers: P_i, C_i, and M_i
* Lines N+1..N+K: Line N+i contains a single integer: T_i

输出描述

* Lines 1..K: Line i contains a single integer that is the maximum number of cows that can arrive at field 1 by time T_i.

示例1

输入:

4 1 
1 1 5 
2 12 7 
3 12 3 
5 

输出:

25

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 52ms, 内存消耗: 3168K, 提交时间: 2020-03-07 12:06:19

#include <algorithm>
 #include <iostream>
 #include <cstring>
 #include <cstdio>
 #include <queue>
typedef long long LL;
using namespace std;
const int N=100010;
 struct Query{LL t,res;int id;}ask[N];
 bool cmp1(Query x,Query y){return x.t<y.t;}
 bool cmp2(Query x,Query y){return x.id<y.id;}
 struct Node{
   LL t;int x;Node(LL t_=0,int x_=0){t=t_;x=x_;}
   friend bool operator<(Node a,Node b){return a.t>b.t;}
 };
 priority_queue<Node>q;
 int fa[N],anc[N],lim[N];
 LL cow[N],pass[N];
 int Find(int x){
   if(anc[x]==x)return x;
   return anc[x]=Find(anc[x]);
 }
 int n,Q;
 int main(){

   scanf("%d%d",&n,&Q);
   for(int i=1;i<=n;i++)
     anc[i]=i;
   for(int i=2;i<=n;i++){
     scanf("%d",&fa[i]);
     scanf("%lld",&cow[i]);
     scanf("%lld",&lim[i]);
     pass[fa[i]]-=lim[i];
     pass[i]+=lim[i];
   }
   for(int i=1;i<=Q;i++){
     scanf("%lld",&ask[i].t);
     ask[i].id=i;
   }sort(ask+1,ask+Q+1,cmp1);
 
   for(int i=2;i<=n;i++)
     if(pass[i]>0){
       LL t=cow[i]/pass[i];
       q.push(Node(t,i));
     }
 
   int p=1,x,tp;
   while(!q.empty()&&p<=Q){
     while(p<=Q&&ask[p].t<=q.top().t)
       ask[p].res=cow[1]-pass[1]*ask[p].t,p++;
     if(anc[q.top().x]!=q.top().x){q.pop();continue;}
     x=q.top().x;tp=Find(fa[x]);cow[tp]+=cow[x];
     pass[tp]+=pass[x];anc[x]=tp;
    if(pass[tp]>0){
       LL t=cow[tp]/pass[tp];
      q.push(Node(t,tp));
     }
     q.pop();
   }sort(ask+1,ask+Q+1,cmp2);
   for(int i=1;i<=Q;i++)
     printf("%lld\n",ask[i].res);
   return 0;
 }

上一题