線段樹(假)練習題一(學校OJ的題)
阿新 • • 發佈:2018-12-08
Description
桌子上零散地放著若干個盒子,桌子的後方是一堵牆。如右圖所示。現在從桌子的前方射來一束平行光, 把盒子的影子投射到了牆上。問影子的總寬度是多少?
Sample Input
20 //桌面總寬度
4 //盒子數量
1 5
3 8
7 10
13 19
Sample Output
15
Hint
資料範圍
1<=n<=100000,1<=m<=100000,保證座標範圍為[1,n].
.
.
.
.
.
分析
此題本該為線段樹,卻因資料過水可用離散化做
將點對映到數軸上,接著判斷累加即可
.
.
.
.
.
程式:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,x1[100001],y1[100001],x[200001]; int main() { scanf("%d",&m); scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d%d",&x1[i],&y1[i]); x[i*2-1]=x1[i]; x[i*2]=y1[i]; } sort(x+1,x+2*n+1); long long ans=0; for (int i=2;i<=2*n;i++) { int bz=0; for (int j=1;j<=n;j++) if (x[i]<=y1[j]&&x[i-1]>=x1[j]) { bz=1; ans+=x[i]-x[i-1]; break; } } printf("%lld",ans); return 0; }