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]
的最重粒子为例,它对
sumS
是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]
的最重粒子为例,它对
sumS
是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技能!好的,我会做的。谢谢你,阿加尼可能会在以后编写代码,但我现在没有足够的时间。我