江西ICPC省赛K题It rains again,签到,差分

首先这个题的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;
	
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值