『模拟赛』多校A层冲刺NOIP2024模拟赛19

Rank

byd CSP 之后就没场切过题😡😡😡

image

A. 图书管理

签,又寄了。

这种题直接做复杂度算着不对的话大概率就是要拆分贡献了。赛时用对顶堆维护的中位数,卡常到极致在 \(n=10^4\) 时要跑 1.2s。

感觉卡常有用所以写下来:发现如果每次新开一个堆结构最多只有 500500 个数,加上 STL 特性大概率会 RE,但是距离极限不大,所以可以对一个常数 \(\frac{3n}{4}\) 取模开这些数量的堆。发现每次清空是个耗时间的工作,但是左端点倒序枚举就能减少很多次可避免的删除操作。

发现对效率提升没用的:手动 O3;优先队列改成 set;register;快写。

那么考虑正解。对于每一位上的数统计取其值作为中位数的贡献之和。考虑将值大于当前值的数看作 1,小于的看作 -1,那么当某个区间和为 0 时即为当前值作为中位数的情况。考虑先向前扫,记录每个和的左端点位置之和(原因考虑乘法结合律);然后向右扫,为贡献加上 当前和的相反数的记录值 与 当前右端点位置 的积。最后用贡献乘上这个值即为当前点的贡献。复杂度 \(\mathcal{O(n^2)}\),完全不用卡常。

点击查看代码
#include<bits/stdc++.h>
#pragma GCC optimize(3)
#define fo(x, y, z) for(int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{char ch = getchar(); lx x = 0, f = 1;for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);return x * f;
}
#undef lx
#define qr qr()
#define pii pair<int, int>
#define fi first
#define se second
#define M_P(x, y) make_pair(x, y)
#define P_B(x) push_back(x)
#define int ll
const int Ratio = 0;
const int N = 1e5 + 5;
const int mod = 1e9 + 7;
int n;
int a[N], bz[N];
ll ans;
int v[N << 1];
namespace Wisadel
{short main(){freopen("book.in", "r", stdin), freopen("book.out", "w", stdout);n = qr;fo(i, 1, n) a[i] = qr;fo(i, 1, n){fill(v + 1, v + 1 + 2 * n, 0);bz[i] = 0;fo(j, 1, n) if(j != i) bz[j] = (a[j] > a[i]) ? 1 : -1;ll sum = 0, res = 0;fu(j, i, 1) sum += bz[j], v[sum + n] += j;sum = 0;fo(j, i, n) sum += bz[j], res += 1ll * v[n - sum] * j;ans += res * a[i];}printf("%lld\n", ans);return Ratio;}
}
signed main(){return Wisadel::main();}

B. 两棵树

结论题。

结论:连通块树 = 点数 - 边数。那么就可以将所求转化:

\[X\times Y=(V_T-E_T)\times (V_U-E_U)=V_T\times V_U-V_T\times E_U-V_U\times E_T+E_T\times E_U \]

分别讨论。

考虑 \(u\in V_T,v\in V_U\),当 \(u\neq v\) 时有贡献,概率为 \(\frac{1}{4}\),否则贡献为 0;总期望 \(\frac{n(n-1)}{4}\)

考虑 \(u\in V_T,v\in E_U\),当 \(u\)\(v\) 的两个端点均不同时有贡献,概率为 \(\frac{1}{8}\),否则贡献为 0;总期望为 \(\frac{(n-1)(n-2)}{8}\)

考虑 \(u\in E_T,v\in E_U\),当四个端点均不相同时有贡献,概率为 \(\frac{1}{16}\),否则贡献为 0。枚举所有边,符合条件的边数量为 \(n-1-deg_u-deg_v+[(u,v)\in E_T\ \operatorname{and}\ (u,v)\in E_U]\)

点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{char ch = getchar(); lx x = 0, f = 1;for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);return x * f;
}
#undef lx
#define qr qr()
#define pii pair<int, int>
#define fi first
#define se second
#define M_P(x, y) make_pair(x, y)
#define P_B(x) push_back(x)
#define int ll
const int Ratio = 0;
const int N = 2e5 + 5;
const int mod = 998244353;
int n;
int ds[N];
vector<pii> e;
map<pii, int> mp;
ll ans;
namespace Wisadel
{ll Wqp(ll x, int y){ll res = 1;while(y){if(y & 1) res = res * x % mod; x = x * x % mod; y >>= 1;}return res;}short main(){freopen("tree.in", "r", stdin), freopen("tree.out", "w", stdout);n = qr;fo(i, 1, n - 1){int a = qr, b = qr;if(a > b) e.P_B(M_P(b, a));else e.P_B(M_P(a, b));}fo(i, 1, n - 1){int a = qr, b = qr;ds[a]++, ds[b]++;pii zc = a > b ? M_P(b, a) : M_P(a, b);mp[zc] = 1;}ans = 1ll * n * (n - 1) % mod * Wqp(4, mod - 2) % mod;ans = (ans - 1ll * (n - 1) * (n - 2) % mod * Wqp(4, mod - 2) % mod + mod) % mod;ll zc = 0;fo(i, 0, n - 2) zc = (zc + n - 1 - ds[e[i].fi] - ds[e[i].se] + mp[M_P(e[i].fi, e[i].se)] + mod) % mod;ans = (ans + zc * Wqp(16, mod - 2) % mod) % mod;printf("%lld\n", ans);return Ratio;}
}
signed main(){return Wisadel::main();}

