线段树练习题一
Time Limit:10000MS Memory Limit:65536K
Total Submit:119 Accepted:44
Case Time Limit:1000MS
Description
桌子上零散地放着若干个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少?
Input
Output
Sample Input
20 //桌面总宽度
4 //盒子数量
1 5 //盒子左下角,右下角的横坐标。
3 8
7 10
13 19
Sample Output
15
Hint
数据范围
1<=n<=100000,1<=m<=100000,保证坐标范围为[1,n].
Source
题意:
把箱子的影子映射在坐标轴上,利用离散,加大各各坐标之间代表的数值。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
int b[200001],x[100001],y[100001];
int main()
{
int n;
int ans=0;
cin>>n;
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
b[2*i-1]=x[i];
b[2*i]=y[i];
}
sort(b+1,b+2*n+1);
for (int i=1;i<=2*n-1;i++)
for (int j=1;j<=n;j++)
{
if (x[j]<=b[i]&&y[j]>b[i])
{
ans+=b[i+1]-b[i];
break;
}
}
cout<<ans;
}
/*
20
4
1 5
3 8
7 10
13 19
*/