abc248_e K-colinear Line 题解
1.CSES 1667 Message Route 题解2.P3956 棋盘 题解3.abc233_f Swap and Sort 题解4.abc233_e Σ[k=0..10^100]floor(X/10^k) 题解5.abc233_d Interval 题解6.abc233_c Product 题解7.abc249_f Ignore Operations 题解8.abc249_d Index Trio 题解
9.abc248_e K-colinear Line 题解
10.abc247_f Cards 题解11.CF1066C Books Queries 题解12.P1038 神经网络 题解13.SeekLuna P1362 拓扑排序 3 题解14.abc232_e Rook Path 题解15.abc235_e MST + 1 题解16.abc234_e Arithmetic Number 题解17.P8786 李白打酒加强版 题解18.abc235_d Multiply and Rotate 题解19.CF1095D Circular Dance 题解20.P6201 & P1985 Fliptile S 题解21.CF1183C Computer Game 题解22.CF1095E Almost Regular Bracket Sequence 题解23.abc256_e Takahashi's Anguish 题解24.abc260_g Scalene Triangle Area 题解25.P8714 填空问题 题解26.abc252_d Distinct Trio 题解27.abc252_f Bread 题解28.abc253_e Distance Sequence 题解29.abc250_e Prefix Equality 题解30.abc250_d 250-like Number 题解31.arc164_a Ternary Decomposition 题解32.abc275_f Erase Subarrays 题解33.abc275_e Sugoroku 4 题解34.abc274_d Robot Arms 2 题解35.abc260_f Find 4-cycle 题解36.abc260_e At Least One 题解37.abc273_e Notebook 题解38.abc271_f XOR on Grid Path 题解39.abc271_e Subsequence Path 题解40.abc271_c Manga 题解41.abc269_f Numbered Checker 题解42.abc270_f Transportation 题解43.CF1077E Thematic Contests 题解44.CF1935D Exam in MAC 题解45.CF1144G Two Merged Sequences 题解46.joi2022_yo2_c 国土分割 (Land Division) 题解47.P3588 PUS 题解48.CF1946F Nobody is needed 题解K-colinear Line
题意
平面直角坐标系上给出
请求出平面上有多少条直线穿过 Infinity
。
数据范围
- 当
时, 或者 ,即点的坐标两两不同。
思路
首先来一个特判,当 Infinity
。
然后,观察到数据范围那么小,考虑最暴力的做法:枚举两个点,两点确定一条直线,求出有多少个点在这条直线上,统计答案即可,为了去重,我们可以用一个标记数组,每次求出一条直线时都将其上的点两两标记为求过了即可。
为了判断某个点是否在直线上,需要亿点点的数学知识,公式如下:
- 确定了一条直线,穿过了点
和点 ,如果点 在这条直线上,必然满足下面这个条件 ,为了防止精度误差,使用交叉相乘,得到第二个式子:
模拟即可,注意爆int
的细节。
复杂度
- 时间:
- 空间:
Code
点击查看代码
#include <iostream> #include <vector> using namespace std; using ll = long long; int k, n, f[310][310]; ll x[310], y[310], ans; int main () { ios::sync_with_stdio(0), cin.tie(0); cin >> n >> k; for (int i = 1; i <= n; i++) { cin >> x[i] >> y[i]; } if (k == 1) { // 无穷大 cout << "Infinity"; } else { for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { if (!f[i][j]) { // 去重 vector<int> v; // 记录这条线上有哪些点 v.push_back(i), v.push_back(j); for (int l = j + 1; l <= n; l++) { if (1ll * (x[j] - x[i]) * (y[l] - y[i]) == 1ll * (x[l] - x[i]) * (y[j] - y[i])) { // 套用数学公式 v.push_back(l); } } if (v.size() >= k) { // 满足要求 ans++; } for (int l : v) { // 注意了啊!这里是一个伪 n^4,实际上这两重循环总时间复杂度为 n^2。 for (int m : v) { f[l][m] = 1; // 标记 } } } } } cout << ans; } return 0; }
本文作者:wnsyou の blog
本文链接:https://www.cnblogs.com/wnsyou-blog/p/17311946.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步