2024 杭电多校第一场

news2024/12/23 13:26:14

目录

目录

博弈

传送


给一棵根为 1 的有根树,点 i 具有一个权值 Ai 。

定义一个点对的值 f(u,v)=max(Au,Av)×|Au−Av| 。

你需要对于每个节点 i ,计算 ansi=∑u∈subtree(i),v∈subtree(i)f(u,v) ,其中 subtree(i) 表示 i 的子树。

请你输出 ⊕(ansi mod 2^64) ,其中 ⊕ 表示 XOR。


满足 n≤5×105,1≤Ai≤106

用到线段树合并+权值线段树

max(Au,Av)*|Au-Av| = max(Au,Av) * max(Au,Av) - max(Au,Av) * min(Au,Av)

= max(Au,Av)^2 -Au*Av

考虑用线段树维护三个值:区间和、区间平方和、区间个数

右区间一定大于左区间,当我们算两个子树合并的贡献时,用右区间的区间平方数乘上左区间的区间个数可以得到 \sum max(Au,Av)^2 (u,v都在i子树内,且跨越i相连),  左右区间和相乘可以得到\sum (Au,Av)

如果v在u子树里,v子树的答案已经算过了,在算u时直接加上v的答案即可。

关于线段树合并+权值线段树的复杂度:

是权值线段树,总点数和n的规模相差并不大。并且合并时一般不会重复地合并某个线段树,所以我们最终增加的点数大致是nlogn级别的。这样,总的复杂度就是nlogn级别的。(摘自oiwiki)

另外注意的小点:

⊕(ansi mod 2^64) 直接用unsigned long long 自然溢出即可,mod会爆

献上调了两小时的代码一份:

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int N = 2e6 + 10;
int a[N];
vector<int> to[N];
int dp[N], rt[N << 3], ls[N << 3], rs[N << 3], sz[N << 3];
int sum[N << 3], sum2[N << 3];

void update(int id) {
    sum2[id] = sum2[ls[id]] + sum2[rs[id]];
    sum[id] = sum[ls[id]] + sum[rs[id]];
    sz[id] = sz[ls[id]] + sz[rs[id]];
}
int now ;
int merge(int a, int b, int x, int y) {
    if (!a)return b;
    if (!b)return a;
    if (x == y) {
        sz[a] += sz[b];
        sum2[a] += sum2[b];
        sum[a] += sum[b];
        return a;
    }
    int mid = (x + y) >> 1;
    if (ls[a] != 0 && rs[b] != 0) {
       now += sz[ls[a]] * sum2[rs[b]] * 2ll,now -= sum[ls[a]] * sum[rs[b]] * 2ll;
    }
    if (ls[b] != 0 && rs[a] != 0) {
        now+= sz[ls[b]] * sum2[rs[a]] * 2ll, now -= sum[ls[b]] * sum[rs[a]] * 2ll;
    }
    ls[a] = merge(ls[a], ls[b], x, mid);
    rs[a] = merge(rs[a], rs[b], mid + 1, y);
    update(a);
    return a;
}

int cnt = 0;

int add(int &id, int x, int y, int co) {
    if (!id) id = ++cnt;
    if (x == y) {
        sum2[id] += co * co;
        sum[id] += co;
        sz[id]++;
        return id;
    }
    int mid = (x + y) >> 1;
    if (co <= mid) {
        ls[id] = add(ls[id], x, mid, co);
    } else {
        rs[id] = add(rs[id], mid + 1, y, co);
    }
    update(id);
    return id;
}

int ans = 0;
void dfs(int x, int f) {
    int res = 0;
    add(rt[x], 1, 1000000, a[x]);
    for (int i = 0; i < to[x].size(); i++) {
        int v = to[x][i];
        if (v == f)continue;
        dfs(v, x);
        res += dp[v];
        now = 0;
        merge(rt[x], rt[v], 1, 1000000);
        res+=now;
    }
    dp[x] = res;
    ans ^= res;
    return;
}

