Bessie attended NN milking sessions (1≤N≤1051≤N≤105) over the past MM days (2≤M≤1092≤M≤109). However, she is having trouble remembering when she attended each session.
For each session i=1…Ni=1…N, she knows that it occurred no earlier than day SiSi (1≤Si≤M1≤Si≤M). Additionally, Bessie has CC memories (1≤C≤1051≤C≤105), each described by a triple (a,b,x)(a,b,x), where she recalls that session bb happened at least xx days after aa.
Help Bessie by computing the earliest possible date of occurrence for each milking session. It is guaranteed that Bessie did not remember incorrectly; in other words, there exists an assignment of sessions to days in the range 1…M1…M such that all constraints from her memories are satisfied.
The first line of input contains NN, MM, and CC.The next line contains NN space-separated integers S1,S2,…,SNS1,S2,…,SN. Each is in the range 1…M1…M.
The next CC lines contain three integers, aa, bb, and xx indicating that session bb happened at least xx days after aa. For each line, a≠ba≠b, aa and bb are in the range 1…N1…N, and xx is in the range 1…M1…M.
Output NN lines giving the earliest possible date of occurrence for each session.
4 10 3 1 2 3 4 1 2 5 2 4 2 3 4 4
1 6 3 8
Session two occurred at least five days after session one, so it cannot have occurred before day 1+5=6.1+5=6. Session four occurred at least two days after session two, so it cannot have occurred before day 6+2=86+2=8.
Problem credits: Mark Gordon
[/hide]
(Analysis by Benjamin Qi)
For each constraint (a,b,x)(a,b,x) draw a directed edge from aa to bb with weight xx. Note that there cannot be a cycle in this graph or else no solution would exist. Thus, we'll process the sessions in order of the topological sort.
Without loss of generality suppose that the topological sort is 1,2,…,N,1,2,…,N, meaning that all edges satisfy a<ba<b. Then for each directed edge in increasing order of aa, it suffices to set Sb=max(Sb,Sa+x)Sb=max(Sb,Sa+x). After all of these edges are processed, the resulting S1,S2,…,SNS1,S2,…,SN are the lowest possible values that satisfy all the edge conditions (assuming all of them are less than or equal to MM). This can be implemented in O(N+M)O(N+M) time.
#include "bits/stdc++.h"
using namespace std;
void setIO(string s) {
ios_base::sync_with_stdio(0); cin.tie(0);
freopen((s+".in").c_str(),"r",stdin);
freopen((s+".out").c_str(),"w",stdout);
}
#define f first
#define s second
const int MX = 1e5+5;
int N,M,C,S[MX],in[MX];
bool vis[MX];
vector<pair<int,int>> adj[MX];
queue<int> q;
int main() {
setIO("timeline");
cin >> N >> M >> C;
for (int i = 1; i <= N; ++i) cin >> S[i];
for (int i = 0; i < C; ++i) {
int a,b,x; cin >> a >> b >> x;
adj[a].push_back({b,x}); in[b] ++;
}
for (int i = 1; i <= N; ++i) if (!in[i]) q.push(i);
while (q.size()) {
int x = q.front(); q.pop(); // process x in order of topological sort
vis[x] = 1; assert(S[x] <= M);
for (auto& t: adj[x]) {
S[t.f] = max(S[t.f],S[x]+t.s);
if (!(--in[t.f])) q.push(t.f);
}
}
for (int i = 1; i <= N; ++i) {
assert(vis[i]);
cout << S[i] << "\n";
}
}
[/hide]
以上就是关于【USACO 2020 February Contest, Gold Problem 1. Timeline】的解答,如需了解学校/赛事/课程动态,可至翰林教育官网获取更多信息。
往期文章阅读推荐:
美国AI奥赛首次新增低龄组!2027 USAAIO报名中,2月正式开考!
不考编程实操?2026 CAICP人工智能能力认证首轮11月22日开考,备考指南速递!

© 2026. All Rights Reserved. 沪ICP备2023009024号-1