CSP 集训(9.23-9.26)

news/2024/10/10 9:25:47/文章来源:https://www.cnblogs.com/YuenYouth/p/18427727

用来整理模拟赛等

9.23

csp-3【noip23 ZR二十连测 DAY10】

保龄.

A.奇观

狗市题目描述。

image

不是这题意太大歧义了吧,我讨厌的第二种出题人——题意描述相当不清。

CTH:13 座城市又不代表是 13 座不同的城市。

直接看形式化题目的话(如果能看懂要干什么)那这题确实不难。

解:

容易发现,答案就是 \(C\times C \times F\)。(\(C、F\) 分别表示组成一个 C、F 的方案数)

关键在于 \(CCF\) 怎么求?看懂题意的话,较容易明白:

\(v1_i =∑_j[(i, j) ∈ E] ,v2_i=∑_{j,k} [(i, j) ∈ E ∧ (j, k) ∈ E] = ∑_j[(i, j) ∈ E]v1_j\)

分别为以 \(i\) 为端点能拼成如下形式的方案数。
image

那么有 \(C=\sum_i v1_i\times v2_i\)\(F = \sum v1_i \times \ v1_i \times v2_i\)

显然 \(v1_i\) 其实就等于删去 \(m\) 条边后的出度。现在考虑 \(v2_i\) 如何求。

我们再求一个 \(sum=\sum_i v1_i\),把每个 \(v2_i\) 都赋成 \(sum\),删去了哪些 \(i,j\) 相连的边,就减去 \(v1_j\) 即可。

B.铁路

image

随便钦定一个根跑 \(dfs\) 得到所有点的深度 \(dep\) 和父节点 \(fa\)

并查集维护连通块,每次把要合并的点都合并到其中深度最浅的点的并查集上,把 \(n+i\) 映射到这个最浅点上就好了。

C.光纤

9.24 补 从下午 14:00 调到 21:00,救命啊!

需要知识:凸包 向量叉积 旋转卡壳

  • 构建一个包含所有点的凸包。

丁真的引理:答案直线就是平行于凸包所有边的直线中最优的那个。

显然:对于凸包的一条边,凸包上的点到该边的距离中最大的那个的一半就是该边对答案的贡献。

如下图中蓝边对于答案的贡献就是红色虚线(最远点到该边距离)的一半。

image

  • 旋转卡壳 \(O(n)\) 找凸包上的每一条边的最远点,叉积计算最远点的距离,计算答案。
code
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;const int N = 1e6 + 10;int n, m, top, H;
pair<__int128, __int128>ans;struct point{__int128 x, y;bool operator < (const point &A)const{return x == A.x ? y < A.y : x < A.x;}
}a[N], s[N], q[N];char anss[N];
inline void print(__int128 x){if(!x)putchar('0');else{if(x<0)x=-x,putchar('-');int cnt=0;while(x)anss[++cnt]=x%10+'0',x/=10;for(int i=cnt;i;--i)putchar(anss[i]);}
}point operator - (point A, point B){return {A.x - B.x, A.y - B.y};}inline double Cross(point A, point B){return (double)(B.y - A.y) / (B.x - A.x);} //算直线斜率inline void Andrew(){ //Andrew 算法建凸包for(int i=1; i<=n; i++){while(top > 1 and Cross(s[top], a[i]) <= Cross(s[top-1], s[top])) top--;s[++top] = a[i];}int k = 0;for(int i=n; i>=1; i--){while(k > 1  and Cross(a[i], q[k]) <= Cross(q[k], q[k-1])) k--;q[++k] = a[i];}for(int i=2; i<k; i++) s[++top] = q[i];s[++top] = s[1]; // s[] 中存凸包上的每个点
}inline __int128 Pf(__int128 x){return x * x;}inline __int128 dis(point a, point b){return Pf(a.x - b.x) + Pf(a.y - b.y);}inline __int128 _abs(__int128 x) {return x > 0 ? x : -1 * x;}inline __int128 GetSum(point a, point b, point c){ //已知 a,b,c 三点,叉积求三点围成的三角形面积的两倍return _abs((b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y));
}inline void GetHigh(){int j = 3; //旋转卡壳计算答案for(int i=1; i<top; i++){while(GetSum(s[i], s[i+1], s[j]) <= GetSum(s[i], s[i+1], s[j+1==top ? 1:j+1]))j = (j + 1 == top ? 1 : j + 1);if(!ans.second or 1.0 * ans.first / ans.second > 1.0 * Pf(GetSum(s[i], s[i+1], s[j])) / dis(s[i], s[i+1]))ans.first = Pf(GetSum(s[i], s[i+1], s[j])), ans.second = dis(s[i], s[i+1]); //first,second 分别为答案的分子分母}
}int main(){freopen("a.in", "r", stdin), freopen("a.out", "w", stdout);ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin>>n;if(n == 2){cout<<"0/1\n"; return 0;}for(int i=1; i<=n; i++){int x, y; cin>>x>>y;a[i].x = x, a[i].y = y;}sort(a+1, a+1+n);n = unique(a+1, a+1+n, [](const point &A, const point &B){return A.x==B.x&&A.y == B.y;}) - (a+1);Andrew();GetHigh();__int128 gcd = __gcd(ans.first, ans.second*4); //因为面积算的是三角形的两倍,平方后就是四倍,分母乘以 4print(ans.first/gcd); putchar('/'); print(ans.second*4/gcd);return 0;
}

