202112-2 序列查询新解

文章讨论了一道编程题目,满分解决方案通过使用分段优化来避免重复计算,从而提高效率。首先尝试使用map降低时间复杂度但未达到理想效果,然后采用分段方法成功解决问题。70分代码利用map,而100分代码则改用vector并精确计算每个段的误差。
摘要由CSDN通过智能技术生成

这道题如果想得到满分的话需要分段优化来减少重复计算次数,所以主要思想就是分段。第一遍做的时候考虑用了map先试试降低一下时间复杂度看能不能过结果不出意料的70分,所以老老实实分段就拿到满分了。分段时候需要注意的细节还是很多的。

70分代码:

#include<bits/stdc++.h>
using namespace std;

long long find(map<long long,long long> &num,long long x)
{
	auto it=num.upper_bound(x);
	if(it!=num.begin())
	it--;
	return it->second;
}

int main()
{
	long long n,N;
	cin>>n>>N;
	map<long long,long long> num;
	for(long long i=1;i<=n;i++)
	{
		pair<long long,long long> tmp;
		cin>>tmp.first;
		tmp.second=i;
		num.insert(tmp);
		
	}
	
	pair<long long,long long> tmp;
	tmp.first=tmp.second=0;
	num.insert(tmp);
/*
	for(auto it=num.begin();it!=num.end();it++)
	{
		cout<<it->first<< " "<<it->second<<endl;
	}

	for(long long i=0;i<N;i++)
	{
		cout<<find(num,i)<<" ";
	}
	*/
	
	long long r=N/(n+1);
	long long error=0;
	
	for(int i=0;i<N;i++)
	{
		error+=abs(i/r-find(num,i));
	}
	
	cout<<error<<endl;
	

	

100分代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long n,N;
	cin>>n>>N;
	vector<long long> num(n+2,0);
	for(int i=1;i<=n;i++)
	{
		cin>>num[i];
	}
	num[n+1]=N;
	
	long long r=N/(n+1);
	long long error=0;
	for(int i=0;i<=n;i++)
	{
		long long numg_long;
		for(long long j=num[i];j<num[i+1];j+=numg_long)
		{
			numg_long=min(num[i+1]-1,((j/r)+1)*r-1)-j+1;
			error+=abs(i-j/r)*numg_long;
		}

	}
	cout<<error<<endl;
	
	return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值