GCD on Sequence

原题链接

我们可以发现,假设区间 [l,r][l,r][l,r] 内 v(l,r)=dv(l,r)=dv(l,r)=d ,那么 [l,r][l,r][l,r] 内肯定至少有两个 ddd 的倍数。我们可以通过从 nnn 到 111 去枚举 gcdgcdgcd ,设其为 ddd ,然后找到所有 ddd 的倍数的下标。我们可以先不考虑其它 gcdgcdgcd 对此次的计算影响,只考虑计算 max_gcd=dmax\_gcd=dmax_gcd=d 的最终答案。那么假设处理出来了其倍数下标排序后为 [1,3,5,10][1,3,5,10][1,3,5,10] ,那么我们怎么计算有多少个区间满足 v(l,r)=dv(l,r)=dv(l,r)=d 呢?我们考虑枚举左端点 lll , l∈[1,1]l∈[1,1]l∈[1,1] , rrr 为 333 及以后皆可;l∈[2,3]l∈[2,3]l∈[2,3] , rrr 为 555 及其以后, l∈[4,5]l∈[4,5]l∈[4,5] , rrr 为 555 到尾。到这里应该找到规律了吧,也就是枚举每个下标 p[i]p[i]p[i] ,其合理左端点区间为 [p[i−1]+1,p[i]][p[i-1]+1,p[i]][p[i−1]+1,p[i]] ,对应的右端点为 [p[i+1],n][p[i+1],n][p[i+1],n] 。 那么现在考虑其它 gcdgcdgcd 的影响,其实也就是更大的 gcdgcdgcd 对计算的影响。我们就想我们是否可以枚举每个左端点进行计算的时候,是否可以把更大的答案的影响消去。那么其实我们对于每个左端点 lll 维护尚未确定 vvv 值的最大的右端点 mx[l]mx[l]mx[l] ,然后我们可以发现一个性质,mx[l]mx[l]mx[l] 是单调递增的,因为假设一个左端点 l1l_1l1​ 的值为 mx[l1]mx[l_1]mx[l1​] ,假设 l2>l1l_2>l_1l2​>l1​ 且 mx[l2]<mx[l1]mx[l_2]<mx[l_1]mx[l2​]<mx[l1​] ,也就是说 [l2,mx[l2]+1][l_2,mx[l_2]+1][l2​,mx[l2​]+1] 这个区间是已经确定了 vvv 值的,而这个区间一定是 [l1,mx[l1]][l_1,mx[l_1]][l1​,mx[l1​]] 的一个子区间,子区间都确定了 vvv 值,那父区间也必确定了 vvv 值,相互矛盾,这个情况不可能发生。所以我们只要用线段树维护 mx[i]mx[i]mx[i] 的区间最大值和区间和,我们在枚举 [p[i−1]+1,p[i]][p[i-1]+1,p[i]][p[i−1]+1,p[i]] 的时候,就可以通过在线段树上二分的方法找到一个需要更新的左端点的最小值 LLL ,然后就可以将 [L,p[i]][L,p[i]][L,p[i]] 区间覆盖为 p[i+1]−1p[i+1]-1p[i+1]−1 ,然后不断枚举左端点继续往后更新。 更新前的根节点区间和更新前的根节点区间和更新前的根节点区间和 与 所有更新都完成后的根节点的区间和所有更新都完成后的根节点的区间和所有更新都完成后的根节点的区间和 的差即是这个点的答案。

#include <bits/stdc++.h>
#define lson rt<<1
#define rson (rt<<1)|1using namespace std;typedef long long ll;const int N = 1e5 + 10;int n, a[N], rk[N];ll sum[N << 2];
int lz[N << 2], mx[N << 2];int pos[N], len;ll ans[N];void push_up(int rt) {sum[rt] = sum[lson] + sum[rson];mx[rt] = max(mx[lson], mx[rson]);
}void push_down(int rt, int l, int r) {if (!lz[rt]) return ;int mid = l + r >> 1;lz[lson] = lz[rson] = lz[rt];mx[lson] = mx[rson] = lz[rt];sum[lson] = 1ll * (mid - l + 1) * lz[rt];sum[rson] = 1ll * (r - mid) * lz[rt];lz[rt] = 0;
}void build(int rt, int l, int r) {lz[rt] = 0;if (l == r) {sum[rt] = n;mx[rt] = n;return ;}int mid = l + r >> 1;build(lson, l, mid);build(rson, mid + 1, r);push_up(rt);
}void update(int rt, int l, int r, int L, int R, int v) {if (L <= l && r <= R) {sum[rt] = 1ll * (r - l + 1) * v;mx[rt] = v;lz[rt] = v;return ;}push_down(rt, l, r);int mid = l + r >> 1;if (mid >= L) update(lson, l, mid, L, R, v);if (mid < R) update(rson, mid + 1, r, L, R, v);push_up(rt);
}int fd(int rt, int l, int r, int L, int R, int v) {if (l == r) {if (l > R || mx[rt] <= v) return -1;else if (l < L) return L;else return l;}push_down(rt, l, r);int mid = l + r >> 1;if (mx[lson] > v) return fd(lson, l, mid, L, R, v);else return fd(rson, mid + 1, r, L, R, v);
}int main() {#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifint T;scanf("%d", &T);while(T--) {scanf("%d", &n);for (int i = 1; i <= n; ++i) {scanf("%d", &a[i]);rk[a[i]] = i;}build(1, 1, n);for (int i = n; i >= 1; --i) {len = 0;for (int j = i; j <= n; j += i) {pos[++len] = rk[j];}sort(pos + 1, pos + 1 + len);ans[i] = sum[1];for (int j = 1; j + 1 <= len; ++j) {int l = fd(1, 1, n, pos[j - 1] + 1, pos[j], pos[j + 1] - 1);if (~l) {update(1, 1, n, l, pos[j], pos[j + 1] - 1);}}ans[i] -= sum[1];}for (int i = 1; i <= n; ++i) {printf("%lld\n", ans[i]);}}
}

