2019icpc上海B灯泡(差分,思维题)

本题主要运用了差分的思维解决问题,但不是裸的差分板子题。
题目当中如果对同一个点操作偶数次,该点灯就是熄灭的
如果是奇数次,灯是点亮的。
利用差分对操作区间进行记录,不需要求出原数组,只要不断地判断区间的操作次数,便可以知道当前区间灯的开关状态了。
打个比方说:把所有操作的端点都在一个数轴上标记出来,之后,数轴上相邻两个点之间的灯肯定开关状态相同

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn = 1e6 + 5;
int main()
{
	 int t;
	scanf("%d", &t);//输入t组样例
	for(int k = 1; k <= t; k++)//这里用k来记录是第多少组
	{
		int n, m, ans = 0;
		int c[2005] = {0};//这里的c是操作记录数组
		int q = 0; //q是循环变量
		scanf("%d%d", &n, &m);
		while(m--)
		{
			int l, r;
			scanf("%d%d", &l, &r);//输入操作的区间
			c[q] = l;//运用差分的思想,对操作的端点进行记录,差分的概念可以自己学习
			q++;
			c[q] = r + 1;
			q++;
		}
		sort(c, c + q);//按操作区间的大小进行排序
		int sum = 0;//sum是操作次数
		for(int i = 0; i < q; i++)//遍历所有的操作端点
		{
			sum += 1;//操作数加1
			if(sum % 2 == 1)//如果操作数是奇数次,灯是点亮的
			{
				ans += c[i+1] - c[i];//答案加上亮灯区间内的灯数
			}
		}
		printf("Case #%d: %d\n", k, ans);
	}
	return 0; 
}

第一次发博客留念

发布了11 篇原创文章 · 获赞 0 · 访问量 631

猜你喜欢

转载自blog.csdn.net/weixin_43934344/article/details/100900254
今日推荐