首页 > 其他分享 >【CSP】202112-2 序列查询新解

【CSP】202112-2 序列查询新解

时间:2024-04-07 16:24:52浏览次数:25  
标签:const 数列 ll lpos 新解 202112 include rh CSP

题目大意:

给定一长度为n+1的严格单增数列A[a0,a1,a2,a3...,an],其中a0=0,an<N

定义f(x)为数列A中小于等于x的最大整数的下标,r=floor(N/(n+1)),g(x)=floor(x/r)。

当N<1e9,n<1e4的时候,求解|g(x)-f(x)|之和,x=0,1,2...,N-1

 

分析:

数据规模较大,如果一项一项求和将会超时。

为优化朴素方法,观察求和式,发现由于g(x)向下取整的性质,在数轴上呈现为长度为r的阶梯上升状;同样由于f(x)的性质,在数轴上呈现为每个数列元素处上升1的阶梯状。

同时可以发现,如果按照数列元素而不是每个整数求和,复杂度将会大大降低。

结合以上两点,可以分析出f(x)和g(x)可以分别单独在区间上直接计算,并且a_x~a_x+1之间函数g(x)-f(x)存在至多一个零点,可以以此性质在同号区间内去掉绝对值符号,直接计算f(x)和g(x)的区间值。

 

代码:

先写出任意两点间计算g(x)之和的函数,再写出如果存在零点如何分割区间的函数,最终获得结果。

#include <cstdio>
#include <iostream>
#include <algorithm>

#define up(l,r,i) for(int i=l;i<=r;i++)
#define dn(l,r,i) for(int i=r;i>=l;i--)

typedef long long ll;

using namespace std;

inline ll _max(const ll& a,const ll& b){return a>b?a:b;}
inline ll _min(const ll& a,const ll& b){return a<b?a:b;}
inline ll _abs(const ll& a){return a>0?a:-a;}

ll n,N;
ll r;

ll solve(ll l,ll r,ll R){
    //cout<<"计算"<<l<<","<<r<<"的总和"<<endl;
    ll sum = 0;

    ll lh,rh;
    lh = l/R;//左侧的阶梯状高度
    rh = r/R;//右侧的阶梯状高度
    if(lh == rh){
        sum = (r-l+1)*lh;
    }
    else{
        ll lleft = (l/R+1)*R - l;
        ll rleft = r%R+1;
        ll num = (r/R) - (l/R+1);
        //printf("在区间[%d,%d]左侧剩余%d,右侧剩余%d,中间有%d\n",l,r,lleft,rleft,num);
        sum = R*num*(lh+1+rh-1)/2 + lleft*lh + rleft*rh;
    }
    //cout<<"为"<<sum<<endl;
    return sum;
}

int main()
{
    cin>>n>>N; 
    r = N/(n+1);
    ll ans = 0;
    ll a,lpos = 0;
    up(1,n+1,i){
        if(i != n+1)
            cin>>a;
        else
            a = N;
        a--;
        ll lh,rh;
        lh = lpos/r;//左侧的阶梯状高度
        rh = a/r;//右侧的阶梯状高度

        if((i-1-lh)*(i-1-rh) >= 0){
            //printf("与之对应的%d\n",(i-1)*(a-lpos+1));
            ans += _abs((i-1)*(a-lpos+1) - solve(lpos,a,r));
        }
        else{
            ll mid = (i-1)*r;
            //cout<<"选出中点为"<<mid<<endl;
            ans += _abs((i-1)*(mid-lpos+1) - solve(lpos,mid,r));
            ans += _abs((i-1)*(a-mid) - solve(mid+1,a,r));
        }

        lpos = a+1;

    }
    //printf("与之对应的%d\n",(N-lpos)*n);
    //ans += _abs((N-lpos)*n - solve(lpos,N-1,r));

    cout<<ans<<endl;


    return 0;
}
View Code

 

