求助蒟蒻以前从未见过的CE情况
  • 板块学术版
  • 楼主Andrewzdm
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/10/3 18:37
  • 上次更新2023/11/4 05:00:21
查看原帖
求助蒟蒻以前从未见过的CE情况
286770
Andrewzdm楼主2021/10/3 18:37

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)

2021/10/3 18:37
加载中...