RT。代码如下:(是自己参加一场模拟赛的题目)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5e5 + 10;
int n, en, h[maxn];
struct Edge
{
int u, v, nxt, w;
} e[maxn << 1];
int fa[maxn], dep[maxn];
int mp[maxn][maxn];
int d[maxn], tot;
ll ans;
int tr[maxn << 2];
void addedge(int u, int v, int w)
{
e[++en].u = u;
e[en].v = v;
e[en].w = w;
e[en].nxt = h[u];
h[u] = en;
return;
}
void dfs(int x, int f)
{
fa[x] = f;
dep[x] = dep[f] + 1;
for(int i = 1; i <= n; ++i)
{
if(i == f || mp[x][i] == 0) continue;
dfs(i, x);
}
return;
}
void calc(int x, int y)
{
tot = 0;
if(dep[x] < dep[y]) swap(x, y);
while(dep[x] != dep[y])
{
d[++tot] = mp[x][fa[x]];
x = fa[x];
}
if(x != y)
{
while(fa[x] != fa[y])
{
d[++tot] = mp[x][fa[x]];
d[++tot] = mp[y][fa[y]];
x = fa[x]; y = fa[y];
}
d[++tot] = mp[x][fa[x]];
d[++tot] = mp[y][fa[y]];
}
ans += unique(d + 1, d + tot + 1) - (d + 1);
return;
}
void solve1() //bruteforce
{
for(int i = 1; i < n; ++i)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
mp[u][v] = mp[v][u] = w;
}
dfs(1, 0);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
if(i != j)
calc(i, j);
cout << ans << endl;
return;
}
void solve3()
{
for(int i = h[1]; i != 0; i = e[i].nxt)
ans += 2;
for(int i = 2; i <= n; ++i)
for(int j = 2; j <= n; ++j)
{
if(i == j) continue;
if(e[h[i]].w == e[h[j]].w)
ans++;
else
ans += 2;
}
cout << ans << endl;
}
int main()
{
freopen("forest.in", "r", stdin);
freopen("forest.out", "w", stdout);
scanf("%d", &n);
if(n <= 300)
{
solve1();
return 0;
}
bool flag = true;
for(int i = 1; i < n; ++i)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
addedge(u, v, w);
addedge(v, u, w);
if(u != i)
flag = false;
}
solve3();
return 0;
}
鬼畜的编译信息如下:
final section layout: __TEXT/__text addr=0x100003300, size=0x00000B10, fileOffset=0x00003300, type=1 __TEXT/__stubs addr=0x100003E10, size=0x00000090, fileOffset=0x00003E10, type=29 __TEXT/__stub_helper addr=0x100003EA0, size=0x0000009C, fileOffset=0x00003EA0, type=33 __TEXT/__gcc_except_tab addr=0x100003F3C, size=0x00000020, fileOffset=0x00003F3C, type=0 __TEXT/__cstring addr=0x100003F5C, size=0x00000023, fileOffset=0x00003F5C, type=13 __TEXT/__unwind_info addr=0x100003F80, size=0x00000080, fileOffset=0x00003F80, type=22 __DATA_CONST/__got addr=0x100004000, size=0x00000038, fileOffset=0x00004000, type=30 __DATA/__la_symbol_ptr addr=0x100008000, size=0x00000060, fileOffset=0x00008000, type=28 __DATA/__data addr=0x100008060, size=0x00000008, fileOffset=0x00008060, type=0 __DATA/__common addr=0x100008068, size=0xE8D8EFB628, fileOffset=0x00000000, type=26 ld: ARM64 ADRP out of range (1000064020480 max is +/-4GB): from __Z4calcii (0x100003458) to _ans (0xE9D87623E8) in '__Z4calcii' from /var/folders/wt/sq4rgntj5ts4x5s29yct7rrh0000gn/T/forest-a1b0d5.o for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)