little w and Segment Coverage(差分)
鏈接:https://ac.nowcoder.com/acm/contest/297/C
來源:牛客網(wǎng)
題目描述
小w有m條線段,編號為1到m。
用這些線段覆蓋數(shù)軸上的n個點,編號為1到n。
第i條線段覆蓋數(shù)軸上的區(qū)間是L[i],R[i]。
覆蓋的區(qū)間可能會有重疊,而且不保證m條線段一定能覆蓋所有n個點。
現(xiàn)在小w不小心丟失了一條線段,請問丟失哪條線段,使數(shù)軸上沒被覆蓋到的點的個數(shù)盡可能少,請輸出丟失的線段的編號和沒被覆蓋到的點的個數(shù)。如果有多條線段符合要求,請輸出編號最大線段的編號(編號為1到m)。
輸入描述:
第一行包括兩個正整數(shù)n,m(1≤n,m≤10^5)。
接下來m行,每行包括兩個正整數(shù)L[i],Ri。
輸出描述:
輸出一行,包括兩個整數(shù)a b。
a表示丟失的線段的編號。
b表示丟失了第a條線段后,沒被覆蓋到的點的個數(shù)。
示例1
輸入
復(fù)制
5 3
1 3
4 5
3 4
輸出
復(fù)制
3 0
說明
若丟失第1條線段,1和2沒被線段覆蓋到。
若丟失第2條線段,5沒被線段覆蓋到。
若丟失第3條線段,所有點都被線段覆蓋到了。
示例2
輸入
復(fù)制
6 2
1 2
4 5
輸出
復(fù)制
2 4
說明
若丟失第1條線段,1,2,3,6沒被線段覆蓋到。
若丟失第2條線段,3,4,5,6沒被線段覆蓋到。
牛客競賽上的一道題目。。沒有接觸過差分的概念。。本來想用暴力,一秒的時間,1e5的數(shù)據(jù),肯定不行。看了看題解,有的用線段樹,nlogn的時間復(fù)雜度,可能也可以。但是用差分,只有O(n)的時間復(fù)雜度。在處理區(qū)間加減或者求和操作的時候,真的很方便
1.定義:
對于已知有n個元素的離線數(shù)列d,我們可以建立記錄它每項與前一項差值的差分數(shù)組f:顯然,f[1]=d[1]-0=d[1];對于整數(shù)i∈[2,n],我們讓f[i]=d[i]-d[i-1]。
2.簡單性質(zhì):
(1)計算數(shù)列各項的值:觀察d[2]=f[1]+f[2]=d[1]+d[2]-d[1]=d[2]可知,數(shù)列第i項的值是可以用差分數(shù)組的前i項的和計算的,即d[i]=f[i]的前綴和。
(2)計算數(shù)列每一項的前綴和:第i項的前綴和即為數(shù)列前i項的和,那么推導(dǎo)可知
即可用差分數(shù)組求出數(shù)列前綴和;
3.用途:
(1)快速處理區(qū)間加減操作:
假如現(xiàn)在對數(shù)列中區(qū)間[L,R]上的數(shù)加上x,我們通過性質(zhì)(1)知道,第一個受影響的差分數(shù)組中的元素為f[L],即令f[L]+=x,那么后面數(shù)列元素在計算過程中都會加上x;最后一個受影響的差分數(shù)組中的元素為f[R],所以令f[R+1]-=x,即可保證不會影響到R以后數(shù)列元素的計算。這樣我們不必對區(qū)間內(nèi)每一個數(shù)進行處理,只需處理兩個差分后的數(shù)即可;
(2)詢問區(qū)間和問題:
由性質(zhì)(2)我們可以計算出數(shù)列各項的前綴和數(shù)組sum各項的值;那么顯然,區(qū)間[L,R]的和即為ans=sum[R]-sum[L-1];
這是差分的定義以及原理。。
這道題目除了差分,還有另一個,就是book數(shù)組,這個數(shù)組就是記錄這個點之前有多少個點被覆蓋了,到時候只要區(qū)間兩端點的book值相減就是這個區(qū)間的覆蓋點的個數(shù)。
代碼如下:
努力加油a啊,(o)/~
總結(jié)
以上是生活随笔為你收集整理的little w and Segment Coverage(差分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces 1093D Be
- 下一篇: 棋盘里的数学(qduoj 记忆化搜索)