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; 
}

第一次发博客留念

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值