QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#398235 | #3758. 2019 | SamponYW | AC ✓ | 46ms | 5468kb | C++14 | 2.0kb | 2024-04-25 09:20:31 | 2024-04-25 09:20:32 |
Judging History
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