首先这个题的y坐标是不需要的,不用解释
代码里需要解释得就是sum[起点]++和sum[终点]++
想一下,拓扑排序的板子里是不是有类似的处理方式,就是多个点只想同一终点的时候,终点--,是的,我们这里的sum就是存储到达该点的点的数量,然后以1为单位枚举每个点,只要该点不是0,就代表这个点是某个长度里面的点,要把他的长度加进来
怎么做呢,大家想,如果有两个起点和终点一样的点,起点是2,终点是-2
两个点都是从1开始到3结束,那么就是sum[1]=2,sum[3]=-2;
那么我们从1开始枚举,枚举1,sum[1]!=0,所以ans++,然后将sum[2]+=sum[1],枚举2,sum[2]=1,ans++,sum[3]+=sum[2],这边就是-2+2,所以就是0,这边的实际意义是两个到该点的x到这就结束,往后就没有了。
然后所有的情况,比如说两个重合的边,交叉的边,还有一个边包另一个边的情况,都可以用这种方法做出来,没必要特判。
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int sum[N];
int ans;
int main()
{
int t ;
cin>>t;
for(int i = 1 ; i <= t ; i++)
{
int x,y;
int a, b;
cin>>a>>b>>x>>y;
sum[a]++;
sum[x]--;
}
for(int i = 1 ; i < N ; i++)
{
sum[i]+=sum[i-1];
if(sum[i]!=0)
{
ans++;
}
}
cout<<ans;
}