计蒜客---线段的总长

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 }

以上是关于计蒜客---线段的总长的主要内容,如果未能解决你的问题,请参考以下文章

计蒜客16492 building(二分线段树/分块)

计蒜客38228 Max answer 单调栈 + 线段树

线段树|计蒜客:斑点蛇-区间和

计蒜客- Lpl and Energy-saving Lamps 线段树+点更新

计蒜客 Lpl and Energy-saving Lamps(二分+线段树区间最小)

计蒜客斑点蛇