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