C2. Power Transmission (Hard Edition) 解析(思維、幾何)
Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維、幾何)
今天我們來看看CF1163C2
題目連結
題目
給一堆點,每兩個點會造成一個直線,求有多少個直線對相交。
前言
這題提供了一個表達直線的方法。
想法
這題的難點其實是在於如何表達一條直線,且要認為用\(map\)不會超時(我也不懂為什麼最多會有\(10^6\)個不同的值但是不到\(1\)秒就跑完了)。
表達一個直線,我們從一般的直線表達式\(y=ax+b\)出發,目前\(a,b\)很有可能不是整數。我們把整個表達式乘上一個\(C\),變成\(Cy=Cax+Cb\),我們把\(Ca=A,Cb=B\),也就是\(A,B,C\)是整數。
接著代入兩點,得到\(\frac{A}{C}=\frac{y_2-y_1}{x_2-x_1}\)。接下來,由於我們希望對於同一條直線,我們得到的\(A,B,C\)都是完全相同的,因此我們先令\(g=gcd(\frac{|\Delta y|}{|\Delta x|})\) where \(\Delta y=y_2-y_1,\Delta x=x_2-x_1\),接著\(C=\frac{\Delta x}{g},A=\frac{\Delta y}{g}\),之後再計算出\(B=\frac{x_1y_2-x_2y_1}{g}\)。
最後還需要
if(A<0)A=-A,C=-C,B=-B;if(A==0 and C<0)C=-C,B=-B;
我們要用兩個\(map\)分別紀錄\(\{A,C,B\}\)出現過了沒(當同樣的直線出現過時才能忽略),和紀錄\(\{A,C\}\)出現了幾次(紀錄每種斜率的平行線段有多少個)。
接著只要遍歷所有出現過的斜率把答案加上即可。
程式碼:
const int _n=1010;
int t,n,x,y,g,A,B,C,cnt;
PII pts[_n];
struct L{
int A,C,B;
bool operator<(const L& rhs)const{
if(A==rhs.A){
if(B==rhs.B)return C<rhs.C;
return B<rhs.B;
}return A<rhs.A;
}
};
map<L,int> mp;
map<PII,int> mp2;
main(void) {cin.tie(0);ios_base::sync_with_stdio(0);
cin>>n;rep(i,1,n+1)cin>>pts[i].fi>>pts[i].se;
rep(i,1,n)rep(j,i+1,n+1){
x=pts[j].fi-pts[i].fi,y=pts[j].se-pts[i].se,g=__gcd(abs(x),abs(y));
A=y/g,C=x/g,B=(pts[i].fi*pts[j].se-pts[j].fi*pts[i].se)/g;
if(A<0)A=-A,C=-C,B=-B;if(A==0 and C<0)C=-C,B=-B;
if(!mp[{A,C,B}]){
mp[{A,C,B}]++,mp2[{A,C}]++,cnt++;
}
}ll ans=0;
for(auto it=mp2.begin();it!=mp2.end();it++){
A=it->fi.fi,C=it->fi.se;
ans+=1ll*mp2[{A,C}]*(cnt-mp2[{A,C}]);
}cout<<ans/2<<'\n';
return 0;
}
標頭、模板請點Submission看
Submission
C2. Power Transmission (Hard Edition) 解析(思維、幾何)的更多相关文章
- C2. Pokémon Army (hard version) 解析(思維)
Codeforce 1420 C2. Pokémon Army (hard version) 解析(思維) 今天我們來看看CF1420C2 題目連結 題目 略,請直接看原題. 前言 根本想不到這個等價 ...
- C2. Power Transmission (Hard Edition)(线段相交)
This problem is same as the previous one, but has larger constraints. It was a Sunday morning when t ...
- A. Arena of Greed 解析(思維)
Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...
- E. Almost Regular Bracket Sequence 解析(思維)
Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...
- F. Moving Points 解析(思維、離散化、BIT、前綴和)
Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...
- B. Two Arrays 解析(思維)
Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...
- C. k-Amazing Numbers 解析(思維)
Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...
- D. Road to Post Office 解析(思維)
Codeforce 702 D. Road to Post Office 解析(思維) 今天我們來看看CF702D 題目連結 題目 略,請直接看原題. 前言 原本想說會不會也是要列式子解或者二分搜,沒 ...
- C. Bank Hacking 解析(思維)
Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...
随机推荐
- 关于KeePass实现mstsc远程桌面(rdp协议)的自动登录
本文的Keepass版本:KeePass Password Safe Version 2.45 首先介绍一下Keepass,引用官网的解释如下: KeePass is a free open sour ...
- Java源码赏析(一)Object 类
写这个系列的原因,其实网上已经有无数源码分析的文章了,多一篇不多,少一篇不少,但为什么还要写这部分文章呢?于私,其一,上班族已经很久没有打过完整的一整段有意义的话,算是锻炼个人的书写.总结能力,其二, ...
- 电商订单ElasticSearch同步解决方案--使用logstash
一.使用logstash同步订单数据(订单表和订单项表)到ElasticSearch: 1.到官网下载logstash:https://www.elastic.co/cn/downloads/logs ...
- 推荐一款轻量小众却高效免费开源windows热键脚本语言Autohotkey
写在前面的话 Autohotkey是一款轻量小众但高效免费开源的windows热键脚本语言,游戏操纵.鼠标操作.键盘快捷重定义,快捷短语等等,只有你想不到,没有它做不到,神器中的神器呀,相见恨晚. 安 ...
- 高效学习必备软件:OneNote+ Mindmaster
做笔记有两个关键点: 一是笔记内容详略得当.二是知识的框架清晰完整. 为什么这样说? 举个例子,如图是我的笔记界面,用的是免费的OneNote, OneNote是微软出的笔记软件, 非常好用,有着书写 ...
- 栈和队列数据结构的基本概念及其相关的Python实现
先来回顾一下栈和队列的基本概念: 相同点:从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同. 不同点:栈(Stack)是限定只能在表的一端进行插入和删除操作的线性 ...
- Matlab中的uigetfile用法
参考:https://ww2.mathworks.cn/help/matlab/ref/uigetfile.html?searchHighlight=uigetfile&s_tid=doc_s ...
- 2. 在TCGA中找到并下载意向数据
听说过别人用生信分析"空手套白狼"的故事吧想做吗好想学哦~ 或多或少都知道GEO和TCGA这些公共数据库吧!那么你知道怎么在数据库上找到意向数据,并且成功下载呢?这第一步要难倒一大 ...
- 创建好maven项目以后发现无法创建scala文件
今天创建了一个maven项目 然后准备创建scala文件的时候发现没有Scala 然后只好上网上找方法了 下面是一种解决方法 1.点击file,选择settings 进去之后,选择build 进去 ...
- redis 开启AOF
找到redis 安装目录 例如 cd /usr/local/redis 打开 redis.conf 修改以下参数: # vi /usr/local/redis/etc/redis.conf appe ...