博客
关于我
小 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/

你可能感兴趣的文章
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Nginx配置负载均衡到后台网关集群
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>