个人想法及题解在代码中详细
几乎完全就是y神的代码,看完后的自己敲的加部分理解
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+6;
int hi[10005];
int main()
{ int n, p, h, m;
set<pair<int,int>> ex; // **这里的set是去重复 重复是指(3,4)(3,4)这种重复**
scanf("%d%d%d%d",&n,&p,&h, &m);
hi[1] = h; //**由差分可知我们可以由1来推及到全部,先设置每个牛的高度都是最高的然后依次减一**
for(int i = 1; i <= n; i ++)
{
int a, b;
scanf("%d%d",&a,&b);
if(a > b) swap(a,b);//**给出的ab不一定是a<b 所以换位置**
if(!ex.count({a,b}))//**返回的是(a,b) 的个数,由于set则返回1或者0**
{
ex.insert({a,b});//**假如这个不是重复的**
hi[a+1] --;
hi[b] ++;
//**此处是差分的经典用法(a,b)区间不包括ab均减一 具体理解看y神视频讲解**
}
}
for(int i = 1; i <= n; i ++)
{
hi[i] += hi[i-1]; //**将差分数组还原为原数组输出**
cout << hi[i] << endl;
}
return 0;
}
此题加深了差分的理解
差分一般都用在一个数组动态变化,比如在一个区间加减之类的
差分与前缀和可以互相推出及一些基本的用法要反复理解应用 ****