首页 > 其他分享 >从CF1737学习区间计数处理与开方精度丢失问题

从CF1737学习区间计数处理与开方精度丢失问题

时间:2024-02-01 16:27:03浏览次数:26  
标签:opt return ll cmp SQRT 计数 sqrtl 开方 CF1737

Problem - B - Codeforces

思路出来之后,需要计算 \(l,r\) 区间的个数。

我想的是计算出 \([0,r]\) 的个数和 \([0,l]\) 的个数,然后相减。

大体上是没问题,但是我的实现麻烦而且有错误。

初始代码

void solve() {
    ll l, r;
    cin >> l >> r;
    auto calc = [&](ll x, bool opt) {
        if (x == 1) return opt ? 0LL : 1LL;
        ll SQRT = sqrtl(x);
        if (SQRT * SQRT == x) return opt ? (SQRT - 1 << 1) + SQRT - 1 : (SQRT - 1 << 1) + SQRT;
        SQRT++;
        ll cmp = SQRT * SQRT;
        if (opt) {
            if (x > cmp - 1) 
                return (SQRT - 1 << 1) + SQRT - 1;
            if (x == cmp - 1)
                return (SQRT - 1 << 1) + SQRT - 1 - 1;
            if (x > cmp - SQRT) 
                return (SQRT - 1 << 1) + SQRT - 2;
            if (x == cmp - SQRT) 
                return (SQRT - 1 << 1) + SQRT - 2 - 1;
            return (SQRT - 1 << 1) + SQRT - 3;
        }
        if (x >= cmp - 1) return (SQRT - 1 << 1) + SQRT - 1;
        if (x >= cmp - SQRT) return (SQRT - 1 << 1) + SQRT - 2;
        return (SQRT - 1 << 1) + SQRT - 3;
    };
    cout << calc(r, 0) - calc(l, 1) << endl;
}
  • 万一左端点 \(l\) 是有效值,减去的时候会计算进去,从而让答案少 \(1\),而不是有效值的话又不会影响答案,所以在 calc 上加了很麻烦特判。
    • 实际上这类问题可以求 \([0,l-1]\) 的个数,然后再用 \([0,r]\) 来减即可,完美避免了上述问题。
  • sqrtlong long 开方会丢精度!
    • sqrtl

改进代码

void solve() {
    ll l, r;
    cin >> l >> r;
    auto calc = [&](ll x) {
        if (x == 0) return 0LL;
        if (x == 1) return 1LL;
        ll SQRT = sqrtl(x);
        if (SQRT * SQRT == x) return (SQRT - 1 << 1) + SQRT;
        SQRT++;
        ll cmp = SQRT * SQRT;
        if (x >= cmp - 1) 
            return (SQRT - 1 << 1) + (SQRT - 1);
        if (x >= cmp - SQRT) 
            return (SQRT - 1 << 1) - 1 + (SQRT - 1);
        return (SQRT - 2 << 1) + SQRT - 1;
    };
    cout << calc(r) - calc(l - 1) << endl;
}

标签:opt,return,ll,cmp,SQRT,计数,sqrtl,开方,CF1737
From: https://www.cnblogs.com/kdlyh/p/18001481

相关文章

  • C#double类型转换成科学计数法类型(全网最全最好回答)
     doubledoubleData=heatData.MaxSampleValue.ToString("0.0000E+0"); 众所周知G7的转换是有精度限制的,所以:doublevalue1=1234.56789;doublevalue2=0.000123456789;doublevalue3=12345678901234567890.123456789;stringf......
  • 【数据库】对大数据量数据集,PostgreSQL分组统计数量,使用 row_number() over
    在处理大数据量数据集时,我们经常需要进行分组统计。而在PostgreSQL中,我们可以使用row_number()函数结合over(partitionby)子句来实现这个功能。同时,通过设置row_num<=100的条件,我们可以限定每组最多数量为100。本文将详细介绍如何使用这种方法进行分组统计。一、row_......
  • 【数据库】对大数据量数据集,PostgreSQL分组统计数量,使用 row_number() over
    在处理大数据量数据集时,我们经常需要进行分组统计。而在PostgreSQL中,我们可以使用row_number()函数结合over(partitionby)子句来实现这个功能。同时,通过设置row_num<=100的条件,我们可以限定每组最多数量为100。本文将详细介绍如何使用这种方法进行分组统计。一、row......
  • 无涯教程-Swift - 引用计数
    内存管理函数及其用法通过自动引用计数(ARC)以Swift4语言处理。ARC用于初始化和取消初始化系统资源,从而在不再需要时释放类使用的内存空间。ARC跟踪有关我们的代码之间的关系的信息,以有效地管理内存资源。ARC函数每次通过init()创建新的类时,ARC每次都会分配一块内存来存储信......
  • 计数专题总结
    传送门AB这道题只需知道一个判断括号序列的性质,设左括号为\(1\),右括号为\(-1\),则对于\([l,r]\)满足其为合法括号序列就是$\foralll\lei\ler,sum_i\gesuml-1$,又因为每次只会\(+1\)或\(-1\),所以每次记录当前\(sum\)有多少的时候,就把\(sum+1\)的个数清零即可......
  • P2602 数字计数 题解
    QuestionP2602数字计数求\([a,b]\)中的所有整数中,每个数出现的次数Solution数位DP板子题定义\(dp[i]\)表示\(i\)位数的每种数字有多少个,我们把\(0\)和\(00\)看成两种不同的数,并且\(00\)中算\(0\)出现过两次显然,\(0\sim9\)在\(i\)位数中出现的次数是一样......
  • ARM指针寄存器——堆栈指针寄存器SP、程序计数器PC、连接寄存器LR详解
    堆栈的实现方法        在随机存储器区划出一块区域作为堆栈区,数据可以一个个顺序地存入(压入)到这个区域之中,这个过程称为‘压栈’(push)。通常用一个指针(堆栈指针SP—StackPointer)实现做一次调整,SP总指向最后一个压入堆栈的数据所在的数据单元(栈顶)。从堆......
  • Jmeter: 读取数据库数据并参数化(循环控制器与计数器)
    一前言:环境:window10,Jmeter5.3简单介绍下如何读取数据库中同个字段的多个值,并让该字段的多个值作为后面接口的请求参数读取mysql数据并参数化把前面数据库连接的例子拿来稍微改造下场景要求:如上,从数据库中查询出符合要求的age和name字段的数据,age和name的值都会作为......
  • MySQL子查询、WITH AS、LAG查询统计数据实战
    需求给出一个比较常见的统计类业务需求:统计App(包括iOS和Android两大类)每日新注册用户数、以及累计注册用户数。数据库采用MySQL,根据上面的需求,不难设计表如下:createtableos_day_count(stat_datevarchar(10)notnullcomment'统计日期',osvarcha......
  • 基于光流法的车辆检测计数算法matlab仿真,对比Horn-Schunck光流和Lucas-Kanade光流
    1.算法运行效果图预览HS光流 LK光流  2.算法运行软件版本matlab2022a 3.算法理论概述      光流法是一种用于估计图像中像素或特征点运动的方法。在车辆检测与计数应用中,光流法可用于检测图像中车辆的运动,从而进行计数。这里我们将详细介绍Horn-Schunc......