2024初秋集训——提高组 #29

news/2024/12/21 20:05:24/文章来源:https://www.cnblogs.com/yaosicheng124/p/18445062

C. 卡片放置

题目描述

有一些卡片,写着两个数字 \(A_i,B_i\)。你要将这些这些卡片排列,其对于你的分数为 \(\max(A_i,B_i)\cdot i\),对于对手的分数为 \(\min(A_i,B_i)\cdot (N-i+1)\)。求令你的分数减对方分数的最大的方案数。

思路

我们来拆式子,这里令 \(A_i\ge B_i\)

\[\begin{array}{l} &A_i\cdot i-B_i\cdot (N-i+1)\\ =&A_i\cdot i-B_i\cdot N+B_i\cdot i-B_i\\ =&(A_i+B_i)\cdot i-(N+1)\cdot B_i \end{array} \]

后一项为定值,不看。很明显只有在 \(A_i+B_i\) 升序排列才最优,只有相同元素之间可以排列。预处理阶乘即可。

空间复杂度 \(O(N)\),时间复杂度 \(O(N\log N)\)

代码

#include<bits/stdc++.h>
using namespace std;const int MAXN = 100001, MOD = int(1e9) + 7;int n, a[MAXN], f[MAXN], ans = 1;int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n;f[0] = 1;for(int i = 1; i <= n; ++i) {cin >> a[i];f[i] = 1ll * f[i - 1] * i % MOD;}for(int i = 1, x; i <= n; ++i) {cin >> x;a[i] += x;}sort(a + 1, a + n + 1);for(int i = 1, j = 1; i <= n; i = j) {for(; j <= n && a[i] == a[j]; ++j) {}ans = 1ll * ans * f[j - i] % MOD;}cout << ans;return 0;
}

D. 合理架构

题目描述

有一个 \(N\) 个结点,以 \(1\) 为根的树,每个结点都有两个值 \(A_i,B_i\)。你要判断是否符合以下条件:

  • 对于所有 \(u,v\) 使得 \(u\)\(v\) 的祖先,要满足 \(A_u\ge A_v\and B_u\ge B_v\)
  • 对于所有 \(u\) 不是 \(v\) 的祖先,要满足 \(A_u<A_v\or B_u<B_v\)

思路

条件 1 显然判断一下父子之间的 \(A,B\) 即可。

对于条件 2,我们求每个点 \(u\) 有多少个点 \(v\) 不满足条件 2。这个就是离线二维数点。

可以发现,只有 \(u\) 的祖先会不满足条件 2。所以只需判断不满足数量是否等于 \(dep_u\) 即可。

空间复杂度 \(O(N)\),时间复杂度 \(O(N\log N)\)

代码

#include<bits/stdc++.h>
using namespace std;const int MAXN = 200001, INF = int(1e9) + 1;struct Tree_Array {int n, tr[MAXN];void Clear(int m) {n = m;fill(tr + 1, tr + n + 1, 0);}void update(int p, int x) {for(; p <= n; tr[p] += x, p += (p & -p)) {}}int Getsum(int p) {int sum = 0;for(; p; sum += tr[p], p -= (p & -p)) {}return sum;}
}tr;int t, n, a[MAXN], b[MAXN], dep[MAXN], ans[MAXN];
vector<tuple<int, int, int, int>> ve[MAXN];
vector<int> e[MAXN], A, B, vec[MAXN];bool dfs(int u, int fa) {if(fa && (a[u] > a[fa] || b[u] > b[fa])) {return 0;}dep[u] = dep[fa] + 1;for(int v : e[u]) {if(v != fa && !dfs(v, u)) {return 0;}}return 1;
}void Solve() {cin >> n;A.clear(), B.clear();for(int i = 0; i <= n; ++i) {ve[i].clear(), vec[i].clear();}for(int i = 1; i <= n; ++i) {cin >> a[i] >> b[i];e[i].clear();A.emplace_back(a[i]);B.emplace_back(b[i]);ans[i] = 0;}sort(A.begin(), A.end()), A.erase(unique(A.begin(), A.end()), A.end());sort(B.begin(), B.end()), B.erase(unique(B.begin(), B.end()), B.end());for(int i = 1; i <= n; ++i) {a[i] = lower_bound(A.begin(), A.end(), a[i]) - A.begin() + 1;b[i] = lower_bound(B.begin(), B.end(), b[i]) - B.begin() + 1;ve[a[i] - 1].emplace_back(b[i], n, -1, i);ve[n].emplace_back(b[i], n, 1, i);vec[a[i]].emplace_back(b[i]);}for(int i = 1, u, v; i < n; ++i) {cin >> u >> v;e[u].emplace_back(v);e[v].emplace_back(u);}if(!dfs(1, 0)) {cout << "NO\n";return;}tr.Clear(n);for(int i = 1; i <= n; ++i) {for(int x : vec[i]) {tr.update(x, 1);}for(auto [l, r, x, id] : ve[i]) {ans[id] += (tr.Getsum(r) - tr.Getsum(l - 1)) * x;}}for(int i = 1; i <= n; ++i) {if(ans[i] != dep[i]) {cout << "NO\n";return;}}cout << "YES\n";
}int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);for(cin >> t; t--; Solve()) {}return 0;
}

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

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

