[Luogu 3794]签到题IV
Description
给定长度为 \(n\) 的序列 \(A\)。求有多少子段 \([l,r]\) 满足
\[
\left(\gcd_{l\leq i\leq r}A_i\right) \oplus\left(\bigcup_{l\leq i\leq r}A_i\right)=k
\]
其中 \(\oplus\) 表示按位异或,\(\cup\) 表示按位或。
\(1\leq n,A_i\leq 500000\)
Solution
这道题和[JSOI 2015]最大公约数一样啊。
可知,一个确定的右端点,其左端点随便取,\(\gcd\) 和按位或是不超过 \(\log\) 种的。
直接存下不同的值及其对应的最左端点。总复杂度为 \(O(n\log^2 A_i)\)。
Code
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define fr first
#define sc second
#define pb push_back
using namespace std;
const int N = 500000+5;
int n, K, a[N];
vector<pii > g[N], o[N];
pii tg, to;
ll ans;
int gcd(int a, int b) {return b ? gcd(b, a%b) : a; }
int main() {
scanf("%d%d", &n, &K);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (int i = 1; i <= n; i++) {
int szg = g[i-1].size(), szo = o[i-1].size(), j = 0, k = 0, cg = 0, co = 0;
g[i-1].pb(pii(0, i)), o[i-1].pb(pii(0, i));
while (j < szg && k < szo) {
tg = g[i-1][j], to = o[i-1][k];
tg.fr = gcd(a[i], tg.fr);
to.fr = (a[i]|to.fr);
if ((tg.fr^to.fr) == K) ans += min(g[i-1][j+1].sc, o[i-1][k+1].sc)-max(tg.sc, to.sc);
if (cg == 0 || tg.fr != g[i][cg-1].fr) g[i].pb(tg), ++cg;
if (co == 0 || to.fr != o[i][co-1].fr) o[i].pb(to), ++co;
if (g[i-1][j+1].sc == o[i-1][k+1].sc) ++j, ++k;
else if (g[i-1][j+1].sc < o[i-1][k+1].sc) ++j;
else ++k;
}
tg = pii(a[i], i), to = pii(a[i], i);
if ((tg.fr^to.fr) == K) ans++;
if (cg == 0 || tg.fr != g[i][cg-1].fr) g[i].pb(tg), ++cg;
if (co == 0 || to.fr != o[i][co-1].fr) o[i].pb(to), ++co;
}
printf("%lld\n", ans);
return 0;
}
[Luogu 3794]签到题IV的更多相关文章
- 洛谷3794 签到题IV
题目描述 给定一个长度为n的序列$a_1,a_2...a_n$,其中每个数都是正整数. 你需要找出有多少对(i,j),$1 \leq i \leq j \leq n$且$gcd(a_i,a_{i+1} ...
- P3794 签到题IV
题目 P3794 签到题IV 来切道水题放松一下吧 做法 或是单调不下降的,\(gcd\)是单调不上升的 \(a_i≤5×10^5\)分成权值不同的块数应该很小,所以随便乱搞就出来了 My compl ...
- luogu P3601 签到题
链接P3601 签到题 求\[\sum_{i=l}^{r} i-\phi_i\] \(l,r\leq 10^{12},\ r-l\leq 10^6\) 杜教筛似乎做不了. 然后再看\(l\),\(r\ ...
- 洛谷3794:签到题IV——题解
https://www.luogu.org/problemnew/show/P3794 题目见上. 有一个套路(虽然我到现在还不会),就是固定一个端点,二分查右端点. 显然这题的正解是O(nlogn) ...
- [luogu3601]签到题
[luogu3601]签到题 luogu 求\[\sum_{i=l}^ri-\phi(i)\] 一个朴素的想法是枚举l~r,根号求\(\phi\),显然这样是\((r-l)\sqrt r\),时间无法 ...
- A 洛谷 P3601 签到题 [欧拉函数 质因子分解]
题目背景 这是一道签到题! 建议做题之前仔细阅读数据范围! 题目描述 我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数. 这题作为签到题,给出l和r,要求求. 输入输出格式 ...
- fjwc2019 D3T1 签到题 (贪心)
#184. 「2019冬令营提高组」签到题 每次询问接近O(1).......考虑贪心 怎么贪心呢? 对于相邻的两个数,我们要保证异或x后单调不降 我们找到两个数二进制上最高的相异位 当左边的数相异位 ...
- CTF-练习平台-WEB之 签到题
一.签到题 根据提示直接加群在群公告里就能找到~
- 洛谷P3601签到题(欧拉函数)
题目背景 这是一道签到题! 建议做题之前仔细阅读数据范围! 题目描述 我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数. 这题作为签到题,给出l和r,要求求. 输入输出格式 ...
随机推荐
- 解决 niceScroll 自适应DOM 高度变化
利用dataTable展示数据列表时,当选择每页显示数量时,滚动条还是按照页面初始化时显示的,导致无法滚动查看下面的数据, 在stackoverflower 找到一个可用的方法,但不知道为什么仅写 ...
- 【题解】Luogu P5337 [TJOI2019]甲苯先生的字符串
原题传送门 我们设计一个\(26*26\)的矩阵\(A\)表示\(a~z\)和\(a~z\)是否能够相邻,这个矩阵珂以由\(s1\)得出.答案显然是矩阵\(A^{len_{s2}-1}\)的所有元素之 ...
- WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围
原文:WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围 WPF 的 VisualBrush 可以帮助我们在一个控件中显示另一个控件的外观.这是非常妙的功能. 但是本文需要说其中 ...
- sublime中Vue高亮插件安装
1.准备语法高亮插件vue-syntax-highlight. 下载地址: https://github.com/vuejs/vue-syntax-highlight 下载页面并下载: 解开压缩包vu ...
- 网络编程之 tcp服务器(一)
1.创建套接字 2.bind绑定ip和port 作为服务方,ip port 应该是固定的,所以要绑定;客户端一般不绑定 3.listen使套接字变成监听套接字,即变为被动链接 4.accept等待客户 ...
- js 动态创建 全局变量(转载)
转载来源 https://blog.csdn.net/stevenzhong900610/article/details/40857087 https://www.jb51.net/article/8 ...
- glfw之hello world
mac上用cocoa做imshow,资料似乎不好找,即便找到也需要和OC混编,而不是纯C.这不够纯粹.考虑用opengl做通用的.跨平台的imshow.先入门一下opengl,从glfw官方例子入手. ...
- Spring 重定向(Redirect)指南
原文:Hacking the IntegerCache in Java 9? 链接:https://dzone.com/articles/hacking-the-integercache-in-jav ...
- manjaro中微信不能输入中文及微信窗口出现透明轮廓的问题
一.在安装deepin-wine-wechat后,无法切换成中文输入法.网上查找资料,在配置中添加 export 等 均未成功. 后来在官方(https://aur.archlinux.org/pac ...
- Linux命令——gdisk、fdisk、partprobe
gdisk.fdisk MBR分区表请使用fdisk分区,GPT分区表请使用gdisk分区 MBR与GPT区别参考:Linux磁盘管理——MBR 与 GPT gdisk.gdisk这两个命令参数不需要 ...