CSP2021-12-2序列查询新解

该代码片段是为了解决一个编程问题,通过分段方法优化计算过程以避免暴力算法导致的时间超时。主要涉及计算g(x)值,对f进行分段,并在每个f段内对g进行分段计算,以提高效率。变量包括n、m、cnt、r等,用于表示不同计算阶段的参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

麻烦大家帮忙看一下,我实在找不出错误了。(时间复杂度应该是可以过的)

#include<bits/stdc++.h>//数据量变大,暴力算法会超时。
//根据题意多次分段相加(第一题只分段f) 
using namespace std;
long long g(int x,int r){//计算g(x)的值 
    return x/r;    

int main()
{
    ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m;
    int cnt[n+10];
    int r=m/(n+1);
    cnt[0]=0;
    cnt[n+1]=m;//对f分段
    long long sum=0;
    for(int i=1;i<=n;i++)cin>>cnt[i];
    int Long=0;//不能占long 
    for(int i=0;i<=n;i++)//f分段 ,f=i
    {
        long long sumpart=0;
        for(int j=cnt[i];j<cnt[i+1];j=j+Long)//g分段 
        {
            int numend=r*g(j,r)+1;//r个数的值为g(j),最大到numend
            if(numend>=cnt[i+1])numend=cnt[i+1]-1;
            int numlong=numend-j+1;
            long long f_g=abs(i-g(j,r));
            sumpart+=f_g*numlong;
            Long=numlong;
        }
        sum+=sumpart;
    }
    cout<<sum<<endl;
    return 0;
 } 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值