相关文章

记一次虚拟机无法 ping 通百度的解决方法

先运行ip a查看网卡: 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 sc…

Apache POI 创建 Excel

数据来自 通义千问🎈依赖包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version> </dependency> v5.2.2。创建Excel xlsx 格式。简单版 创建一个包含数据的 Excel 文…

CTB2024

RT活动官网 https://www.chinathinksbig.com/ To DoIMPORTANT 10.14 提前批报名截止 确认要参加的话赶紧把钱交了先注意:付钱(1490 好贵)之后才能组队在国庆期间开个会 大致考虑一下课题,尽量可以拐一下以下几个点弱势群体 环境保护 文化保护和传承一些东西

10.1 ~ 10.6

国庆10.1 你说的对,但是我们今天还要打模拟赛; 但是打完模拟赛就放假 那我什么时间改呢 😅 开题。一眼就看到了 Delov,gtm 和 joke; 学长限时回归了? T1 想了半天 \(O(n)\) 之后发现可以 \(O(n \log n)\),打。打完过了全部大样例,直接开 T2。 T2 上来第一眼树剖板子,…

git学习笔记 1

1、安装配置 git 安装:https://git-scm.com/book/zh/v2/起步-安装-Git 文档:https://git-scm.com/docs 初次配置git config --global user.name "你的名字"git config --global user.email "你的邮箱"检测配置是否成功 git config --list在里面找到 user…

高级语言程序设计课程第二次作业

班级链接:https://edu.cnblogs.com/campus/fzu 作业要求链接:https://edu.cnblogs.com/campus/fzu/2024C/homework/13282 学号:102400204 姓名:刘嘉奕 3.11编程作业 作业1作业2作业3双引号的打印需要使用转义序列作业4第一个打印中value后的%f去掉,打印p计数法用%a作业5作…

CF589H Tourist Guide

昨晚码敲完了没保存,导致还原卡直接把我码肘没了。。。 气死了只能重新敲了一遍。 题面 Tourist Guide 分析 考虑每一个联通块分开处理。 先将每一个联通块变为生成树,任意生成方式皆可。 对于每一个联通块,一定可以构造一种组合方法,使得该联通块中最多只有一个关键点无法…

2024新生赛-Week1

F12 快捷键f12直接查看字符串 xor 了解一下XOR运算,AB=C,CA=B 使用a数组对输入的字符进行循环运算取出最终的字符串再进行一次xor即可得到flag Ezencode进入加密函数后发现是一个base64算法,对表进行了替换,最后有对编码得到的结果进行异或操作. 提出最后的密文,进行异或,换表,…

DAY2-补题

我补题AK了,但你出言不逊是 非常好的一套题,让我的大脑旋转啊。 不太想开一个文章单独屑,所以扔到随笔里面。 敲字速度有待加强。 说在前面 题目难度单调递减,分数单调递减。果然屑死了。 T1再次读题失误,正确的来说是代码敲得非常抽象。T2DP但没骗到分非常不好,T3场上想…

独立站如何批量查收录,教你独立站如何批量查收录的方法操作步骤

独立站批量查收录是SEO优化工作中的重要环节,有助于网站管理员或SEO人员及时了解网站在搜索引擎中的表现,从而制定针对性的优化策略。以下是一些常用的独立站批量查收录的方法及其操作步骤: 一、使用搜索引擎的Site指令结合自动化脚本 编写脚本或配置爬虫: 利用Python、She…

04-论说文:审题与立意(1)

命题作文 比较开放 近义词 相关性 竞争 合作 竞争合作 ==》 竞争合作的关系 概率==》风险 风险 利益 审题 较难

pycharm 拆分窗口, 取消分屏; VS code 分屏

Split Vertically 或者 Split Horizontally 可以把当前编辑窗口垂直或者水平拆分成两个。 Split Vertically或者Split Horizontally可以把当前编辑窗口垂直或者水平拆分成两个。 取消拆分窗口: VS code 分屏: