题解-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 ...
随机推荐
- charles技能之修改请求参数/返回数据(map Local、Rewrite、Breakpoints)
之前一直用postman调接口比较多,但有时候想要去修改APP的页面展示,造数据又会比较麻烦,此时可以用以下三种方法修改请求参数或修改响应: map Local(本地映射).Breakpoints(打 ...
- Math.floor(Math.random() * array.length),splice
1.Math.floor(Math.random() * array.length) 返回长度内的索引 eg: changeLimit () { function getArrayItems(arr, ...
- Bugku-cms1
一.先用御剑扫描 二.点击第一个目录,发现sql文件 三.把它载下来,用Notepad++打开.发现管理员的账号和密码(admin的密码好像被人改了,然后我用admin888登的后台) 四.后台地址 ...
- jsonp和普通的ajax区别
1.请求类型.返回类型不一样 2.返回数据类型
- 巧妙使用MindManager图像功能,能够让你的思维导图更精彩
MindManager是一款多功能思维导图工具软件,有其他软件无法媲美的项目管理和商业规划高级功能.用户们制作思维导图时一定要注意图文并茂,单纯的文字会过于单调.所以接下来,小编就为大家详细介绍Min ...
- 使用Camtasia制作魔性抖肩舞视频
最近一首风魔各大视频网站的魔性舞蹈又来袭了!这首充满魔性节奏的舞蹈就是抖肩舞了,为了将我热爱的抖肩舞视频分享给大家,我必须使用Camtasia教程录制(Windows系统)软件来制作一个魔性抖肩舞视频 ...
- 自定义JSTL Tag
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java ...
- Session 与 sql 会话,mysql 权限设置,mybatis 逆向工程
Session 与 Sql 会话注意点: 通过 sqlSessionFactoty 工厂建立的与sql的会话,在进行相应的插入操作后,需要进行 commit 操作才会让数据库执行插入更新操作.如何主键 ...
- Meetings S 题解
题目描述 题目链接 有两个牛棚位于一维数轴上的点 \(0\) 和 \(L\) 处.同时有 \(N\) 头奶牛位于数轴上不同的位置(将牛棚和奶牛看作点).每头奶牛 \(i\) 初始时位于某个位置 \(x ...
- partial conv
Image Inpainting for Irregular Holes Using Partial Convolutions pytorch代码 论文贡献: 提出了部分卷积(partial conv ...