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 在搜狗拼音里是简繁替换.一旦安装搜狗拼音这个快 ...
随机推荐
- IntelliJ IDEA 设置背景图片 随机快捷更换背景图片(附高清4K背景图N张)
前言 开发过程枯燥乏味,何不为自己工作中添加点乐子呢,除了主题模板,我们可以设置IntelliJ IDEA 的背景图片,换个背景图,换个心情. IntelliJ IDEA 设置背景图片 注意: 必要的 ...
- Flink Time
基础概念 支持三种时间概念: Processing Time 时间递增 Ingestion Time : 摄入时间,数据进入Flink框架的时间,在Source Operator中设置,每个事件拿到当 ...
- 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现四
一.前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势.传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速.便捷需求.这些问题不 ...
- 从2s优化到0.1s
前言 分类树查询功能,在各个业务系统中可以说随处可见,特别是在电商系统中. 但就是这样一个简单的分类树查询功能,我们却优化了5次. 到底是怎么回事呢? 背景 我们的网站使用了SpringBoot推荐的 ...
- Abp Vnext Vue版本(Vben Admin5.0)
前言 之前有提供免费开源的基于vben2.8版本的abp vnext pro版本 abp vnext pro vben admin 2.8 vben2.8作者已经重构一个版本,命名为vben5,而vb ...
- 基于nginx的tomcat负载均衡和集群(超简单)
今天看到"基于apache的tomcat负载均衡和集群配置 "这篇文章成为javaEye热点. 略看了一下,感觉太复杂,要配置的东西太多,因此在这里写出一种更简洁的方法. 要集群t ...
- equals与”==”的区别
本文由 ImportNew - 刘志军 翻译自 Javarevisited.如需转载本文,请先参见文章末尾处的转载要求. equals()和"=="操作用于对象的比较,检查俩对象的 ...
- Windows下驱动安装
推荐使用金山毒霸中的电脑医生进行驱动或DLL文件的扫描,查找并下载 dll文件下载地址: https://www.wenjian.net/ 可以进行下载,告诉该文件的放置路径 其他:
- YAML语法基础
YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言). YAML 的语法和其他高级语言类似,并且可以简单表达清单.散列表,标量等数 ...
- k8s之常见问题汇总
1.服务器中的k8s已经被移除,但是磁盘依然有占用, 于是将其卸载并删除操作 [root@k8s-node2 k8s_node]# rm -rf /var/lib/kubelet rm: cannot ...