期末周的第二把网瘾,vp了一把abc。这把打得还是比较舒服的,做出了A~E。但最后两道题还是出得太慢了(一道思路太慢,一道调试太慢)。什么时候能够在赛时做出F题呢qwq...

ABC

这场abc的ABC题还是很白给的,就不再赘述了。

D

前缀后缀和 + 二分

题意是给定一个循环数组和定值\(sum\),问是否存在一个子数组,使得总和恰为\(sum\)

这个子数组的形式只有两种情况:

  1. 原数组的某个子区间
  2. 原数组某个后缀 + 若干个整个数组 + 原数组某个前缀 拼接而成

对于情况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。还是太菜了。。。

code

E

优先队列版bfs

思路一点都不难想,就是每次扩展时选择可以扩展的所有位置中最小的那个数就行。

因为每一次对于当前可以选择的所有数,选择了某个数时,只会扩大选择范围,而原来可以选择的那些数都仍然可以被选。而越小的数越可以选择。顺着这样的思路,很容易想到每次贪心取最小就是正解。

实现也很简单,直接队列改为小根堆再\(bfs\)就行了。

不过赛时此题WA了三发。debug了半天最后才发现是地图中的数据也会爆\(long long\),而地图的数据类型一直都是\(int\)(悲。。

code

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\)的倍数,则一定是以下两种情况之一:

    1. \(r_x,r_y\)均为0
    2. \(r_x + r_y = 2^k\)

因此可以考虑\(O(n)\)遍历数组,用\(map\)记录所有数除以\(2^k\)后得到的余数\(r\)的 个数 和 对应原数的总和 。

对于某个余数\(r\),它可以和余数为\(2^k - r\)的信息配对(相加后一定是\(2^k\)的倍数)。直接数学计算出它们产生的贡献即可,最后把所有贡献累加起来。

注意当余数为\(0\)或\(2^{k-1}\)时需要特判,因为要找的对应余数的信息就是本身。

code

G

G看官方题解是个分块,不太会qwq...那就补到这里吧。

ABC 384(A~F)的更多相关文章

  1. UltraEdit (Ctrl + F) 查找、(Ctrl + R)替换功能失效

    环境: Windows 7 Service Pack 1 X64 工具: UltraEdit Version 21 症状: UltraEdit (Ctrl + F) 查找.(Ctrl + R)替换功能 ...

  2. 对C标准中空白字符(空格、回车符(\r)、换行符(\n)、水平制表符(\t)、垂直制表符(\v)、换页符(\f))的理解

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   C标准库里<ctype.h>中声明了一个函数: int isspace(int c); 该函数判断字符c是否 ...

  3. Ubuntu+Fedora进阶学习,指令迅速查询,Bug迅速查询(Ctrl+F)

    There is some notes while I am learning Ubuntu Operate System! (Ask Ubuntu & Fedora) 1-- Hard li ...

  4. eclipse 格式化快捷键(Ctrl+shift+f)不起作用的解决办法

    eclipse格式化快界面Ctrl+Shift+f不起作用一般是键位冲突所导致的,一般是搜狗输入法的“繁体与简体”中文切换快界面冲突. 把它禁用掉就可以了. 下面是禁用步骤: 点击sougou输入法右 ...

  5. 小学生二元四则运算(F)

      整体功能简介: 1.题目不重复: 2.可以定制数量: 3.可以自己选择输入范围: 4.可以选择是否添加乘除法: 5.可以选择除法结果是取整或商加余数形式表示或小数方式(默认小数点后两位)表示: 6 ...

  6. 【AtCoder】ARC097 (C - F)题解

    C - K-th Substring 题解 找出第K大的子串,重复的不计入 这个数据范围可能有什么暴力可以艹过去吧,但是K放大的话这就是后缀自动机板子题啊= = 代码 #include <ios ...

  7. Java面向对象1(A~F)

    QWQ请假一节课,错过一章内容,只能求助qsh了. C/C++训练1---最大公约数与最小公倍数(SDUT 1131) import java.util.*; class Number { int a ...

  8. The Preliminary Contest for ICPC Asia Nanjing 2019( B H F)

    B. super_log 题意:研究一下就是求幂塔函数 %m的值. 思路:扩展欧拉降幂. AC代码: #include<bits/stdc++.h> using namespace std ...

  9. Forest Program(2019ccpc秦皇岛F)

    题:http://acm.hdu.edu.cn/showproblem.php?pid=6736 题意:删掉一些边使得图不存在点双,求方案数. 分析:若一条边不属于点双,那么这条边有删和不删俩种选择, ...

  10. 格式化代码(Eclipse 格式化代码块快捷键:Ctrl+Shift+F)

    1.格式化java代码 : ①Ctrl+Shift+F 但是我们会遇到按 Ctrl+Shift+F不起作用的时候?       Ctrl+Shift+F 在搜狗拼音里是简繁替换.一旦安装搜狗拼音这个快 ...

随机推荐

  1. IntelliJ IDEA 设置背景图片 随机快捷更换背景图片(附高清4K背景图N张)

    前言 开发过程枯燥乏味,何不为自己工作中添加点乐子呢,除了主题模板,我们可以设置IntelliJ IDEA 的背景图片,换个背景图,换个心情. IntelliJ IDEA 设置背景图片 注意: 必要的 ...

  2. Flink Time

    基础概念 支持三种时间概念: Processing Time 时间递增 Ingestion Time : 摄入时间,数据进入Flink框架的时间,在Source Operator中设置,每个事件拿到当 ...

  3. 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现四

    一.前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势.传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速.便捷需求.这些问题不 ...

  4. 从2s优化到0.1s

    前言 分类树查询功能,在各个业务系统中可以说随处可见,特别是在电商系统中. 但就是这样一个简单的分类树查询功能,我们却优化了5次. 到底是怎么回事呢? 背景 我们的网站使用了SpringBoot推荐的 ...

  5. Abp Vnext Vue版本(Vben Admin5.0)

    前言 之前有提供免费开源的基于vben2.8版本的abp vnext pro版本 abp vnext pro vben admin 2.8 vben2.8作者已经重构一个版本,命名为vben5,而vb ...

  6. 基于nginx的tomcat负载均衡和集群(超简单)

    今天看到"基于apache的tomcat负载均衡和集群配置 "这篇文章成为javaEye热点. 略看了一下,感觉太复杂,要配置的东西太多,因此在这里写出一种更简洁的方法. 要集群t ...

  7. equals与”==”的区别

    本文由 ImportNew - 刘志军 翻译自 Javarevisited.如需转载本文,请先参见文章末尾处的转载要求. equals()和"=="操作用于对象的比较,检查俩对象的 ...

  8. Windows下驱动安装

    推荐使用金山毒霸中的电脑医生进行驱动或DLL文件的扫描,查找并下载 dll文件下载地址:  https://www.wenjian.net/ 可以进行下载,告诉该文件的放置路径 其他:

  9. YAML语法基础

    YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言). YAML 的语法和其他高级语言类似,并且可以简单表达清单.散列表,标量等数 ...

  10. k8s之常见问题汇总

    1.服务器中的k8s已经被移除,但是磁盘依然有占用, 于是将其卸载并删除操作 [root@k8s-node2 k8s_node]# rm -rf /var/lib/kubelet rm: cannot ...