CSP-4

9.25 由上文可知,改了一下午和一晚上的凸包( 先咕网络流和超级分讨了!

A.商品

9.26 早读偷偷打的。。。本来在被 \(**\) 下发题解折磨, 5k 讲了一个很简单也很快的解法,绝!

首先显然区间长度为 \(d\) 时才能最优\(l\) 确定时,\(r\) 则为 \(l+d\)

这个题是想让我们求不同的 \([l,r]\) 区间中所有两两相邻数的差,\(\sum _{i=1} ^{n}|a_i-a_{i+1}|\) ,也就是 \(\sum a_i和a_{i+1}中大减小\),可以转化为 \(\sum 大 - \sum 小\)。那么我们把所有 \(a_i 和 a_{i+1}\) 中大的存到一个数组 \(b\) 里,小的存到一个数组 \(c\) 里,分别排序。

还有一个显然的结论:区间一端固定在一个原序列的元素上时较优这是 \(60pts\) 暴力需要的结论

那么 \(l\)\(r\) 最多只有 \(2\times n\) 种情况,所以 \(O(n)\) 枚举当前哪一个元素作为区间的一端,对于每一组区间 \([l,r]\),用二分找区间外的元素,前缀和维护区间内的元素,大总和减小总和就是当前区间的答案,所有区间的答案取 min 即可。

B.价值

发现多写几层循环的话不用那么多分讨了,设 \(f_{i,0/1,0/1,0/1}\) 表示 \(i\) 这个点是否匹配上,以该点为根的子树中最左边的叶子结点是否向左匹配,最右边的叶子结点是否向右匹配 的状态下的方案数。

注:点是否匹配指该点的连边是否选进一个边集里。

设计状态转移就行,有些细节但不难设计。

C.货币

9.26 花了一上午学了网络流,发现算法没搞的很明白,但在 lxyt 的细心教导下,把建模搞清楚了。

写了 题解

多校-1

DP 专场,只拿了 T1 60pts 暴力。

image

A.几何

发现我能看着官方题解打出这个题挺不容易的,其实可能赛后看下发题解改题比赛时 AC 还难吧。

\(f_{i,j,k}\) 表示 \(s\)\([1,i]\) 位可以由 (\(x\) 重复加上 \(x_{[1,j]}\))$ + $ (\(y\) 重复加上 \(y_{[1,k]}\) )构成。转移如下:

image

发现炸时空,考虑用位运算优化,bitset\(f_{i,j}\) 表示 \(i,j\) 下的所有 \(k\) 的状态,转移代码如下:

(我又滚掉一维,仅仅是方便自己写 memset 而不用写循环清空数组)

memset(f, 0, sizeof f);
f[0][0] = 1;
for(int i=0; i<n; i++){int now = i & 1, to = (i + 1) & 1;for(int j=0; j<=len1; j++){if(s[i+1] == c[0][j%len1+1]) f[to][j%len1+1] = f[to][j%len1+1] | f[now][j];for(int k=0; k<=len2; k++)if(f[now][j][k] & 1 and s[i+1] == c[1][k%len2+1])f[to][j][k%len2+1] = f[to][j][k%len2+1] | 1;}for(int j=0; j<=len1; j++) f[now][j].reset();
}

B.分析

又是树形 DP。

image

\(f_{i,0/1,0/1}\) 表示(当前点为 \(i\) 时,该点出度的奇偶性,以该点为根的子树中是否有出度为奇数的点) 状态下的答案。

设计状态跑树形 dp 转移就可以了。

[C.]

咕咕咕,下一道题就该这个!

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

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

相关文章

SVN提交约束(钩子脚本)Windows环境

将check.py 和 pre-commit.bat文件放到 svn 路径下的hooks文件夹下,其中check.py为格式 pre-commit.bat为windows环境下 执行脚本文件 校验正则格式为: r^项目:.+\n修改内容:.+\n修改时间:\d{4}-\d{2}-\d{2}\n修改人:.+$ check.py内容:import re import sysmessage = s…

网页设计模板怎么使用-如何去修改呢?

使用和修改网页设计模板通常涉及以下几个步骤:选择合适的模板:根据你的网站需求选择一个适合的设计模板。 下载或安装模板:从模板提供商处下载模板文件,并按照说明将其安装到你的网站系统中。 了解模板结构:通过查看模板的HTML、CSS和JavaScript文件来理解其基本结构和样式…

zabbix7安装部署(基于almalinux9.4)

一、安装mysql8 1.下载mysql wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.37-1.el9.x86_64.rpm-bundle.tar 2.解压 mkdir mysql tar xf mysql-8.0.37-1.el9.x86_64.rpm-bundle.tar -C /root/mysql/ 3.安装 rpm -ivh mysql-community-* --force --nodeps 4.启…

宝塔面板无法访问,常见原因及如何快速解决?

宝塔面板无法访问可能由多种原因导致,以下是一些常见的原因及其快速解决方法:服务器连接问题:检查服务器是否正常运行,确认服务器没有宕机。 检查服务器的网络连接状态,确保服务器能够正常上网或被外部网络访问。域名解析问题:如果您是通过域名访问宝塔面板,请检查域名解…

网站运营维护的基本工作

网站运营维护是指为了保证网站正常运行,提升用户体验,以及实现网站目标而进行的一系列管理和技术活动。以下是网站运营维护的基本工作:内容更新与管理定期更新网站内容,包括文章、产品信息等。 确保所有发布的内容准确无误。技术支持与维护监控网站性能,确保网站稳定运行。…

网站数据库密码错误

当遇到网站数据库密码错误的问题时,可以按照以下步骤来解决:确认错误信息:确认是否真的是因为密码错误导致的问题。查看具体的错误日志或错误提示信息。检查配置文件:查看网站应用中的数据库连接配置文件,确认数据库用户名和密码是否正确。 对于常见的Web框架如Django、Fl…

网站出现数据库连接错误怎么办?

当网站出现数据库连接错误时,可以按照以下步骤进行排查和解决:检查错误日志:查看服务器上的错误日志文件(通常是 error.log 或 php_error.log),找到具体的错误信息。这可以帮助定位问题的原因。检查数据库配置:检查网站的数据库配置文件(如 config.php 或 database.php…

如何查看宝塔面板登录地址

宝塔面板的登录地址通常是在安装完成后自动设置的,可以通过以下步骤来查看或确认宝塔面板的登录地址:检查安装提示:如果您刚刚安装了宝塔面板,安装脚本通常会在安装完成后直接显示登录地址和端口号。通过命令行查看:打开服务器上的命令行工具。 输入命令 bt 后回车,这将进…

公司怎么修改网站密码

要修改公司的网站密码,通常可以按照以下步骤操作:登录后台:首先需要访问网站的管理后台,一般在网站域名后面加上/admin或者/manage等字样,具体取决于网站的构建方式。 查找用户设置:进入后台后,找到用户管理或者账号设置的相关选项,这通常位于侧边栏或顶部菜单中。 选择…

数据交换的金钟罩:合理利用安全数据交换系统,确保信息安全!

政府单位为了保护网络不受外部威胁和内部误操作的影响,通常会进行网络隔离,隔离成内网和外网。安全数据交换系统是专门设计用于在不同的网络环境(如内部不同网络,内部网络和外部网络)之间安全传输数据的解决方案。使用较多的网间数据交换方式为:移动U盘硬盘、FTP应用、网…

「模拟赛」A 层多校联训 4(卖品:CTH)

双倒一啦! 感觉这次最大的错误就是没看 T2。(本质原因还是时间浪费的太多了) 赛时记录在闲话啦 accoder 多校比赛链接 02 表示法 唐诗题!考高精的人都\(**\),输出深度优先搜索解决。高精乘 2、高精减。 子串的子串 官方题解写的不好,放一下 Ratio 的好吃题解:意思就是:\…

FTP的终结者:揭秘最佳FTP替代方案!

自1971年诞生以来,FTP凭借其独特优势成为因特网最重要的协议之一。但随着网络技术的发展,FTP呈现出来的弊端也逐渐凸显出来,存在多个方面无法满足大型企业的安全传输需求,需要寻找FTP替代方案: 1.安全性不足: FTP协议在传输数据时,数据是以明文形式进行传输的,没有进行…