2021CCPC“第一场”网络赛 GCD on Sequence(思维,线段树)相关推荐

  1. 2019南昌网络赛-I(单调栈+线段树)

    题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上 ...

  2. 蓝桥杯单片机——第十二届蓝桥杯单片机第一场省赛

    蓝桥杯单片机--第十二届蓝桥杯单片机第一场省赛 目录 蓝桥杯单片机--第十二届蓝桥杯单片机第一场省赛 一.赛题分析 二.问题总结 三.代码 一.赛题分析 前两天实验室的学妹把开发板还给我了,刚好今天没 ...

  3. 蓝桥杯单片机第十一届第一场省赛-多功能电压测量装置

    九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第十一届第一场省赛-多功能电压测量装置 Notes1:矩阵按键的灵活使用 Notes2:AT24 ...

  4. 蓝桥杯单片机第十二届第一场省赛--张三填坑

    Less interests.More interest. 蓝桥杯单片机第十二届第一场省赛--张三填坑 坑0 坑1 坑2 坑3 坑4 坑5 坑6 坑7 坑8 仅记录试题中可能存在的坑. 源码和PDF题 ...

  5. ACM网络赛金华赛区的一道关于树的题:Family Name List

    三场网络赛终于告一段落了!唉,实力太弱了!跟北大.清华这些家伙差距太远了,比"我在你身边你却不知道我爱你"的距离还要远! 这道题没有来得及提交,自己下来写完的,把样例过了!留在博客 ...

  6. ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树

    目录 ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树 题面 题意 思路 ACM-ICPC 2018 南京赛区网络预赛 Lpl and En ...

  7. hdu 3397 Sequence operation(线段树,lazy,区间合并)

    hdu 3397 Sequence operation 线段树lazy和区间合并结合的一个题,相当于几个题集中到一起嘛,分开想就好了 0,1,2操作都要lazy,2的异或操作找到每一只含1或只含0的区 ...

  8. 2020年 第十一届蓝桥杯第一场省赛题解(C++B组版)

    2020年蓝桥杯JavaB组第一场 2019年蓝桥杯JavaC组第一场 文章目录 第一题:跑步训练 第二题:纪念日 法一:控制台输入 法二:IO流读取 第三题:合并检测 第四题:REPEAT程序 第五 ...

  9. 2019 ICPC 南京网络赛 F Greedy Sequence

    You're given a permutation aa of length nn (1 \le n \le 10^51≤n≤105). For each i \in [1,n]i∈[1,n], c ...

最新文章

  1. linux成长笔录——week_1
  2. 图灵七月书讯【Cassandra权威指南将在7月末上市】
  3. 日期格式化为yyyymmdd_大厂日期时间处理最佳实践
  4. Crackme006 - 全新160个CrackMe学习系列(图文|视频|注册机源码)
  5. JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)
  6. 《算法导论》——MergeSort
  7. 孩子学习缺乏主动性,应该怎么做?
  8. java 暂停等返回值在执行_java面试技巧(2)
  9. httpd 服务的两个节点的HA
  10. 实现Canvas2D绘图 使元素绕中心居中旋转
  11. 腾讯微博模拟登陆+数据抓取(java实现)
  12. 【IBM Tivoli Identity Manager 学习文档】3 基本架构
  13. MySQL入门学习笔记
  14. 【人脸姿态】2D人脸姿态估计的两种方式:solvePnP与3DMM参数
  15. 网络编程-在线英英词典项目
  16. excel文件修复工具_ArcGIS工具箱使用技巧汇总
  17. 验证happenBefore
  18. Oozie 工作流定义详解【转】
  19. 陪诊系统app开发,一个应用可切换不同身份
  20. python迭代是什么意思_python中的迭代是什么意思?

热门文章

  1. 如何在群晖NAS中搭建WebDav服务,并外网可访问
  2. 脚手架soothboot
  3. 【推荐】 APP稳定性测试—Maxim工具
  4. 上市公司企业高管数据库-超多字段(1990-2022)
  5. 杭电计算机学院老师,杭州电子科技大学计算机学院导师教师师资介绍简介-陈婧...
  6. 【Paper】WISDM:The Impact of Personalization on Smartphone-Based Activity Recognition
  7. 仿QQ消息气泡拖拽效果
  8. 【Linux】Linux脚本编程
  9. IT人,请爱惜你的身体
  10. 数据库服务器修改地址,SQL数据库服务器IP地址修改