void solve() {
    int n;
    cin >> n;
    for (int i = 1; i <= n - 1; i++) {
        int u, v;
        cin >> u >> v;
        to[u].push_back(v);
        to[v].push_back(u);
    }
    for (int i = 1; i <= n; i++)cin >> a[i];
    dfs(1, -1);
    cout << ans << '\n';
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int _ = 1;
    while (_--) solve();
    return 0;
}

博弈

小马给出了一个可重小写字符集合 S。

Alice 初始时有空串 A,Bob 初始时有空串 B。

两人轮流等概率取出集合 S 中的一个字符 c,将它拼接到自己的字符串的后面,直至 S 为空,每个字符只能被取一次,Alice 先手。

如果最终 A 的字典序严格大于 B,则 Alice 胜利,求其获胜的概率,答案对 998244353取模。

考虑sum=\sum hi 为偶数的情况:

i)平局,所有字符都有偶数个:

A先手随便拿一个字符ai,B后手跟着拿ai,A继续拿aj,B跟着拿aj,那么平局的概率p就是\frac{sum}{sum} *\frac{a_{i}-1}{sum-1} * \frac{sum-2}{sum-2} *\frac{a_{i}-3}{sum-3}...=\frac{\left ( a_{i}-1\right )*\left ( a_{i}-3\right )*\left ( a_{i}-5\right )...}{\left ( sum-1\right )*\left ( sum-3\right )*\left ( sum-5\right )...}

ii)非平局的情况,无非胜或败,败的情况翻转一下就是胜,所以胜局的概率就是\frac{1-p}{2}

sum为奇数的情况:

i)讨论前sum-1个可以达到平局的情况,在这个情况下由于A先手,所以A必胜

     此时所有字符有且只有一个奇数a[idx],我们先将这个奇数拿出一个,然后重复上面的平局过程:

       易得p=\frac{a[idx]}{sum}\frac{\left ( a_{i}-1\right )*\left ( a_{i}-3\right )*\left ( a_{i}-5\right )... a[idx-2]*a[idx-4]...}{\left ( sum-2\right )*\left ( sum-4\right )*\left ( sum-6\right )...}

       我们可以简化计算,当拿出了奇数中的一个后,a[idx]--,sum--。(具体看代码就懂了)

ii)前sum-1个非平局的情况,无非胜或败,败的情况翻转一下就是胜,此时胜局的概率就是\frac{1-p}{2}

iii)总的来说,此时胜局的概率就是\frac{1+p}{2}

#include<bits/stdc++.h>

#define int long long
using namespace std;
typedef long long ll;
const int N = 1e7 + 10;
const int mod = 998244353;

int a[30], n, f[N];

ll poww(ll a, ll b) {

    ll t = 1;
    while (b) {
        if (b & 1)t = t * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return t;

}

void init() {

    f[1] = 1;
    for (int i = 3; i <= N - 5; i += 2) {
        f[i] = f[i - 2] * i % mod;
    }

}

void mul(int &a, int b) {
    a = ((a % mod * b % mod) + mod) % mod;
}

void solve() {
    cin >> n;
    int sum = 0, cnt = 0, idx = -1;
    char c;
    for (int i = 1; i <= n; i++) {
        cin >> c >> a[i], sum += a[i];
        if (a[i] & 1) cnt++, idx = i;
    }

    int p = 1;

    if (sum & 1) {

        if (cnt != 1) p = 0;
        else {
            mul(p, a[idx] * poww(sum, mod - 2) % mod);
            sum--;
            mul(p, poww(f[sum - 1], mod - 2));
            for (int i = 1; i <= n; i++) {
                if (i == idx) {
                    if (a[i] > 2)mul(p, f[a[i] - 2]);
                } else {
                    mul(p, f[a[i] - 1]);
                }
            }
        }

        cout << ((1 + p) % mod * poww(2, mod - 2)) % mod << '\n';

    } else {

        if (cnt != 0)p = 0;
        else {
            mul(p, poww(f[sum - 1], mod - 2));
            for (int i = 1; i <= n; i++) {
                mul(p, f[a[i] - 1]);
            }
        }

        cout << ((1 - p + mod) % mod * poww(2, mod - 2) % mod + mod) % mod;

    }

}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int _ = 1;
    init();
    cin >> _;
    while (_--) solve();
    return 0;
}
/*
1
2
a 2
c 2
332748118
 */

