差分是一种支持区间大量修改的操作,是一种很巧妙的思想。 差分序列的前缀和序列就是原序列。B[i]=A[i]-A[i-1]

假如有一个年级考试,批卷时发现有一题全体改错了,需要全部加x分。按照朴素暴力的思想,就是将以前所有的批了的试卷全部再拿出来,再一张张的加分。这当然过于的慢,所以便有了差分的这种算法:说白了,就是将一整个考场的试卷封面上写上“加x分”,这样便省去了许多功夫。

​​题目链接​​

题意:

给你n个数, 组成一个1~n的数组,且数组的元素互不重复。m次询问区间,并计算区间元素的和,问如何询问使得元素的和最大。

题解:

将题目转化为求出每个点的出现次数。
使用差分和前缀和的思想,差分求出区间的权值,再前缀和求出每个点出现的个数。

for(int i = 1;i <= m;i++) {
int l = cin.nextInt();
int r = cin.nextInt();
d[l]++;
d[r + 1]--;
}
for(int i = 1;i <= n;i++)
d[i] += d[i - 1];
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.HashMap;
import java.util.HashMap;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector;

public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int m = cin.nextInt();
long d[] = new long[200005];
for(int i = 1;i <= m;i++) {
int l = cin.nextInt();
int r = cin.nextInt();
d[l]++;
d[r + 1]--;
}
for(int i = 1;i <= n;i++)
d[i] += d[i - 1];
Arrays.sort(d, 1, n + 1);
long ans = 0;
for(int i = 1;i <= n;i++)
ans += i * d[i];
System.out.println(ans);
}
}