萌新妹子3模数hash求调
查看原帖
萌新妹子3模数hash求调
642247
快速herself变换楼主2023/3/30 22:47

RT,试了两种写法一直15分,求调

#include<bits/stdc++.h>
#define il inline
#define re register
#define ll long long
#define ull unsigned ll
#define uint unsigned int
#define umap unordered_map
#define uset unordered_set
#define mset multiset
#define IT iterator
#define pr pair
#define pq priority_queue
#define mpr make_pair
#define int ll
#define tp tuple
#define mtp make_tuple
const int N = 1e6 + 5, inf = 0x3f3f3f3f;
const double pi = acos(-1);
il int R () {
    int s = 0, f = 1; char ch = getchar();
    while (!isdigit(ch)) f = (ch == '-') ? -1 : 1, ch = getchar();
    while (isdigit(ch)) s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar(); 
    return s * f; 
}
int n, tot, ans = inf, maxdep;
int head[N], nxt[N], to[N], a[N], child[N], dep[N], cnt[N], fa[N];
il void add_edge (int u, int v) {
    nxt[++tot] = head[u], to[tot] = v, head[u] = tot;
    return ;
}
il void dfs (int u, int fath) {
    fa[u] = fath, dep[u] = dep[fath] + 1, child[fath]++, cnt[dep[u]]++;
    for (int i = head[u]; i; i = nxt[i]) {
        int v = to[i];
        if (v == fath) continue;
        dfs(v, u);
    }
    return ;
}
int mod[4] = {0, 19260817, 1000000007, 998244353};
struct node {
    int val[4];
}f[N];
std :: map <std :: tp <int, int, int>, int> vis;
il void dfs2 (int u, int mul1, int mul2, int mul3) {
    f[u].val[1] = a[u] * mul1 % mod[1] * child[fa[u]] % mod[1];
    f[u].val[2] = a[u] * mul2 % mod[2] * child[fa[u]] % mod[2];
    f[u].val[3] = a[u] * mul3 % mod[3] * child[fa[u]] % mod[3];
    std :: tp <int, int, int> tmp = std :: mtp(f[u].val[1], f[u].val[2], f[u].val[3]);
    vis[tmp]++;
    ans = std :: min(ans, n - vis[tmp]);
    for (int i = head[u]; i; i = nxt[i]) {
        int v = to[i];
        if (v == fa[u]) continue;
        dfs2(v, mul1 * cnt[dep[u]] % mod[1], mul2 * cnt[dep[u]] % mod[2], mul3 * cnt[dep[u]] % mod[3]);
    }
    return ;
}
signed main () {
    n = R();
    for (int i = 1; i <= n; i++) a[i] = R();
    for (int i = 1; i < n; i++) {
        int u = R(), v = R();
        add_edge(u, v), add_edge(v, u);
    }
    dfs(1, 0), dfs2(1, 1, 1, 1);
    return !printf("%lld", ans);
}
2023/3/30 22:47
加载中...