上个厕所回来更。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WSL 挂载虚拟磁盘

为了扩展 WSL 虚拟机的大小,可以在 D 盘创建一个虚拟硬盘文件作为 WSL 虚拟机的数据盘。创建虚拟硬盘文件。打开磁盘工具,点击 操作 > 创建 VHD 打开虚拟硬盘创建菜单,创建一个虚拟硬盘文件:挂载虚拟硬盘。打开终端(管理员),运行下面的命令找到刚刚新建的虚拟磁盘: …

HTML - 1

HTML - 1 基础内容 标签与标签属性 属性不区分大小写 (推荐小写)可以用双引号 也可以用单引号 (推荐双引号)重复的属性,后边的会失效通用属性:id: 给标签打上唯一标识 (head html meta script style title不能加) ​ class:指定标签类名,与样式配合 ​ style:…

umount的时候target is busy

https://blog.csdn.net/u013409979/article/details/139867156

关于JVM调优与实践

1.如何开始JVM调优 ——tomcat内部署war包 修改TOMCAT_HOME/bin/catalina.sh文件JAVA_OPTS="-Xms512m -Xmx1024m"——linux环境下jar包启动springboot项目 启动时使用nohup java -Xms512m -Xmx1024m -jar x.jar --spring.profiles.active=prod &nohup:在系统后天…

为什么编号应该从 0 开始

在常见的编程语言如 Python、Go、Java 中,序列的下标都是从 0 开始的,为什么不是从 1 开始呢? 迪杰斯特拉在 1982 年的时候就思考过编号起点的问题,那个时候还没有上面这 3 门语言呢。大概思路如下:序列下标是连续的整数,首先要考虑的就是怎么用区间范围表示连续的整数,…

编写高质量代码(手撕代码)

首先上几个面试题:(真难)1. 手写函数实现数组扁平化(只减少一级嵌套)思路:function flatten(arr) {let res = [];arr.forEach((item) => {if (Array.isArray(item)) {item.forEach((e) => res.push(e));} else {res.push(item);}});return res;}console.log(flatte…

LeetCode LCR135[报数]

LeetCode LCR135[报数]题目 链接 LeetCode LCR135[报数] 详情实例题解 思路 通过 pow 函数对10进行幂运算,来获取报数范围 然后循环遍历 通过 push_back 方法将数字加入到容器内 代码 class Solution { public:vector<int> countNumbers(int cnt) {vector<int> iR…

语音 AI 迎来爆发期,也仍然隐藏着被低估的机会丨RTE2024 音频技术和 Voice AI 专场

在人工智能快速发展的今天,语音交互技术正经历一场革命性的变革。从语音识别到语音合成,再到端到端的语音对话系统,这一领域的创新正以前所未有的速度推进。这些进步不仅提升了技术指标,更为实时翻译、虚拟数字人、智能客服等实时互动场景带来了新的可能。本届 RTE2024 大会…

节能攻略,AUTOSAR PN局部网络管理技术!

随着整车功能的不断演进,车上各类用电设备(控制器、执行机构、感知设备等)的用电功耗越来越大,为了降低整车能耗,国内外很多OEM及Tire1都在考虑相关的机制及方案,其中PN局部网络管理机制,以其简单、灵活的特点获得众多落地应用。 随着整车功能的不断演进,车上各类…

AUTOSAR解决方案 — INTEWORK-EAS-CP

INTEWORK-EAS-CP(ECU AUTOSAR Software)是经纬恒润自主研发的符合AUTOSAR标准的软件产品。解决方案涵盖了嵌入式标准软件、AUTOSAR工具链、集成服务和培训等各个方面的内容,旨在为国内的OEM和供应商提供稳定可靠、便捷易用的AUTOSAR平台。 随着汽车电子技术的发展,汽…

多校A层冲刺NOIP2024模拟赛19

讲个笑话: (讨论时间) huge:(叹气)这讨论啊,就是改不了,这换了铃声了,也没…… 众人:现在是讨论时间啊。 huge:(停顿)那刚才大课间那会哇啦哇啦的…… 图书管理 简要题意 给定一个长度为\(n(n\le 10^4)\)的排列,求\(\sum\limits_{l=1}^n\sum\limits_{r=l}^n[r-l为…

hive基础知识分享(二)

继续学习hive的相关知识写在前面 今天继续学习hive部分的知识。 以下是您提供的内容转成的 Markdown 格式: Hive 相关知识 hive中不同的 count 区别select clazz,count(distinct id) as cnt,count(*) as cnt,count(1) as cnt_1,count(id) as cnt_id from students group by cl…