计蒜客---线段的总长
Posted 午夜的行人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计蒜客---线段的总长相关的知识,希望对你有一定的参考价值。
数轴上有N个点,任意两点连线得到n(n-1)条线段,试求线段的总长。
输入格式:
第一行,一个整数N,表示点数。 接下来N行,每行一个整数X_i,表示点的坐标。
输出格式:
输出为一个整数,表示线段的总长。
N < = 10000 , 0 < = X_i < = 1000000000
样例输入
5 1 5 3 2 4
样例输出
40
题解:假如考虑一下算法,可以将要求变换成一个个相邻线段的和
…略…,对于排序好的n个点,得到n-1个线段,每个线程会重复i*(n-i)次
以n=5为例,有4条线段,长度分别是a、b、c、d,那么最终结果是 1*(5-1)*a + 2*(5-2)*b + 3*(5-3)*c + 4*(5-4)*d 再乘以2
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <vector> 6 #include <cstdlib> 7 #include <iomanip> 8 #include <cmath> 9 #include <ctime> 10 #include <map> 11 #include <set> 12 #include <queue> 13 using namespace std; 14 #define lowbit(x) (x&(-x)) 15 #define max(x,y) (x>y?x:y) 16 #define min(x,y) (x<y?x:y) 17 #define MAX 100000000000000000 18 #define MOD 1000000007 19 #define pi acos(-1.0) 20 #define ei exp(1) 21 #define PI 3.141592653589793238462 22 #define INF 0x3f3f3f3f3f 23 #define mem(a) (memset(a,0,sizeof(a))) 24 typedef long long ll; 25 ll gcd(ll a,ll b){ 26 return b?gcd(b,a%b):a; 27 } 28 bool cmp(int x,int y) 29 { 30 return x>y; 31 } 32 const int N=10005; 33 const int mod=1e9+7; 34 ll a[N]; 35 int main(){ 36 ll n, i; 37 cin >> n; 38 for(i=0;i<n;i++) 39 cin>>a[i]; 40 sort(a,a+n); 41 ll res=0; 42 for(i=1;i<n;i++){ 43 res +=(a[i]-a[i-1])*i*(n-i); 44 } 45 cout<<res*2<<endl; 46 }
以上是关于计蒜客---线段的总长的主要内容,如果未能解决你的问题,请参考以下文章
计蒜客- Lpl and Energy-saving Lamps 线段树+点更新