传送

线段树分治+可撤销并查集

学了之后发现是板子题,贴个链接https://blog.csdn.net/landexiangmz/article/details/140587889?spm=1001.2014.3001.5502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1939584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何让LabVIEW程序框图的图标简化,从而节省空间?

再点击选项 取消掉箭头所示的√即可。 这样就可以将生成的图标从下面所示&#xff1a; 变成简化的图标&#xff0c;如下所示&#xff1a;

UML的六大关系---泛化、实现、关联、聚合、组合、依赖

文章目录 前言1. 泛化关系(Generalization)2. 实现关系(Realization)3. ‌关联关系(Association)4. 聚合关系(Aggregation)5. 组合关系(Composition)6. 依赖关系(Dependency)总结 前言 讲到设计模式&#xff0c;就会有 U M L UML UML类图这个东西。 一开始就很难理解各种线啥意…

【Spring Boot】网页五子棋项目中遇到的困难及解决方法

目录 一、HikariPool-1 - Starting异常二、Invalid bound statement (not found)异常三、The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary异常四、The server time zone value时区报错异常五、补充知识点…

CSS技巧专栏:一日一例 6 - 纯CSS实现粉红色跳出来的立体按钮特效

纯CSS实现粉红色跳出来的立体按钮特效 今天要介绍的案例,是个相对简单的按钮效果,我们先看图: 案例分析 我说它简单,因为它实际上并没有使用什么特别的动画效果,只是几个简单的动画组合: 利用伪类before和after,制作按钮后面两个透明的粉色填充层,左右移动。给文字层…

代码随想录算法训练营第23天|39. 组合总和、40.组合总和II、131.分割回文串

打卡Day23 1.39. 组合总和2.40.组合总和II3.131.分割回文串 1.39. 组合总和 题目链接&#xff1a;39. 组合总和 文档讲解&#xff1a; 代码随想录 这道题和昨天做的组合之和由两个区别&#xff1a;被选的元素没有数量限制&#xff0c;同时被选的元素可以无限重复&#xff0c;…

区块链技术实现数字电网内数据可信共享 |《超话区块链》直播预告

随着全球电力市场朝着构建“SmartGrid”和“IntelliGrid”的目标发展&#xff0c;国内电力公司也提出了构建“数字电网”的愿景。清大科越推出新型电力系统区块链服务平台&#xff0c;通过便捷的建链、上链、用链及治链能力&#xff0c;有效解决数字电网各主体间数据共享的信任…

QT--网络篇

如果QT头文件找不到QTcpSocket、QTcpSocket、QTcpServer、QtNetwork ,那么可能是pro文件中缺少QT network这行代码 客户端QTcpSocket void QTcpSocket::connectToHost( QString servip, quint16 port ); connectToHost 函数会尝试与指定的服务器建立 TCP 连接。如果连接成…

代码随想录算法训练营第35天|LeetCode 01背包问题 二维、01背包问题 一维、416. 分割等和子集

1. LeetCode 01背包问题 二维 题目链接&#xff1a;https://kamacoder.com/problempage.php?pid1046 文章链接&#xff1a;https://programmercarl.com/背包理论基础01背包-1.html#算法公开课 视频链接&#xff1a;https://www.bilibili.com/video/BV1cg411g7Y6/ 思路&#xf…

【Vue】`v-if` 指令详解:条件渲染的高效实现

