CSP 集训记录

news/2024/9/24 21:31:41/文章来源: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;
}

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

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

相关文章

判断系统大小端字节序的方法

1、字节序 1.1、大端字节序(big-endian) 数据低位存储在高地址位,数据高位存储在低地址位。 假设定义一个变量并赋予初值: int a = 0x12345678; 对于这个整型数据,一共有四个字节,假设为其分配的地址空间为0x1001~0x1004,则从低位到高位,每个字节依次是:12、34、56、78。…

第二十四讲:MySQL是怎么保证高可用的?

为了让各位更好的了解文章,我归纳了下面几点最重要的: 1、MySQL 高可用系统的可用性,是依赖于主备延迟的。延迟的时间越小,主库故障的时候,服务恢复需要的时间就越短,可用性就越高。 2、主备延迟原因:备库用的机子不行(IOPS是和主库相同的,不要轻视备库)、备库压力太…

redis内容记录

redis的基本数据类型String:是最基本的数据类型,它可以存储任何二进制安全的数据。 不仅能存放文本数据,还能保存图片、音频、视频、压缩文件等二进制数据。它们通常用于缓存。 Hash:哈希类型,其中键值对中的值本身又是一个键值对结构,hash 特别适合用于存储对象。 List:…

人工智能教育技术学第四周

1.用亿图图示制作黄山奇石语文课文的思维导图2.CAJViewer9.2(CAJ全文浏览器)是中国知网的专用全文格式阅读器,CAJ浏览器支持中国期刊网的CAJ、PDF、KDH等多种格式文件阅读。并且它的打印效果与原版的效果一致。可实现页面设置、浏览页面、查找文字、切换显示语言、文本摘录、…

项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持windows、linux、国产麒麟系统)

需求1.使用osg三维引擎进行动力学模型仿真性能测试;  2.打开动力学仿真模型文件,.k后缀的模型文件,测试加载解析过程;  3.解决第三方company的opengl制作的三维引擎,绘制面较多与弹丸路径模拟较卡顿的问题;  4.测试时,使用的模型为公开模型,基础面数量达到160多万…

【入门岛第1关】linux 基础知识

目录闯关任务 完成SSH连接与端口映射并运行hello_world.py 闯关任务 完成SSH连接与端口映射并运行hello_world.py 1 在远程主机上建立hello_python.py程序并运行,查看程序运行的端口: import socket import re import gradio as gr# 获取主机名 def get_hostname():hostname …

DOTS计算Voronoi图形生成,根据点自动划分区域生成多边形

如图,生成Voronoi图形,代码如下。// web* src = https://gist.github.com/andrew-raphael-lukasik/cc9d61edbbb44ecb4956c6cb69363a8e using UnityEngine; using Unity.Mathematics; using Unity.Jobs; using Unity.Collections; using Unity.Profiling;[ExecuteInEditMode] …

Vue2+3基础

。第一个Vue程序 使用script进行Vue全局设置: 指定Vue实例挂载的位置 , Vue和js一样,都需要在script里写 第一步创建vue实例 1.为什么要new vue(),直接调用Vue不行吗?不行,因为如果直接调用Vue()会报如下错误: 2.关于vue构造函数:optionsoptions翻译为多个选项 Vue…

JAVA的字符串这篇讲清楚了

JAVA_String 从概念上讲,JAVA字符串就是Unicode序列。例如"Java\u2122"由5个UNICODE字符J,a,v,a和™组成。Java没有内置和字符串类型,而是试用java标准库中提供的一个预定义类,很自然地叫做了string。 子串substring String subStr = str.substring(beginIndex);这…

任务4:制作二维码

该二维码链接到游戏“植物大战僵尸”,寓教于乐。 提升趣味性和互动性的同时,学生们参与到课堂当中,发挥主体作用,感受到自然界植物的多样性,对土壤的作用有了更深刻的理解。

封装的练习题目1

1.使用面向对象的思想,编写自定义描述狗的信息。设定属性包括:品种,年龄,心 情,名字;方法包括:叫,跑。 要求: 1)设置属性的私有访问权限,通过公有的 get,set 方法实现对属性的访问 2)限定心情只能有“心情好”和“心情不好”两种情况,如果无效输入进行提示, 默认…