首页 > 其他分享 >ABC243做题笔记

ABC243做题笔记

时间:2025-01-15 14:54:44浏览次数:1  
标签:数列 笔记 int 短路 long ABC243 做题 sqrt 操作

Atcoder Beginner Contest 243

D - Moves on Binary Tree

题目大意

有一棵极大的二叉树,有 \(2^{10^{100}}-1\) 个节点,给定一些操作,输出在线段树上遍历后的最后的节点的编号。

解题思路

如果直接模拟,显然数据太大,会远超出 long long 的范围。

有一个条件非常重要:最终的答案在 long long 范围内,因此考虑:

  • 一次 \(U\) 操作会与一次 \(L\) 或 \(R\) 操作抵消

维护一个栈,遍历操作串的时候每次遇到一个 \(U\) 操作就将其与栈顶中的一个 \(L\) 或 \(R\) 抵消掉。

全部抵消后,直接模拟即可。

for(int i=0;i<n;i++){
    if(s[i]=='U'&&!stk.empty()){
        s[i]='0',s[stk.top()]='0';
        stk.pop();
    }
    else if(s[i]=='L'||s[i]=='R'){
        stk.push(i);
    }
}

//剩余模拟部分略

E - Edge Deletion

题目大意

有一张有 \(N\) 个顶点,有 \(M\) 条边的带边权无向图,问能删多少条边,使得每两点之间的最短路长度不变。

解题思路

注意到这道题中 \(N\) 的范围很小,考虑 floyd 求全源最短路,再松弛边的时候,如果松弛的边距离与当前最短路长度相等,那么显然这条边时可以删去的。

for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            if(low[i][j]==low[i][k]+low[k][j]&&i!=k&&j!=k){ //如果距离相等
                f[i][j]=1;
            }

            low[i][j]=min(low[i][j],low[i][k]+low[k][j]);
        }

for(int i=1;i<=m;i++){
    //有两种情况可以删边:前面记录的状态可以删去;当前两点之间最短路不经过这条边
    if(f[e[i].u][e[i].v]||low[e[i].u][e[i].v]!=e[i].d){
        ans++;
    }
}    

cout<<ans<<"\n";

G - Sqrt

题目大意

有一个数列,最开始只有一个数 \(X\)。你可以对其进行一种操作:设末尾的数为 \(Y\),从 \(1 \ldots \sqrt Y\) 中选择一个数加到数列的末尾。如此进行 \(10^{100}\) 次操作,问数列一共有多少种可能的状态。

解题思路

有一个 \(O(T + X \sqrt X)\) 的做法,设 \(f_i\) 表示以数字 \(i\) 开头的数列可能的状态,设 \(i\) 的下一个位置上的数为 \(j\),那么 \(f_i = \sum _{j=1}^{ \sqrt i } f_j\)

最终答案为 \(f_x\),由于 \(X\) 极大,这种做法显然会超时。

考虑优化,根据数据范围以及上面的状态转移方程,\(f_x = \sum _{i=1}^{\sqrt [4]{x}}(\sqrt x - k^2+1) \times f_k\)

时间复杂度 \(O(T \times \sqrt [4]{X})\),轻松通过。

为了避免精度问题,需要开 long double。

f[1]=1;
for(int i=2;i<=5e5;i++){
    for(int j=1;j<=sqrt((double)i);j++){
        f[i]+=f[j];
    }
}

while(T--){
    cin>>n;

    int ans=0,k=sqrt((double)n);
    for(int i=1;i<=sqrt((double)k);i++){
        g[i]=f[i]*(k-i*i+1);
        ans+=g[i];
    }

    cout<<ans<<"\n";
}

标签:数列,笔记,int,短路,long,ABC243,做题,sqrt,操作
From: https://www.cnblogs.com/Sunbutstfan1106/p/18673016

