POJ 1990 MooFest

来源:互联网 发布:淘宝前100名半价怎么抢 编辑:程序博客网 时间:2024/04/30 04:23

POJ 1990 MooFest

思路:其实这题挺简单,关键是把样例搞懂,写出来之后可以发现是先按照牛的音量排序,然后算和的时候音量乘以(所有牛与当前那头牛距离之差的绝对值)之和~~有点绕口。。,

AC代码:

import java.util.Arrays;import java.util.Comparator;import java.util.Scanner;class Cow{int v,x;}class Tree{static int maxn=20000;int c[]=new int[maxn|1];private static int lowbit(int x) {return x&(-x);}void upDate(int x,int add){for(int i=x;i<=maxn;i+=lowbit(i))c[i]+=add;}int sum(int x){int sum=0;for(int i=x;i>0;i-=lowbit(i))sum+=c[i];return sum;}}public class Main{static int maxn=20000;static Cow vx[]=new Cow[maxn|1]; static Scanner scan=new Scanner(System.in);public static void main(String[] args){int n=scan.nextInt();for(int i=1;i<=n;i++){vx[i]=new Cow();vx[i].v=scan.nextInt();vx[i].x=scan.nextInt();}Arrays.sort(vx,1,n+1,new Comparator<Cow>() {@Overridepublic int compare(Cow a,Cow b){return (a.v>=b.v)?1:-1;}});long sum=0,allTotal=0;//下面开了两个树状数组,alltotal记录总距离,a[1]~a[i-1]的牛的坐标之和Tree count=new Tree();//这个树状数组用来记录个数,upDate(x,1)是记录x轴坐标大小为x的牛的个数(增加一个)Tree total=new Tree();//这个树状数组用来记录距离,upDate(x,x)是记录x轴坐标之和~~知悉想想就能想通,为什么要这么处理for(int i=1;i<=n;i++){int x=vx[i].x;int count_x=count.sum(x),total_x=total.sum(x);sum+=vx[i].v*(allTotal-2*total_x-(i-1-count_x)*x+count_x*x);count.upDate(x,1);total.upDate(x,x);allTotal+=x;}System.out.println(sum);}}

0 0
原创粉丝点击