日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

little w and Segment Coverage(差分)

發布時間:2023/12/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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值相減就是這個區間的覆蓋點的個數。
代碼如下:

#include<bits/stdc++.h> using namespace std;const int maxx=1e5+10; int vis[maxx]; int book[maxx]; int n,m;struct node{int l;int r; }p[maxx];int main() {cin>>n>>m;for(int i=0;i<m;i++){cin>>p[i].l>>p[i].r;int l=p[i].l;int r=p[i].r;vis[l]++;vis[r+1]--;}//差分for(int i=1;i<=n;i++){vis[i]+=vis[i-1];//還原}int ans=0;for(int i=1;i<=n;i++){book[i]+=book[i-1];if(vis[i]==0) ans++;//沒有覆蓋的點 if(vis[i]==1) book[i]++;//只被一條線段覆蓋的點 }int x=n,id=1;for(int i=0;i<m;i++){int l=p[i].l;int r=p[i].r;int cnt=book[r]-book[l-1];if(cnt<=x){x=cnt;id=i;}}ans+=x;cout<<id+1<<" "<<ans<<endl; }

努力加油a啊,(o)/~

總結

以上是生活随笔為你收集整理的little w and Segment Coverage(差分)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。