标签:const,数列,ll,lpos,新解,202112,include,rh,CSP
From: https://www.cnblogs.com/dudujerry/p/18119303

相关文章

  • CSP J 2022 第二轮 VP 划水记
    \(day0\)处于广州三区,CSP直接停掉。但是听说后续会有补测,但是无论如何,钩子应该是没有了。晚上最后复习了快速幂,线段树,树状数组,就去睡觉了。收到某人的祝福,挺好的(虽然远在我家隔壁一条街?)。\(day1\)中午\(12\)点开始考试,定个闹钟,到\(3:30\)。准时结束。开了第一题。题意:......
  • 第33次CSP认证500分题解
    近年来最简单的一次\(CSP\)认证,\(3\)个小时现场满分直接拿下。1、没啥好说的,直接开桶拿下。#include<bits/stdc++.h>usingnamespacestd;#defineN1000010template<classT>inlineTread(T&a){Tx=0,s=1;charc=getchar();while(!isdigi......
  • csp-j游记
    我参加了[2023]csp-j,在10月20日我校准备了大巴车,在5点.pm住酒店,老师定的蓝海酒店使我震惊不已。吃完饭老师叮嘱了我们几句,然后呵呵去找隔壁的隔壁请教了一下晚上有个大聪明打电话学夹子音来骚扰我们第二天早上我们上战场TMD找规律找了2个小时,打代码加修改代码花了1个小时也没......
  • CCF-CSP认证202403个人总结以及部分代码
    第一次参加,总分340,这个成绩个人觉得比较满意了,毕竟考前一直在划水,也很久没写算法题了。写到第四题,觉得还剩一个小时肯定写不完就又开始划水,暴力模拟完了就开始翻网页抄自己的提交记录,无所事事,想提前交卷。考试结束在网上一搜,第四题好像不是很难,瞬间觉得没写到最后亏了,开始后悔。......
  • 【题单】 往届 CSP/s 题目(洛谷)
    这里写目录标题updata20232022202120202019updata2023P9752[CSP-S2023]密码锁P9753[CSP-S2023]消消乐P9754[CSP-S2023]结构体P9755[CSP-S2023]种树2022P8817[CSP-S2022]假期计划P8818[CSP-S2022]策略游戏P8819[CSP-S2022]星战P8820[......
  • 2022CSP-J组真题 2.解密
    线上OJ:https://www.luogu.com.cn/problem/P8814核心思想:对本题先进行数学公式推导已知ed=(......
  • CCF CSP模拟真题解答示例
    CCFCSP(CertifiedSoftwareProfessional)是中国计算机学会主办的软件能力认证考试,旨在评估参赛者在计算机科学和软件工程方面的基本知识和实践能力。请注意,以下解答仅作为示例,并非针对实际真题的准确答案。实际考试中的题目和答案可能会有所不同,因此建议参考官方发布的真题......
  • CCF-CSP真题《202309-3 梯度求解》题解
    题目string转longlong忘记处理负数卡了半天,服了#include<iostream>#include<cstdio>#include<cstring>#include<sstream>typedeflonglongll;usingnamespacestd;intn,m,temp;lla[302];stringf,x,b;llmod=1e9+7;structnode{ stringcon; n......
  • ccfcsp-2019-12-2回收站选址(c++满分题解)
    该题就是考察点的保存以及索引的保存和遍历,看了他的用例说明,我原先以为暴力只能得50分,但是又没有想到别的优化方法,就写了一下暴力,发现居然AC下面是代码:#include<iostream>#include<vector>#include<map>usingnamespacestd;intmain(){ intn; cin>>n; vector<pair<......
  • Qt显示图像之QGraphicsPixmapItem
    为防止不断地addItem导致内存增长,建议在初始化时newItem、scene->addItem。在合适的地方scene->removeItem(或scene->clear)或者item->setVisible。h头文件中#include<QGraphicsView>QGraphicsView*view;QGraphicsScene*scene;QGraphicsPixmapItem*m_pix=nullptr;cp......