本題主要運用了差分的思維解決問題,但不是裸的差分板子題。
題目當中如果對同一個點操作偶數次,該點燈就是熄滅的
如果是奇數次,燈是點亮的。
利用差分對操作區間進行記錄,不需要求出原數組,只要不斷地判斷區間的操作次數,便可以知道當前區間燈的開關狀態了。
打個比方說:把所有操作的端點都在一個數軸上標記出來,之後,數軸上相鄰兩個點之間的燈肯定開關狀態相同
#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;
}
第一次發博客留念