HRBUST 1909——理工门外的树——————【离线处理,差分前缀和】
理工門外的樹
Time Limit:?1000 MS?Memory Limit:?32768 KB
64-bit integer IO format:?%lld , %llu?Java class name:?Main
[Submit] [Status] [Discuss]
Description
?
哈爾濱修地鐵了~理工門口外長度為N的馬路上有一排樹,已知兩棵樹之間的距離都是1m。現(xiàn)在把馬路看成是一個數(shù)軸,馬路的一端在數(shù)軸0的位置,另一端在N的位置;數(shù)軸上的每個整數(shù)點,即0,1,2,……,L,都種有一棵樹。馬路上有一些區(qū)域要用來建地鐵,這些區(qū)域用它們在數(shù)軸上的起始點和終止點表示。已知任一區(qū)域的起始點和終止點的坐標都是整數(shù),區(qū)域之間可能有重合的部分。現(xiàn)在要把這些區(qū)域中的樹(包括區(qū)域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走后,馬路上還有多少棵樹。?
?
Input
輸入的第一行有兩個整數(shù)N(1 <= N <= 1,000,000)和M(1 <= M <= 10,000),N代表馬路的長度,M代表區(qū)域的數(shù)目,N和M之間用一個空格隔開。接下來的M行每行包含兩個不同整數(shù),用一個空格隔開,表示一個區(qū)域的起始點和終止點的坐標。?
Output
輸出包括一行,這一行只包含一個整數(shù),表示馬路上剩余的樹的數(shù)目。?
?
Sample Input
500 3
150 300
100 200
470 471
Sample Output
298
?
解題思路:差分前綴和,sum數(shù)組就是表示所有樹的情況。然后遍歷sum數(shù)組,如果小于0,說明該位置的樹被拔掉。
?
#include<stdio.h> #include<vector> #include<queue> #include<string.h> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 1e6+20; const int INF = 0x3f3f3f3f; const int mod = 1e9+7; int sum[maxn],a[maxn]; int main(){int n,m;while(scanf("%d%d",&n,&m)!=EOF){memset(sum,0,sizeof(sum));memset(a,0,sizeof(a));int l,r;for(int i = 1; i <=m; i++){scanf("%d%d",&l,&r);if(l > r) swap(l,r);a[l+1] -= 1;a[r+1+1] += 1;}int ans = 0;for(int i = 1; i <= n+1; i++){sum[i] = sum[i-1] + a[i];}for(int i = 1; i <= n+1; i++){if(sum[i] < 0){ans++;}}printf("%d\n",n+1-ans);}return 0; }
轉(zhuǎn)載于:https://www.cnblogs.com/chengsheng/p/5336731.html
總結(jié)
以上是生活随笔為你收集整理的HRBUST 1909——理工门外的树——————【离线处理,差分前缀和】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当你从事不喜欢的事怎么办
- 下一篇: 浏览器阻止window.open的解决方