区间合并解法
  • 板块P1840 Color the Axis
  • 楼主Q1021
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/14 15:58
  • 上次更新2024/12/14 18:58:10
查看原帖
区间合并解法
1473722
Q1021楼主2024/12/14 15:58
#include<bits/stdc++.h>
using namespace std;

#define int long long 

const int N = 2e5 + 10;
int p[N], sum[N];//本来看见标签想用并查集,但是想了想可以直接区间合并来做

#define pii pair<int,int>
vector<pii> segs;

inline  int  work()//进行区间合并 并返回所有合并区间内被染为白色的点
{
	vector<pii> res;
	int st = -10;
	int ed = -10;
	int sum = 0;//记录白色点的个数
	for (auto i : segs)
	{
		if (ed < i.first)
		{
			if (st != -10)
			{
				res.push_back({ st,ed });
				sum += ed - st + 1;
			}
			st = i.first, ed = i.second;
		}
		else ed = max(ed, i.second);
	}
	if (st != -10)
	{
		sum += ed - st + 1;
		res.push_back({ st,ed });
	}
	//cout << "res::" << endl;
	////for (auto i : res)
	//{
	//	cout << i.first << " " << i.second << endl;
	//}
	segs = res;
	return sum;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n, m;
	cin >> n >> m;
	//for (int i = 1; i <= n; i++)
	//{
		//p[i] = i;
		//sum[i] = 1;
	//}
	for (int i = 1; i <= m; i++)
	{
		int l, r;
		cin >> l >> r;

		segs.push_back({ l,r });
		sort(segs.begin(), segs.end());//先排序
		int ans = work();
		cout << n - ans<<endl;
	}
	
	







	return 0;
}

2024/12/14 15:58
加载中...