P1496 火烧赤壁(离散化)

离散化就是把大数用小数表示,需要用到时再换回大数的操作,因为数据范围很大,直接用大数肯定会T的。
这题的数据只存在大小关系,所以用C数组来存点(1,2,3,4,5,6…表示大小顺序)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
ll ans,c[40010];
int a[20010],b[20010];
bool f[40010];
ll find(ll x){
    
    for(int i=1;i<=m;i++)if(c[i]==x)return i;}
int main()
{
    
    
	m=1;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
    
    
		cin>>a[i]>>b[i];
		c[m++]=a[i];
		c[m++]=b[i];
	}
	sort(c+1,c+m+1);
	for(int i=1;i<=n;i++)
	{
    
    
		a[i]=find(a[i]);
		b[i]=find(b[i]);
		for(int j=a[i];j<b[i];j++)f[j]=1;
		//注意,这里j不能取到b[i],不然会重复计算
	}
	for(int i=1;i<=m;i++)if(f[i])ans+=c[i+1]-c[i];
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_46001550/article/details/108793498