ABC 384(A~F)
期末周的第二把网瘾,vp了一把abc。这把打得还是比较舒服的,做出了A~E。但最后两道题还是出得太慢了(一道思路太慢,一道调试太慢)。什么时候能够在赛时做出F题呢qwq...
ABC
这场abc的ABC题还是很白给的,就不再赘述了。
D
前缀后缀和 + 二分
题意是给定一个循环数组和定值\(sum\),问是否存在一个子数组,使得总和恰为\(sum\)
这个子数组的形式只有两种情况:
- 原数组的某个子区间
- 原数组某个后缀 + 若干个整个数组 + 原数组某个前缀 拼接而成
对于情况1,采用枚举右端点,二分左端点的传统套路
对于情况2,设后缀和为\(suf\),前缀和为\(pre\) , 则有:
pre + k * S + suf == sum
其中\(S\)为整个数组的所有元素和
暴力枚举\(pre\)和\(suf\)的复杂度是\(O(n^2)\)的,考虑优化:
枚举\(suf\),由于\(pre\) \(<=\) \(S\) , 因此可以将这个式子中的\(pre\)看做余数,\(k\)看做商。则一定有 : \((sum - suf)\) % \(S\) == \(pre\) 。这样问题就转化为找一个和为\((sum - suf)\) % \(S\)的前缀。直接二分找即可,类似情况1。
两种情况的复杂度均为\(O(nlogn)\)
刚开始时看这道题就有了这个思路,但到比赛快结束时才AC。还是太菜了。。。
E
优先队列版bfs
思路一点都不难想,就是每次扩展时选择可以扩展的所有位置中最小的那个数就行。
因为每一次对于当前可以选择的所有数,选择了某个数时,只会扩大选择范围,而原来可以选择的那些数都仍然可以被选。而越小的数越可以选择。顺着这样的思路,很容易想到每次贪心取最小就是正解。
实现也很简单,直接队列改为小根堆再\(bfs\)就行了。
不过赛时此题WA了三发。debug了半天最后才发现是地图中的数据也会爆\(long long\),而地图的数据类型一直都是\(int\)(悲。。
F
数学题。赛后看完官方题解后思路逐渐清晰,最后自己补出来了。
题意就是给一个数组,求出数组中每一对 \((A_i , A_j)\) 之和并除去其中所有的因子2 的总和,注意\((A_i , A_i)\)也算一对数
由于最大值\(A_i + A_j\) \(<=\) \(2 * 10^7\) , 故除以\(2^k\)的\(k\)很小,不会超过\(26\).因此考虑找到 对于一个特定的\(k\) , 恰好含有\(k\)个因子\(2\)的所有\(A_i + A_j\) , 并设它们的总和为\(res[k]\)。
则:
ans = Σ (res[k] / 2^k) , k = 0,1,2 …… 25
\(res[k]\)可以利用前缀和的思想来计算:
设\(sum[k]\):所有能被\(2^k\)整除的\(A_i + A_j\)的总和
则恰好含有k个因子2 的\(A_i + A_j\)的总和\(res[k]\)为 :
res[k] = sum[k] - sum[k + 1]
现在考虑计算所有的\(sum[k]\):
暴力即直接\(O(n^2)\)找每一对数的和,并判断是否为\(2^k\)的倍数即可。优化可以利用余数的性质来优化:
- 对于任意两个数\(x,y\),它们除以\(2^k\)的余数为\(r_x,r_y\)。若二者的和是\(2^k\)的倍数,则一定是以下两种情况之一:
- \(r_x,r_y\)均为0
- \(r_x + r_y = 2^k\)
因此可以考虑\(O(n)\)遍历数组,用\(map\)记录所有数除以\(2^k\)后得到的余数\(r\)的 个数 和 对应原数的总和 。
对于某个余数\(r\),它可以和余数为\(2^k - r\)的信息配对(相加后一定是\(2^k\)的倍数)。直接数学计算出它们产生的贡献即可,最后把所有贡献累加起来。
注意当余数为\(0\)或\(2^{k-1}\)时需要特判,因为要找的对应余数的信息就是本身。
G
G看官方题解是个分块,不太会qwq...那就补到这里吧。
ABC 384(A~F)的更多相关文章
- UltraEdit (Ctrl + F) 查找、(Ctrl + R)替换功能失效
环境: Windows 7 Service Pack 1 X64 工具: UltraEdit Version 21 症状: UltraEdit (Ctrl + F) 查找.(Ctrl + R)替换功能 ...
- 对C标准中空白字符(空格、回车符(\r)、换行符(\n)、水平制表符(\t)、垂直制表符(\v)、换页符(\f))的理解
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] C标准库里<ctype.h>中声明了一个函数: int isspace(int c); 该函数判断字符c是否 ...
- Ubuntu+Fedora进阶学习,指令迅速查询,Bug迅速查询(Ctrl+F)
There is some notes while I am learning Ubuntu Operate System! (Ask Ubuntu & Fedora) 1-- Hard li ...
- eclipse 格式化快捷键(Ctrl+shift+f)不起作用的解决办法
eclipse格式化快界面Ctrl+Shift+f不起作用一般是键位冲突所导致的,一般是搜狗输入法的“繁体与简体”中文切换快界面冲突. 把它禁用掉就可以了. 下面是禁用步骤: 点击sougou输入法右 ...
- 小学生二元四则运算(F)
整体功能简介: 1.题目不重复: 2.可以定制数量: 3.可以自己选择输入范围: 4.可以选择是否添加乘除法: 5.可以选择除法结果是取整或商加余数形式表示或小数方式(默认小数点后两位)表示: 6 ...
- 【AtCoder】ARC097 (C - F)题解
C - K-th Substring 题解 找出第K大的子串,重复的不计入 这个数据范围可能有什么暴力可以艹过去吧,但是K放大的话这就是后缀自动机板子题啊= = 代码 #include <ios ...
- Java面向对象1(A~F)
QWQ请假一节课,错过一章内容,只能求助qsh了. C/C++训练1---最大公约数与最小公倍数(SDUT 1131) import java.util.*; class Number { int a ...
- The Preliminary Contest for ICPC Asia Nanjing 2019( B H F)
B. super_log 题意:研究一下就是求幂塔函数 %m的值. 思路:扩展欧拉降幂. AC代码: #include<bits/stdc++.h> using namespace std ...
- Forest Program(2019ccpc秦皇岛F)
题:http://acm.hdu.edu.cn/showproblem.php?pid=6736 题意:删掉一些边使得图不存在点双,求方案数. 分析:若一条边不属于点双,那么这条边有删和不删俩种选择, ...
- 格式化代码(Eclipse 格式化代码块快捷键:Ctrl+Shift+F)
1.格式化java代码 : ①Ctrl+Shift+F 但是我们会遇到按 Ctrl+Shift+F不起作用的时候? Ctrl+Shift+F 在搜狗拼音里是简繁替换.一旦安装搜狗拼音这个快 ...
随机推荐
- 2024 CSP 游记
\(\text{CSP-J}\) 游记 \(\text{Day -INF}\) 初赛免了,没有游记. \(\text{Day 0}\) 有点慌,于是打开了游戏跟 \(\text{zjx,sym}\) ...
- 聊聊jvm的内存结构, 以及各种结构的作用
什么是JVM 定义:Java Virtual Machine,JAVA程序的运行环境(JAVA二进制字节码的运行环境) 内存结构 JVM 内存布局规定了 Java 在运行过程中内存申请.分配.管理的策 ...
- springboot的基本使用
SpringBoot简介 SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程. 使用了Spring框架后已经简化了我们的开发,而Spr ...
- 高性能计算-openmp编程-(探究 for/collapse)(11)
1. 目标:探究嵌套循环 for 和 collapse 编程 2. 内容 (1). for 并行区默认对最近外层的循环控制变量私有,并对其划分并行,不必指明 private,内层循环体入口的循环控制变 ...
- 读书笔记-C#8.0本质论-01
1. IL代码入门 1.1 示例1 namespace ConsoleApp1; internal static class Program { internal static void Main(s ...
- msde2000的关于无法访问lonle实例的master数据库恢复
某次关机重启后,lonele数据库实例无法访问,查看发现相应的服务(MSSQL$LONELE2.SQLAgent$LONELE2)无法启动. --------------------------- 服 ...
- 开源 - Ideal库 - Excel帮助类,ExcelHelper实现(五)
书接上回,我们继续来聊聊ExcelHelper的具体实现. 01.读取Excel到DataSet单元测试 在上一章我们主要讲解了读取Excel到DataSet的三个重载方法具体实现,还没来得及做单元测 ...
- Business Object 开发
一 什么是BO BO(Business Object),封装在数据库之上,用于直接操作数据(增.删.改.查) 针对不同的BO,在安装目录下有对应的DLL文件,其中封装了BO各式针对具体的业务的方法, ...
- Google Chrome谷歌浏览器离线/绿色版本安装与彻底卸载
一.离线安装 1.下载官方最新安装包安装 直接下载链接 Windows 32 位最新稳定版: https://dl.google.com/tag/s/installdataindex/update2/ ...
- 人工智能大语言模型起源篇,低秩微调(LoRA)
上一篇: <规模法则(Scaling Law)与参数效率的提高> 序言:您在找工作时会不会经常听到LoRA微调,这项技术的来源就是这里了. (12)Hu.Shen.Wallis.Allen ...