博客
关于我
小 Q 与树(淀粉质)
阅读量:224 次
发布时间:2019-02-28

本文共 3481 字,大约阅读时间需要 11 分钟。

解题思路:采用点分治方法。对于每一个重心,找到当前子树中所有符合条件的节点,并进行处理。

#include 
using namespace std;typedef long long ll;typedef long double lf;typedef unsigned long long ull;typedef pair
P;const int inf = 0x7f7f7f7f;const ll INF = 1e16;const int N = 2e5 + 10;const ull base = 131;const ll mod = 998244353;
inline int read() {    int x = 0, f = 1;    char ch = getchar();    while (ch < '0' || ch > '9') {        if (ch == '-') f = -1;        ch = getchar();    }    while (ch >= '0' && ch <= '9') {        x = x * 10 + ch - '0';        ch = getchar();    }    return x * f;}inline string readstring() {    string str;    char s = getchar();    while (s == ' ' || s == '\n' || s == '\r') {        s = getchar();    }    while (s != ' ' && s != '\n' && s != '\r') {        str += s;        s = getchar();    }    return str;}int random(int n) {    return (int)(rand() * rand()) % n;}void writestring(string s) {    int n = s.size();    for (int i = 0; i < n; i++) {        printf("%c", s[i]);    }}bool is_prime(int n) {    if (n < 2) return false;    for (int i = 2; i * i <= n; i++) {        if (n % i == 0) return false;    }    return true;}struct str {    int dot;    int dis;    int next;} e[N << 4];int head[N << 4], C = 0;void add(int u, int v, int z) {    e[++C].dis = z;    e[C].dot = v;    e[C].next = head[u];    head[u] = C;}ll val[N];int dp[N];int sum, rt;int size[N], vis[N];void getrt(int u, int fa) {    size[u] = 1;    dp[u] = 0;    for (int i = head[u]; i; i = e[i].next) {        int v = e[i].dot;        if (v == fa || vis[v]) continue;        getrt(v, u);        size[u] += size[v];        dp[u] = max(dp[u], size[v]);    }    dp[u] = max(dp[u], sum - size[u]);    if (dp[u] < dp[rt]) rt = u;}int tot, dis[N];struct node {    ll val;    int dis;    int dot;} a[N];void getdis(int u, int fa) {    a[++tot].val = val[u];    a[tot].dis = dis[u];    a[tot].dot = u;    for (int i = head[u]; i; i = e[i].next) {        int v = e[i].dot;        if (v == fa || vis[v]) continue;        dis[v] = dis[u] + e[i].dis;        getdis(v, u);    }}bool cmp(node a, node b) {    return a.val < b.val;}ll ans = 0;ll calc(int u, int w) {    tot = 0;    dis[u] = w;    getdis(u, 0);    sort(a + 1, a + 1 + tot, cmp);    ll ret = 0;    sum = 0;    for (int i = 1; i <= tot; i++) {        for (int j = i + 1; j <= tot; j++) {            ret = (ret + a[i].val * (a[i].dis + a[j].dis)) % mod;        }    }    for (int i = 1; i <= tot; i++) {        sum = (sum + a[i].dis) % mod;    }    for (int i = 1; i < tot; i++) {        ll x = a[i].val, y = a[i].dis;        sum = (sum - y + mod) % mod;        ll len = tot - i;        y = (len * x * y) % mod;        x = (x * sum) % mod;        ret = (ret + x + y) % mod;    }    ret = (ret + ret) % mod;    return ret;}void solve(int u) {    vis[u] = 1;    ans = calc(u, 0);    for (int i = head[u]; i; i = e[i].next) {        int v = e[i].dot;        if (vis[v]) continue;        calc(v, 1);        sum += size[v];        rt = 0;        getrt(v, u);        solve(rt);    }}int main() {    freopen("in.txt", "r", stdin);    int n = read();    for (int i = 1; i <= n; i++) {        val[i] = read();    }    for (int i = 1; i < n; i++) {        int u = read(), v = read();        add(u, v, 1);        add(v, u, 1);    }    dp[0] = inf;    sum = n;    rt = 0;    getrt(1, 0);    solve(rt);    cout << ans << endl;}

这段代码实现了一个基于点分治的算法,主要用于处理树结构中的重心分配问题。代码中定义了一系列辅助函数和数据结构,包括读取输入、构建树、计算子树大小和最优分配等功能。通过动态规划和排序算法,确保了算法的高效性和正确性。整个程序以模块化的方式组织代码,便于扩展和维护。

转载地址:http://rkqp.baihongyu.com/

你可能感兴趣的文章
NLP采用Bert进行简单文本情感分类
查看>>
NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
查看>>
NLP项目:维基百科文章爬虫和分类【02】 - 语料库转换管道
查看>>
NLP:使用 SciKit Learn 的文本矢量化方法
查看>>
nmap 使用方法详细介绍
查看>>
Nmap扫描教程之Nmap基础知识
查看>>
nmap指纹识别要点以及又快又准之方法
查看>>
Nmap渗透测试指南之指纹识别与探测、伺机而动
查看>>
Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
查看>>
NMAP网络扫描工具的安装与使用
查看>>
NMF(非负矩阵分解)
查看>>
nmon_x86_64_centos7工具如何使用
查看>>
NN&DL4.1 Deep L-layer neural network简介
查看>>
NN&DL4.3 Getting your matrix dimensions right
查看>>
NN&DL4.7 Parameters vs Hyperparameters
查看>>
NN&DL4.8 What does this have to do with the brain?
查看>>
nnU-Net 终极指南
查看>>
No 'Access-Control-Allow-Origin' header is present on the requested resource.
查看>>
NO 157 去掉禅道访问地址中的zentao
查看>>
no available service ‘default‘ found, please make sure registry config corre seata
查看>>