一条线,上边在下雨,被多条线段遮挡,问雨淋不湿的长度。
n(n<1e5)条线段,下面给出线段端点坐标x1,y1,x2,y2(1<=x1<x2<=1e5)
L. It Rains Again
思路:差分与前缀和,本来想套牛客1.8 校门外的树(区间修改)的模板,但校门外的属是对端点计数,这个是对区间计数,然后就不知道咋处理了
可以将区间视为左闭右开,如[1,2],视为区间1被覆盖,区间2没被覆盖
则:b[l]++,b[r]–,前缀和计算到最大的右端点
或者
视为左开右闭的区间,1没被覆盖,2被覆盖,b[l+1]++,b[r+1]–,前缀和计算到最大的右端点+1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+1;
int a[N+3],b[N+3];
int t;
int main()
{
cin>>t;
int l,k,r,d;
a[N]={0};//初始每一段都为0,求b前缀和后a[i]的值视为被覆盖的次数
b[N]={0};//视为a的差分
int maxn=-1;
for(int i=1;i<=t;i++)
{
scanf("%d%d%d%d",&l,&k,&r,&d);
//cin>>l>>k>>r>>d;
b[l+1]++;
b[r+1]--;
maxn=max(maxn,r);
}
//memset(a,1,sizeof(a));
a[0]=1+b[0];
int cot=0;
for(int i=1;i<=maxn+1;i++)
{
b[i]+=b[i-1];
if(b[i])
{
cot++;
}
}
cout<<cot<<endl;
return 0;
}