首页 > 编程语言 >CCF 202112-2 序列查询新解(C++)

CCF 202112-2 序列查询新解(C++)

时间:2022-08-27 11:24:05浏览次数:70  
标签:NumEnd int long 新解 202112 Long 取值 NumLong C++

image

该题关键点在于:分段计算

  1. 先对f分段:for(int i=1;i<=n+1;i++) //以 f(i) 为区域划分计算 在此区域内f的取值相同,值为:i-1。
  2. 再对每个f值相同的区域按照g值进行分段:for(int j=a[i-1];j<=a[i]-1;j=j+Long){//此区间内有Long个g取值为g(j)的数
  3. j 值改变条件为:j=j+Long,这个Long为变值,因为g取值相同的区间不完全与 f 取值相同的区间对齐。
    所以每次都要计算此Long:Long=NumLong=NumEnd-j+1;
    注:由于此特性,所以g取值的上界可能超出了此区间(按f取值相同来划分的区间)的上界
    所以需要此语句:if(NumEnd>a[i]-1) NumEnd=a[i]-1;//上界超出范围,变为区间最上界 ,来将此情况的bug修复。
#include<iostream>
#include<bits/stdc++.h>

using namespace std;

#define num 100002

int n = 0;
int N = 0;
int a[num]={0};
int r = 0;
int Long = 0;
long long sum = 0;

void input()
{   // 输入
    cin >> n >> N;
    for (int i = 1; i <= n; i++){
        cin >> a[i];
    }
}

long long g(int x)
{   // 计算g(x)的值
    return x/r;
}

int main()
{
    input();
    r=N/(n+1);
    a[n+1]=N;
    a[0]=0;
    // Long = r;
    for(int i = 1; i <= n+1; i++){//以f(i)为区域划分计算
        long long sum1 = 0;//记录此小区间差值的和
        for (int j = a[i-1]; j <= a[i]-1; j = j+Long){
            int NumEnd=(g(j)+1)*r-1;
            if (NumEnd>a[i]-1) NumEnd=a[i]-1;
            int NumLong = NumEnd-j+1;
            long long f_g = abs(i-1-g(j));
            sum1 = sum1+f_g*NumLong;
            Long = NumLong;
        }
        sum += sum1;
    }

    cout << sum << endl;
    return 0;
}

标签:NumEnd,int,long,新解,202112,Long,取值,NumLong,C++
From: https://www.cnblogs.com/understanding-friends/p/16630149.html

相关文章

  • C++基础-理解new和delete
    intmain(intargc,charconst*argv[]){ //C风格 int*p=(int*)malloc(sizeof(int)); if(p==NULL){ return-1; } *p=20;//初始化 free(p); int*q=(......
  • C++之多态
    C++之多态1静态联编和动态联编C++支持编译时多态(静态多态)和运行时多态(动态多态)。运算符重载和函数重载就是编译时多态,而派生类和虚函数就是运行时多态。静态多态和动态......
  • C++:理论基础篇
    class类特性封装:多态:继承:工厂函数 const与#define的区别const用来定义常量、修饰函数参数、修饰函数返回值,可以避免被修改,提高程序的健壮性define是宏定义,在......
  • C++课程设计题
    C++课程设计题题目列表:一、简单计算器的设计问题描述简单计算器的基本功能如下:四则运算,例如加减乘除等;除了整数的运算也可实现小数的各类运算;判断非法操作,例如判定......
  • Xmake v2.7.1 发布,更好的 C++ Modules 支持
    Xmake是一个基于Lua的轻量级跨平台构建工具。它非常的轻量,没有任何依赖,因为它内置了Lua运行时。它使用xmake.lua维护项目构建,相比makefile/CMakeLists.txt,配置语......
  • c++实现通讯录管理系统
    利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄,联系电话、家庭住址)最多记录1000人显示联系人:显......
  • 关于c++的一些好玩的
    #defineA(x) #x:将x转换为字符串。#defineA(x) va##x:将x拼接在变量名后。next_permutation(a+1,a+n+1):把a数组变成字典序下一位,最大则变成最小的。random_s......
  • C++ 内联函数
    1.函数的作用:避免重复制造轮子。(避免重复多次写相同的代码)2.函数的缺点:每调用一次函数,就会为这个函数分配一个“栈”,在计算机底层做很多准备工作(保护原来的执行环境,切换......
  • Windows c++获取磁盘剩余容量
    ULARGE_INTEGERfreeBytesAvailable;ULARGE_INTEGERtotalNumberOfBytes;//磁盘总字节ULARGE_INTEGERtotalNumberOfFreeBytes;//空闲字节GetDiskFreeSpa......
  • arduino自定义库c与c++的区别
    起初是想把手头的红牛开发板的基于stm32标准库的例子都改成用arduino库的   发现arduino库是基于hal库的 不是直接把c文件挪过来就能用的arduino是c++编译器 如......