差分(l-r):b[l]+=c,b[r+1]-=c;前缀和(1-n):b[i]+=b[i-1];这道题可能存在端点包含关系(a-b,a-c(这里b<c)),所以要用set主要作用是避免对重复的区间进行多次处理,确保每个区间只被调整一次,从而保证最终结果的正确性。
#include<iostream>
#include<set>
using namespace std;
const int N = 10010;
int v[N];
set<pair<int,int>>s;
int main()
{
int n,p,h,m;
cin>>n>>p>>h>>m;
v[1]=h;
for(int i = 0;i<m;i++)
{
int a,b;
cin>>a>>b;
if(a>b) swap(a,b);
if(!s.count({a,b}))//会检查集合 s 中是否已经存在区间 {a, b}。如果存在,count 函数返回 1;如果不存在,返回 0。
{
s.insert({a,b});
v[a+1]--,v[b]++;
}
}
for(int i = 1;i<=n;i++)
{
v[i]+=v[i-1];
cout<<v[i]<<endl;
}
return 0;
}