QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#60170#2161. The Cost of Speed LimitsMIT01#TL 1932ms1570144kbC++232.1kb2022-11-03 10:20:442022-11-03 10:23:16

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-11-03 10:23:16]
  • 评测
  • 测评结果:TL
  • 用时:1932ms
  • 内存:1570144kb
  • [2022-11-03 10:20:44]
  • 提交

answer

using namespace std;
#include <bits/stdc++.h>
#define ll long long
#define mp make_pair
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define pi pair<int, int>
#define maxn 20005
#define mod 998244353
template<typename T> bool chkmin(T &a, T b){return (b < a) ? a = b, 1 : 0;}
template<typename T> bool chkmax(T &a, T b){return (b > a) ? a = b, 1 : 0;}
ll ksm(ll a, ll b) {if (b == 0) return 1; ll ns = ksm(a, b >> 1); ns = ns * ns % mod; if (b & 1) ns = ns * a % mod; return ns;}
using namespace std;
#define ui unsigned int
int n, c;
ui dp[maxn][maxn], bst[maxn];
vector<pi> eg[maxn];
vi tr;
int fl[maxn];
int fa[maxn];
void dfs1(int a) {
    for (auto v: eg[a]) {
        if (v.fi == fa[a]) continue;
        fa[v.fi] = a;
        fl[v.fi] = lower_bound(tr.begin(), tr.end(), v.se) - tr.begin();
        dfs1(v.fi);
    }
}
const ui inf = 4e9;
void dfs2(int a) {
    for (auto [v, d] : eg[a]) {
        if (v == fa[a]) continue;
        dfs2(v);
    }
    bst[a] = inf;
    for (int i = 0; i < tr.size(); i++) {
        // fa len is i
        if (i < fl[a]) dp[a][i] = inf;
        else {
            dp[a][i] = tr[i] - tr[fl[a]];
            if (a == 1) dp[a][i] = 0;
        }
        // not involving c
        ui sbst = 0;
        ui str = 0;
        for (auto [v, d] : eg[a]) {
            if (v == fa[a]) continue;
            sbst += bst[v];
            ll cr = str;
            cr += dp[v][i];
            if (cr <= (ll)inf) str = cr;
            else str = inf;
        }
        sbst += eg[a].size() * c;
        dp[a][i] += min(sbst, str);
        //cout << a << ' ' << i << ' ' << dp[a][i] << endl;
        chkmin(bst[a], dp[a][i]);
    }
}
int main() {
    cin >> n >> c;
    for (int i = 1; i < n; i++) {
        int u, v, s;
        scanf("%d%d%d", &u, &v, &s);
        tr.pb(s);
        eg[u].pb(mp(v, s));
        eg[v].pb(mp(u, s));
    }
    sort(tr.begin(), tr.end());
    dfs1(1);
    dfs2(1);
    if (n == 1) bst[1] = 0;
    cout << bst[1] << endl;
    return 0;
}
/*
5 100
1 2 10
1 3 5
1 4 7
2 5 9
*/

详细

Test #1:

score: 100
Accepted
time: 2ms
memory: 5940kb

input:

13 20
1 8 101
1 9 30
1 2 100
1 3 100
2 4 75
2 5 70
2 6 82
2 7 77
3 10 73
3 11 69
3 12 83
3 13 79

output:

272

result:

ok single line: '272'

Test #2:

score: 0
Accepted
time: 1ms
memory: 6160kb

input:

9 10
1 6 26
2 6 27
3 6 28
4 6 29
5 6 30
7 9 14
8 9 1
9 6 10

output:

60

result:

ok single line: '60'

Test #3:

score: 0
Accepted
time: 3ms
memory: 4008kb

input:

7 64
2 1 194
3 1 187
4 2 158
5 1 42
6 5 101
7 5 80

output:

308

result:

ok single line: '308'

Test #4:

score: 0
Accepted
time: 2ms
memory: 4120kb

input:

6 32
2 1 110
3 2 36
4 1 54
5 3 101
6 5 71

output:

178

result:

ok single line: '178'

Test #5:

score: 0
Accepted
time: 1900ms
memory: 1569064kb

input:

20000 100
2273 4097 98627
14155 14055 33506
16060 6363 28081
14840 12695 23379
11520 7892 5831
6633 13834 73944
19218 19341 62064
14392 160 58289
18147 209 46443
16941 5453 55103
11895 12849 31201
10275 1622 71781
19595 6349 14232
19485 10800 9778
10745 13541 44786
18727 15264 25726
5847 12815 43894...

output:

2999800

result:

ok single line: '2999800'

Test #6:

score: 0
Accepted
time: 1932ms
memory: 1570144kb

input:

20000 1000
1 2 99998
2 3 99994
3 4 99992
4 5 99989
5 6 99987
6 7 99983
7 8 99982
8 9 99978
9 10 99973
10 11 99970
11 12 99965
12 13 99961
13 14 99957
14 15 99954
15 16 99949
16 17 99946
17 18 99945
18 19 99940
19 20 99935
20 21 99932
21 22 99927
22 23 99923
23 24 99920
24 25 99919
25 26 99918
26 27 ...

output:

2088429

result:

ok single line: '2088429'

Test #7:

score: 0
Accepted
time: 1883ms
memory: 1570120kb

input:

20000 1000
1 2 4
2 3 6
3 4 9
4 5 13
5 6 15
6 7 17
7 8 22
8 9 23
9 10 27
10 11 28
11 12 31
12 13 36
13 14 38
14 15 39
15 16 44
16 17 46
17 18 49
18 19 52
19 20 55
20 21 60
21 22 62
22 23 64
23 24 67
24 25 68
25 26 71
26 27 72
27 28 76
28 29 77
29 30 82
30 31 86
31 32 89
32 33 90
33 34 95
34 35 96
35 ...

output:

2098509

result:

ok single line: '2098509'

Test #8:

score: -100
Time Limit Exceeded

input:

20000 100000
1 4 1
1 5 1
1 6 1
1 7 1
1 8 1
1 9 1
1 10 1
1 11 1
1 12 1
1 13 1
1 14 1
1 15 1
1 16 1
1 17 1
1 18 1
1 19 1
1 20 1
1 21 1
1 22 1
1 23 1
1 24 1
1 25 1
1 26 1
1 27 1
1 28 1
1 29 1
1 30 1
1 31 1
1 32 1
1 33 1
1 34 1
1 35 1
1 36 1
1 37 1
1 38 1
1 39 1
1 40 1
1 41 1
1 42 1
1 43 1
1 44 1
1 45 1...

output:


result: