题解-The Number of Good Intervals
题面
给定 \(n\) 和 \(a_i(1\le i\le n)\),\(m\) 和 \(b_j(1\le j\le m)\),求对于每个 \(j\),\(a_i\) 区间 \(\gcd\) 为 \(b_j\) 的区间数。
数据范围:\(1\le n\le 4\cdot 10^6\),\(1\le m\le 2\cdot 10^5\),\(1\le a_i,b_i\le 4\cdot 10^4\)。
解法
唠叨
蒟蒻考场上 \(\Theta(n{\rm d}(a))\) 的公约数容斥过了……赛后 \(\tt MLE\#13\)。
正解有好多种,都是 \(\Theta(n\log^2n+m)\) 的,其中一个 \(\log\) 来自 \(\gcd\)。蒟蒻说说最妙的一种。
奇妙的正解
\(f_{i,j}\) 表示右端点为 \(i\),\(\gcd\) 为 \(j\) 的区间数。
\]
当然要考虑区间 \([i,i]\),\(f_{i,a_i}++\)。
然后 \(i\) 这维滚动掉,\(j\) 这维用哈希表。
时间复杂度 \(\Theta(n\log^2n+m)\)。
- 证明:
只考虑 \(f_{i,j}>0\) 的 \(j\),如果有 \(cnt\) 种,如果要加 \(1\) 种不减少原来的 \(cnt\) 种,必须是原来 \(cnt\) 种的公倍数。所以任何时候,\(cnt\) 必然是 \(\log\) 级别的。
然后 \(ans_j=\sum_{i=1}^n f_{i,j}\),可以求 \(f\) 的时候一起求,每次查询 \(\Theta(1)\)。
代码
#include <bits/stdc++.h>
using namespace std;
//Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair(a,b)
#define x first
#define y second
#define be(a) a.begin()
#define en(a) a.end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
//Data
const int N=4e6,A=4e4;
int n,m; ll ans[A+1];
unordered_map<int,ll> hsh[2];
int gcd(int x,int y){return x?gcd(y%x,x):y;}
//Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
int now=1,a;
while(n--){
cin>>a,now^=1,hsh[now].clear();
for(auto it:hsh[now^1]){
int g=gcd(a,it.x);
hsh[now][g]+=it.y,ans[g]+=it.y;
}
hsh[now][a]++,ans[a]++;
}
cin>>m;
int b;
while(m--){
cin>>b;
cout<<ans[b]<<'\n';
}
return 0;
}
祝大家学习愉快!
题解-The Number of Good Intervals的更多相关文章
- 竞赛题解 - Karp-de-Chant Number(BZOJ-4922)
Karp-de-Chant Number(BZOJ-4922) - 竞赛题解 进行了一次DP的练习,选几道题写一下博客~ 标签:BZOJ / 01背包 / 贪心 『题目』 >> There ...
- leetcode题解 200. Number of Islands(其实就是一个深搜)
题目: Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is s ...
- LeetCode题解——Palindrome Number
题目: 判断一个数字是不是回文数字,即最高位与最低位相同,次高位与次低位相同,... 解法: 求出数字的位数,然后依次求商和求余判断是否相等. 代码: class Solution { public: ...
- LeetCode题解之Number of Segments in a String
1.题目描述 2.题目分析 找到字符串中的空格即可 3.代码 int countSegments(string s) { ){ ; } vector<string> v; ; i < ...
- LeetCode 题解之Number Complement
1.题目描述 2.题目分析 使用 C++的 bitset 库进行操作: 3.代码 int findComplement(int num) { bitset<> b(num); string ...
- LeetCode题解之Number of 1 Bits
1.题目描述 2.问题分析 使用C++ 标准库的 bitset 类,将整数转换为 二进制,然后将二进制表示转换为字符串,统计字符串中 1 的个数即可. 3.代码 int hammingWeight(u ...
- leetCode题解之Number of Lines To Write String
1.题目描述 2.分析 使用一个map将字母和数字对应起来,方便后续使用. 3.代码 vector<int> numberOfLines(vector<int>& wi ...
- leetcode题解||Palindrome Number问题
problem: Determine whether an integer is a palindrome. Do this without extra space. click to show sp ...
- [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流
Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...
随机推荐
- CentOS GRUB损坏修复方法
前言 博客很久没有更新了,一个原因就是原来存放部署博客的环境坏了,硬盘使用的是SSD,只要读取到某个文件,整个磁盘就直接识别不到了,还好博客环境之前有做备份,最近一直没有把部署环境做下恢复,今天抽空把 ...
- ubuntu12.10安装sun java jdk
add-apt-repository ppa:webupd8team/java apt-get update apt-get install oracle-java6-installer root@k ...
- API简介(二)
API简介(二) API简介(一)一文中,介绍了使用API的目的.设计.发行政策以及公共API的含义,本篇主要介绍API的用法,从库和框架.操作系统.远程API.Web API四个方面展开. 库和框架 ...
- echarts折线图,数据切换时(最近七天)绘图不合理现象
echarts折线图,当进行数据切换时存在绘制不合理的问题,数据没错,但绘制不对. 两个0之间的连线应该是平滑直线,如图: 正确的显示: 解决: 在myCharts.setOption(option) ...
- On Starting My Blogging On CNBlogs
About Myself I am a would-be Master of Engineering, on the last year of my student life, I'm ambitou ...
- 如何将MathType恢复出厂设置
必大家都知道,我们日常使用的手机是自带恢复出厂设置功能的,其实除了手机,咱们今天要说的这款公式编辑器MathType,也是可以进行恢复出厂设置操作的哦,下面就让小编给大家介绍一下吧. 一.打开Math ...
- 地图上显示点在点上标注当前点的id
HTML: <div class="form-group field-company-state"> <div style="width:1000px; ...
- CF1156D 0-1-Tree
路径考虑顺序. 显然合法的路径只有以下两种: 一段 \(0\) 加一段 \(1\) 或一段 \(1\) 加一段 \(0\). 全 \(0\) 或全 \(1\). 用并查集将边权为 \(0\) 和 \( ...
- C++基础知识篇:C++ 基本语法
C++ 基本语法 C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互.现在让我们简要地看一下什么是类.对象,方法.即时变量. 对象 - 对象具有状态和行为.例如:一只狗的状态 - 颜 ...
- 使用github actions 完成一些自动化工作
github actions 是什么? github actions是github的持续集成及自动化工作流服务,使用起来都比较方便.大部分github actions都可以在https://githu ...