题解:P13817 「LDOI R3」球球碰撞

题解:P13817 「LDOI R3」球球碰撞

Link

二次函数题。

\(v_1 \neq v_2 \neq v_3 \neq \cdots \neq v_n\)。此时我们直接求函数图像的交点。因为所有元素互不相同,所以不存在两条没有交点的直线。

所以答案即为 \(\sum_{i=0}^{k-1} i\)。用高斯公式可得:

\[\sum_{i=0}^{k-1} i = \frac{k(k-1)}{2} \]

接下来考虑存在一组下标 \(i,j\),使得 \(a_i = a_j\)。此时将其放在不同方向上,那么仍然可以碰撞。

令数列中有 \(m \ (m \ge 3)\) 个元素相同,当 \(m = 3\) 时,显然会存在速度和方向都一样的小球,所以碰撞次数要减掉。令其中有 \(n\) 个方向相同,\(m-n\) 个方向不同,所以有函数:

\[y=n(m-n)=-n^2+mn \]

将其看作关于 \(n\) 的二次函数,根据顶点式 \(\left(-\frac{b}{2a},\frac{4ac-b^2}{4a} \right)\),可得函数最大值为:

\[y_{\max} = \frac{4ac-b^2}{4a} = \frac{-m^2}{-4} =\frac{m^2}{4} \]

所以碰撞数减少了:

\[\left(\sum_{i=0}^{m-1} i \right)- y_{\max} = \frac{m(m-1)}{2}- \frac{m^2}{4} \]

所以答案即为:

\[\left(\sum_{i=0}^{k-1} i \right)- \left(\sum_{i=0}^{m-1} i \right) +y_{\max} = \frac{k(k-1)}{2} - \frac{m(m-1)}{2} + \frac{m^2}{4} \]

化简为:

\[\frac{k(k-1)-m(m-2)}{4} \]

代码实现

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll T,n,a[N];
int main(){
	cin>>T;
	while(T--){
		cin>>n;
		ll sum=(n*(n-1))/2;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		sort(a+1,a+1+n); //排序,方便使用求和公式;
		for(int i=1;i<=n;i++){
			ll temp=a[i],cnt=0;
			for(int j=i;j<n&&a[j]==temp;j++){ //注意边界
				cnt++;
			} //因为顶点坐标是 (n/2,m^2/4),所以也可以代入横坐标求最值:
			sum-=cnt*(cnt-1)/2-(cnt/2)*(cnt-(cnt/2));  
			i=i+cnt-1;
		}
		cout<<sum<<"\n";
	}
	return 0;
}
posted @ 2025-08-26 13:28  M1_Byte  阅读(10)  评论(0)    收藏  举报