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