今天看了acwing的一道题,用到了差分,而且本来自己就不怎么会差分,所以今天学习了一下
差分公式:s[i]=a[i]-a[i-1] (i从1开始);
差分复原公式: s[i]=s[i]+s[i-1];
证明如下:
差分应用,假设在一个区间{X-Y}增加x个值
s[x[+x;
s[y+1]-=x;
例题
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<queue>
#include<stack>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int N=5e4+10;
int a[N],b[N],c[N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
c[i]=b[i]-b[i-1];//差分
}
for(int i=0;i<m;i++){
int x;
scanf("%d",&x);
c[1]++; //差分相加
c[x+1]--;
}
for(int i=1;i<=n;i++){
c[i]=c[i]+c[i-1]; // 差分复原
}
int max1=-1;
int max0=-1;
int sum=n;
for(int i=n;i>=1;i--){
if(a[i]==1){
if(c[i]<max0) sum--;
max1=max(max1,c[i]);
}
else{
if(c[i]<max1) sum--;
max0=max(max0,c[i]);
}
}
cout<<sum<<'\n';
}
}