相关文章

  • [数据结构学习笔记13] 递归简介(Recursion)
    递归让我们把问题由大分小,小到我们能够轻松处理。递归方法有两个要注意的点:1.递归方法会重复的被调用;2.必须有一个终止条件,否则方法调用不停,会导致stackoverflow。看下面的一个例子,这个没有终止条件,会报错!functionhello(){console.log("I'malittlefunction,shorta......
  • 【原创】thinkbook16+2023锐龙7840h版本笔记本C口充电需要重新插拔才起作用的问题自己
    这个笔记本左边有两个c口都可以充电有一个是usb4,pd100w。现在出现一个问题需要插两次才能申请到pd协议。看了主板,也没有办法直接给他dc20v的电压输入。怀念以前的笔记本都是dc供电,简单耐用。两个c口试过都是一样的,应该是主板电路上的问题吧,如果维修肯定要返厂,浪费时间精力。如......
  • docker-compose自动部署go项目全流程,本地到镜像仓库到服务器,踩坑笔记
    声明:个人所学记录,有可以改进的地方希望不吝指教Dockerfile#使用golang官方镜像作为构建环境FROMgolang:1.23-alpineASbuilder#设置工作目录WORKDIR/app#设置环境变量镜像变量ENVGO111MODULE=onENVGOPROXY=https://goproxy.cn,direct#复制go.mod和go.sum文......
  • 2、Grafana-Prometheus学习笔记
    一、时序数据库:时序数据库(TimeSeriesDatabase,TSDB)是专门为处理和存储时序数据而设计的数据库。时序数据是带有时间戳的数据,通常用于表示随时间变化的测量值。时序数据库在许多应用领域中具有关键作用,包括物联网(IoT)、应用性能监控(APM)、金融市场分析、环境监测、工业自动化等。......
  • MYSQL学习笔记(一):准备数据和数据库的最基本命令
    前言:学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇+,涵盖入门、进阶、高级(一些原理分析);这一篇是入门准备数据和一些关于数据库的操作命令;虽然MYSQL命令很多,但是自己去多敲一点,到后面忘记了,查一下就可以回忆起来使用了;这......
  • 【研发笔记20251114】技术自信 &
    技术自信我们要拥有技术自信!我们许多同学,是缺乏技术自信的。我们习惯了代码有改动,就提测给测试组的同学来进行测试验证。虽说有测试组,但有些开发改动,我们开发者,凭借我们的专业能力(技术能力),可以自己确信没有问题,可以不用一律提测。例如:重命名一个底层工具类的publicstatic方......
  • 《CPython Internals》阅读笔记:p151-p151
    《CPythonInternals》学习第9天,p151-p1510总结,总计1页。一、技术总结无。二、英语总结(生词:1)1.marshal(1)marshalingMarshallingormarshaling(USspelling)istheprocessoftransformingthememoryrepresentationofanobjectintoadataformsuitablefo......
  • 1、Grafana学习笔记
    Grafana是一个开源的数据可视化和分析平台,是网络架构和应用分析中最流行的时序数据展示工具,专门用于帮助用户实时监控和分析各种数据源(如时序数据、日志数据等)。Grafana被广泛应用于系统监控、性能分析、业务指标追踪等场景,特别是在DevOps、IT运维和数据分析领域中。一、Grafa......
  • 【学习笔记】函数复合:[PKUSC 2024] 排队
    函数复合是这样的一类问题:有一个函数序列\(f_1,f_2,f_3,...,f_n\)。离线询问,给定参数\(x\),\(f_r(f_{r-1}(...f_l(x)))\)的值。有点抽象对吧。看道题就懂了。[PKUSC2024]排队QOJ题目链接:#8672.排队。(反正我在其他OJ上没找到)前置知识:平衡树题面上有简化题意,但......
  • WebScoket学习笔记
    WebScoket学习笔记1.消息推送常用方式介绍轮询浏览器以指定的时间间隔向服务器发出HTTP请求,服务器实时返回数据给浏览器。长轮询浏览器发出ajax请求,服务器端接收到请求后,会阻塞请求直到有数据或者超时才返回。SSEserver-sent-event:服务器发送事件SSE是在服务器和客户......