Arrays 引力编码

Arrays 引力编码,arrays,algorithm,data-structures,time-complexity,Arrays,Algorithm,Data Structures,Time Complexity,有N粒子出现在X轴上,其中,每个粒子都有两个与其相关联的属性,即粒子的位置及其吸引值 两个粒子i和j之间的吸引力定义为: 吸引力(i,j)=距离(i,j)×最大值(吸引力值[i],吸引力值[j]) 因为它们都在一条直线上,所以任意2个 粒子等于其位置之间的绝对差值 您应该计算以下各项: ∑N−1i=1∑Nj=i+1(吸引力)−力(i,j))表示 求和(i,N-1)(力的吸引力(i,j))之和(j=i+1,N) 限制条件: 1≤N≤2×10^5 1≤吸引力−价值≤10^4 1≤位置≤10^4 样本

N
粒子出现在
X
轴上,其中,每个粒子都有两个与其相关联的属性,即粒子的位置及其吸引值

两个粒子
i
j
之间的吸引力定义为:

吸引力(i,j)=距离(i,j)×最大值(吸引力值[i],吸引力值[j])

因为它们都在一条直线上,所以任意2个 粒子等于其位置之间的绝对差值

您应该计算以下各项:

∑N−1i=1∑Nj=i+1(吸引力)−力(i,j))
表示

求和(i,N-1)(力的吸引力(i,j))之和(j=i+1,N)

限制条件:

1≤N≤2×10^5

1≤吸引力−价值≤10^4

1≤位置≤10^4

样本输入

3
1 2
2 4
3 6
22
样本输出

3
1 2
2 4
3 6
22
我尝试了
O(n^2)
如下

import java.util.*;

class TestClass {

public static void main(String args[] ) {
    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    int a[]=new int[n];
    int b[]=new int[n];
    for(int i=0;i<n;i++)
    {
        a[i]=sc.nextInt();
        b[i]=sc.nextInt();
    }
    long sol=0;
    for(int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)
        {
          sol +=Math.abs(a[i]-a[j])*(Math.max(b[i],b[j]));   
        }
    }
    System.out.println(sol);
    }

}
import java.util.*;
类TestClass{
公共静态void main(字符串参数[]){
扫描仪sc=新的扫描仪(System.in);
int n=sc.nextInt();
int a[]=新的int[n];
int b[]=新的int[n];
对于(int i=0;i有
O(nlogn)
近似算法,如Barnes Hut模拟法粒子网格法。但您必须在输出的准确性上做出妥协。我假设在您的情况下,答案的准确性非常重要

有关更多信息:

  • O(nlogn)
    近似算法,如Barnes-Hut-simulation粒子网格方法。但您必须在输出的准确性上做出妥协。我假设答案的准确性在您的情况下非常重要

    有关更多信息:

  • 我认为有一个O(nlog(n))算法。首先,这里是我的符号:我们想要计算

    S = Sum[i] Sum[j>i] abs(x[i] - x[j]) max(m[i], m[j])
    
    在这个总和中,每个(无序的)对
    {i,j}
    出现一次,在对粒子进行排序时,我们可以假设位置
    x[i]
    是升序的。通过对质量
    m[i]
    进行排序,我们可以得到一个数组
    r[1],…,r[n]
    ,这样
    m[r[i]
    就是升序的

    我的想法是根据粒子的位置构建一个包含粒子的平衡二叉搜索树,这样在每个子树T的根上,存储子树粒子的数量和子树粒子位置的总和

    利用该数据,对于任何实数
    x
    ,可以在时间O(log(n))中确定
    和[i]abs(x-x[i])

    现在以秩
    r[n]
    的最重粒子为例,它对 sum
    S
    m[r[n]]sum[i]abs(x[r[n]]-x[i])
    。这个贡献可以在时间
    0(log(n))
    中计算出来。然后,我们可以使用平衡树上的标准算法,或者更简单地通过修改节点上包含的数据,从二叉树中移除最重的粒子

    通过一个接一个地去除最重的粒子,我们在时间
    O(n log(n))
    中得到了和
    S
    ,我认为有一个O(n log(n))算法

    S = Sum[i] Sum[j>i] abs(x[i] - x[j]) max(m[i], m[j])
    
    在这个总和中,每个(无序的)对
    {i,j}
    出现一次,在对粒子进行排序时,我们可以假设位置
    x[i]
    是升序的。通过对质量
    m[i]
    进行排序,我们可以得到一个数组
    r[1],…,r[n]
    ,这样
    m[r[i]
    就是升序的

    我的想法是根据粒子的位置构建一个包含粒子的平衡二叉搜索树,这样在每个子树T的根上,存储子树粒子的数量和子树粒子位置的总和

    利用该数据,对于任何实数
    x
    ,可以在时间O(log(n))中确定
    和[i]abs(x-x[i])

    现在以秩
    r[n]
    的最重粒子为例,它对 sum
    S
    m[r[n]]sum[i]abs(x[r[n]]-x[i])
    。这个贡献可以在时间
    0(log(n))
    中计算出来。然后,我们可以使用平衡树上的标准算法,或者更简单地通过修改节点上包含的数据,从二叉树中移除最重的粒子


    通过一个接一个地去除最重的粒子,我们得到了时间上的总和,请更正:
    sol+=Math.abs(a[i]-a[j])*(Math.max(b[i],b[j]);
    请更正:
    sol+=Math.abs(a[i]-a[j])*(Math.max(b[i],b[j])
    感谢您的宝贵回复。我认为这是一个完全不同的问题,因为这里的吸引力(最好描述为潜在imho,因为它是一个标量)与粒子之间的距离成正比。与重力无关。距离远的粒子对期望的总和贡献更大。@Gribouillis是的,没错,这就是为什么我也在思考它与重力和N体模拟的关系?感谢有价值的回答。我认为这是一个完全不同的问题,因为这里的att引力(最好用势imho来描述,因为它是一个标量)与粒子之间的距离成比例。与重力无关。距离远的粒子对期望的总和贡献更大。@Gribouillis是的,没错,这就是为什么我也在思考它与重力和N体模拟的关系?我可能会稍后编写代码,但我现在没有足够的时间。我认为这个想法是相对的很简单,可以用一个固定的二叉树来实现。试试你的java技能!好的,我会做的。谢谢你,阿加尼可能会在以后编写代码,但我现在没有足够的时间。我