排列计算 题解(java)

排列计算

https://ac.nowcoder.com/acm/contest/5477/F

考点:贪心+差分
首先我们要考虑计算每个位置的访问次数。
我们可以用差分来计算每一个位置访问了多少次。
然后排序,将从小到大以此乘以1  2  3  4~~~,求和即可。
import java.util.*;
import java.math.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.PrintWriter;
public class Main {
    public static void main(String args[])throws IOException {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        in.nextToken();
        int n = (int)in.nval;
        in.nextToken();
        int m = (int)in.nval;
        long num[] = new long[n];
        long p[] = new long[n+1];
        for(int t=0;t<m;t++)
        {
            in.nextToken();
            int l = (int)in.nval;
            in.nextToken();
            int r = (int)in.nval;
            p[l-1]+=1;
            p[r]-=1;
        }
        num[0] = p[0];
        long u=p[0];
        for(int i=1;i<n;i++)
        {
            num[i] = p[i]+u;
            u+=p[i];
        }
        long sum=0;
        Arrays.sort(num);
        for(int i=0;i<n;i++)
        {
            sum+=(num[i]*(i+1));
        }
        out.print(sum);
        out.flush();
    
    }
}


全部评论

相关推荐

我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务