这道题运用了前缀和与差分的知识。
首先定义一个差分数组,也就是{1,0,0,0,0,......},差分数组的第一位是原数组的第一位,差分数组的其他位置是原数组该位置与前一位置的差值,该差分数组还原到原数组就是{1,1,1,1,1......},这里的1表示该位置有人。当水宝宝踹人时,先操作差分数组,然后通过差分数组还原后的原数组的1会变成0,表示该位置人被踹了,最后统计1的个数,也就是人数。因此在遍历差分数组时的sum变量就起到记录作用,记录该位置是否为1,如果是就cnt++;
#include<iostream>
#include<algorithm>
using namespace std;
const int n=100000010;
int arr[n];
int main(){
arr[0]=1;
int a=0;
cin>>a;
int M;
cin>>M;
int M1,M2;
for(int i=0;i<M;i++){
cin>>M1>>M2;
arr[M1]=arr[M1]-1;
arr[M2+1]=arr[M2+1]+1;
}
int sum=0;
int cnt=0;
for(int i=0;i<=a;i++){
sum+=arr[i];
if(sum==1) cnt++;
}
cout<<cnt;
}
新手入门可能有些描述与代码可能不太规范,大家参考一下就行。欢迎大家的批评与指正

京公网安备 11010502036488号