文章目录 一、v-if 指令概述二、v-if 的基本用法1. 基本用法2. 使用 v-else3. 使用 v-else-if 三、v-if 指令的高级用法1. 与 v-for 一起使用2. v-if 的性能优化 四、v-if 的常见应用场景1. 表单验证2. 弹窗控制 五、v-if 指令的注意事项 Vue.js 是一个用于构建用户界面的渐进式…

在 PostgreSQL 里如何实现数据的冷热数据分层存储的自动化策略调整?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何实现数据的冷热数据分层存储的自动化策略调整 在 PostgreSQL 里如何实现数据的冷…

最新可用度盘不限速后台系统源码_去授权开心版

某宝同款度盘不限速后台系统源码&#xff0c;验证已被我去除&#xff0c;两个后端系统&#xff0c;账号和卡密系统 第一步安装宝塔&#xff0c;部署卡密系统&#xff0c;需要环境php7.4 把源码丢进去&#xff0c;设置php7.4&#xff0c;和伪静态为thinkphp直接访问安装就行 …

bootstrap中文文档官网

Bootstrap v3 中文文档 Bootstrap 是最受欢迎的 HTML、CSS 和 JavaScript 框架&#xff0c;用于开发响应式布局、移动设备优先的 WEB 项目。 | Bootstrap 中文网

PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动一、理解索引抖动二、索引抖动的影响三…

C语言:温度转换

1.题目&#xff1a;实现摄氏度&#xff08;Celsius&#xff09;和华氏度&#xff08;Fahrenheit&#xff09;之间的转换。 输入一个华氏温度&#xff0c;输出摄氏温度&#xff0c;结果保留两位小数。 2.思路&#xff1a;&#xff08;这是固定公式&#xff0c;其中 F 是华氏度&a…

DL/T645-2007_Part1(协议帧解析)

帧结构 起始字符68H地址域起始字符68H控制码C数据域长度L数据域校验和CS结束字符16H1Byte6Byte1Byte1Byte1ByteN Byte1Byte1Byte 地址域 地址域为6个字节的BCD码构成&#xff0c;当使用的地址码长度不足6字节&#xff0c;高位用0补足&#xff1b;当通信地址为99999999999H时…

自学 阿里巴巴Java开发手册最新版(嵩山版)

&#x1f534; 阿里巴巴Java开发手册最新版&#xff08;嵩山版&#xff09; 一、编程规约(一) 命名风格(二) 常量定义(三) 代码格式(四) OOP 规约(五) 日期时间(六) 集合处理(七) 并发处理(八) 控制语句(九) 注释规约(十) 前后端规范 二、异常日志(一) 错误码(二) 异常处理(三)…

【BUG】已解决:python setup.py bdist_wheel did not run successfully.

已解决&#xff1a;python setup.py bdist_wheel did not run successfully. 目录 已解决&#xff1a;python setup.py bdist_wheel did not run successfully. 【常见模块错误】 解决办法&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主…

自动驾驶-预测概览

通过生成一条路径来预测一个物体的行为&#xff0c;在每一个时间段内&#xff0c;为每一辆汽车重新计算预测他们新生成的路径&#xff0c;这些预测路径为规划阶段做出决策提供了必要信息 预测路径有实时性的要求&#xff0c;预测模块能够学习新的行为。我们可以使用多源的数据…

NetSuite Saved Search迁移工具

我们需要在系统间迁移Saved Search&#xff0c;但是采用Copy To Account或者Bundle时&#xff0c;会有一些Translation不能迁移&#xff0c;或者很多莫名其妙的Dependency&#xff0c;导致迁移失败。因此&#xff0c;我们想另辟蹊径&#xff0c;借助代码完成Saved Search的迁移…

数据库事务隔离级别及底层原理详解

本文详细记录了数据库中事务的隔离级别及其定义&#xff0c;以及每个隔离级别下可能会遇到哪些问题及对应的解决方案和原理&#xff0c;以下内容结合为各大平台的知识点加自己的理解进行的总结&#xff0c;希望大家在读完以后能对事务有个全新的认识~~ 1. MySQL事务管理 自动…