QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#398235#3758. 2019SamponYWAC ✓46ms5468kbC++142.0kb2024-04-25 09:20:312024-04-25 09:20:32

Judging History

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

  • [2024-04-25 09:20:32]
  • 评测
  • 测评结果:AC
  • 用时:46ms
  • 内存:5468kb
  • [2024-04-25 09:20:31]
  • 提交

answer

#include <bits/stdc++.h>
#define db double
#define il inline
#define re register
#define ll long long
#define ui unsigned
#define ull ui ll
#define i128 __int128
#define pii pair<int, int>
#define fi first
#define se second
#define eb emplace_back
#define SZ(v) (int)v.size()
#define ALL(v) v.begin(), v.end()
#define mems(v, x) memset(v, x, sizeof(v))
#define memc(a, b) memcpy(a, b, sizeof(a))
#define FOR(i, L, R) for(re int i = (L); i <= (R); ++i)
#define ROF(i, R, L) for(re int i = (R); i >= (L); --i)
#define LS i << 1, l, mid
#define RS i << 1 | 1, mid + 1, r
#define popc(x) __builtin_popcount(x)
using namespace std;
#define N 20005
#define M 2019
int n; vector<pii> e[N]; bool u[N];
int dp[N], sz[N], rt, nowsz;
il void findrt(int x, int fa) {
  sz[x] = 1, dp[x] = 0;
  for(auto [y, w] : e[x]) if(y ^ fa && !u[y])
    findrt(y, x), sz[x] += sz[y], dp[x] = max(dp[x], sz[y]);
  dp[x] = max(dp[x], nowsz - sz[x]);
  if(dp[rt] > dp[x]) rt = x;
}
int ans;
int cnt[M];
vector<int> tmp;
il void dfs(int x, int fa, int s) {
  tmp.eb(s);
  for(auto [y, w] : e[x]) if(y ^ fa && !u[y])
    dfs(y, x, (s + w) % M);
}
il void solve(int x) {
  vector<int> A;
  A.eb(0), ++cnt[0];
  for(auto [y, w] : e[x]) if(!u[y]) {
    dfs(y, x, w);
    for(auto t : tmp) ans += cnt[(M - t) % M];
    for(auto t : tmp) A.eb(t), ++cnt[t];
    vector<int>().swap(tmp);
  }
  for(auto t : A) cnt[t] = 0;
}
il void divide(int x) {
  u[x] = 1, solve(x);
  for(auto [y, w] : e[x]) if(!u[y])
    nowsz = sz[y], rt = 0, findrt(y, x), divide(rt);
}
il void WORK() {
  FOR(i, 1, n)
    vector<pii>().swap(e[i]), u[i] = 0;
  FOR(i, 1, n - 1) {
    int x, y, v; cin >> x >> y >> v;
    e[x].eb(y, v), e[y].eb(x, v);
  }
  ans = 0;
  nowsz = n, dp[rt = 0] = 1e9, findrt(1, 0), divide(rt);
  cout << ans << "\n";
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  while(cin >> n) WORK();
  cerr << 1.0 * clock() / CLOCKS_PER_SEC;
  return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 46ms
memory: 5468kb

input:

500
393 136 1551
456 231 1348
286 161 1460
63 343 1265
319 427 834
429 181 1322
456 191 802
23 217 1621
117 292 1627
378 51 409
268 369 1447
348 381 1206
464 147 439
73 430 922
87 233 1521
33 235 19
11 462 351
311 449 7
451 26 1971
256 109 1686
145 14 1126
11 126 372
117 429 705
385 57 1418
147 220 ...

output:

73
60
57
68
56
63
43
60
68
60
65
70
67
51
45
50
53
62
55
63
61
51
54
63
56
58
74
69
71
65
70
62
61
73
59
84
49
62
63
70
60
55
52
60
50
52
53
64
62
54
61
72
49
48
59
65
63
67
63
63
57
80
67
56
43
61
54
67
53
65
68
58
56
59
61
66
57
58
55
68
99708
98538
199990000

result:

ok 83 numbers