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 · 訪問量 1736
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章