平行四边形<20306>

这道题大概也是____来的吧 qwq

平行四边形<20306>

读完题后 我么们先回顾下平行四边形的性质

两组对边相等且平行

因为题目中要求的是线段平移后的延长线

所以我们只需考虑斜率 无需关注长度

当线段的两个端点分别为(x1,y1) (x2,y2)时

其所在直线的函数解析式为

y=\frac{y1-y2}{x1-x2}x+b

(因为本题与b无关 所以在此不解出)

根据一点简单的数学常识 我们可以得到两直线平行时 其斜率相等

所以在写代码是我们只需判断两直线斜率是否相等

因为

-10^6<=x i,yi<=10^6

所以

-2e6<=k<=2e6

显然普通数组下标是无法实现的

这时就要调用map来解决这一difficulty

map<long long int,int> mp;

我们还需单独判断x1=x2这一种情况

此时x1-x2=0 (0不能做除数)

所以我们可以令此时的斜率k=2e6+1(已超出斜率上限 无需担心重复问题)

if(X1[i]==X2[i]){
	mp[N]++;
}
else{
	mp[(y1[i]-y2[i])/(x1[i]-x2[i])]++;
}

(其中N=2e6+1)

因为平行四边形的边是两两一组的

所以斜率为k的边能配对 map[k]/2 对

根据最大匹配公式

f(sum,max)=\begin{cases} sum/2 (sum-max>=max)\\ sum-max (sum-max<max) \end{cases}

只需判断

if(sum-maxx>=maxx){
		cout<<sum/2;
}
else{
	cout<<sum-maxx;
}

其中

sum=\sum_{i=1}^nmp[(y1[i]-y2[i])/(x1[i]-x2[i])]

(每次加完后都要讲mp清零 防止重复)

(当然 使用for-each遍历也是可以的)

基本框架就是这些了

具体代码就靠大家了

<老钱笑声>

@hhzx027 难道直线解析式不是

y=\dfrac{y_1-y_2}{x_1-x_2}(x-x_1)+y_1

吗?

其实他只考虑斜率所以解析式错了也没啥影响,但是为了学术严谨性建议 @hhzx027 更正一下

1 个赞

感谢,已更正

感谢,已改正