题意定义f(l,r)为去掉[l,r]部分后剩下的数任意两个数的最大公约数的最大值

现在求f(l,r)的和

由于每个数ai最大只有200000,因此我们穷举因子x,记录以其为因子的a[i]的i值并按i升序。

下面我们从大到小穷举每个因子x,我们依次计算以f(l,r)=x的区间数,

有了上述的维护信息,我们很容易三种情况的区间满足f(l,r)=x(我就不具体细说了)

令pre[i]表示当前以第i个位置结尾的区间满足任意j(1<=j<=pre[i]),f(j,i)<x

显然f(l,r)=x的区间数=当前还没计算过的区间数-∑pre[i]

这就要维护∑pre[i],每次修改是将一段区间pre[i]>x的数赋值为x

显然pre[i]是单调不上升,因此可以用线段树维护之

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. int laz[*],mi[*],mx[*];
  6. ll tr[*];
  7. vector<int> g[];
  8. int n,m;
  9. void build(int i,int l,int r)
  10. {
  11. laz[i]=-;
  12. if (l==r) mx[i]=mi[i]=tr[i]=l;
  13. else {
  14. int m=(l+r)>>;
  15. build(i*,l,m);
  16. build(i*+,m+,r);
  17. tr[i]=tr[i*]+tr[i*+];
  18. mx[i]=max(mx[i*],mx[i*+]);
  19. mi[i]=min(mi[i*],mi[i*+]);
  20. }
  21. }
  22.  
  23. void work(int i,int l,int r,int x,int y,int z)
  24. {
  25. // if (i==1) cout <<z<<endl;
  26. if (x>y) return;
  27. if (mx[i]<=z) return;
  28. if (x<=l&&y>=r&&mi[i]>z)
  29. {
  30. mi[i]=mx[i]=laz[i]=z;
  31. tr[i]=(ll)(r-l+)*z;
  32. }
  33. else {
  34. int m=(l+r)>>;
  35. if (laz[i]>-)
  36. {
  37. laz[i*]=laz[i*+]=laz[i];
  38. mi[i*]=mx[i*]=laz[i];
  39. mi[i*+]=mx[i*+]=laz[i];
  40. tr[i*]=(ll)laz[i]*(m-l+);
  41. tr[i*+]=(ll)laz[i]*(r-m);
  42. laz[i]=-;
  43. }
  44. if (x<=m) work(i*,l,m,x,y,z);
  45. if (y>m) work(i*+,m+,r,x,y,z);
  46. tr[i]=tr[i*]+tr[i*+];
  47. mx[i]=max(mx[i*],mx[i*+]);
  48. mi[i]=min(mi[i*],mi[i*+]);
  49. }
  50. }
  51.  
  52. int main()
  53. {
  54. scanf("%d",&n);
  55. for (int i=; i<=n; i++)
  56. {
  57. int x;scanf("%d",&x);
  58. for (int j=; j*j<=x; j++)
  59. if (x%j==)
  60. {
  61. g[x/j].push_back(i);
  62. if (j*j!=x) g[j].push_back(i);
  63. }
  64. m=max(m,x);
  65. }
  66. build(,,n);
  67. ll pre=(ll)n*(n+)/;
  68. ll ans=;
  69. for (int i=m; i; i--)
  70. {
  71. if (g[i].size()<) continue;
  72. int j=g[i].size()-;
  73. work(,,n,g[i][]+,g[i][j]-,g[i][]);
  74. work(,,n,,g[i][j-]-,);
  75. work(,,n,g[i][]+,n,g[i][]);
  76. ans+=(pre-tr[])*(ll)i;
  77. // cout <<tr[1]<<endl;
  78. pre=tr[];
  79. }
  80. printf("%lld\n",ans);
  81. }

codeforces 671C的更多相关文章

  1. Codeforces 671C - Ultimate Weirdness of an Array(线段树维护+找性质)

    Codeforces 题目传送门 & 洛谷题目传送门 *2800 的 DS,不过还是被我自己想出来了 u1s1 这个 D1C 比某些 D1D 不知道难到什么地方去了 首先碰到这类问题我们肯定考 ...

  2. codeforces 671C Ultimate Weirdness of an Array 线段树+构造

    题解上说的很清楚了,我照着写的,表示膜拜题解 然后时间复杂度我觉得应该是O(nlogn),虽然常数略大,预处理和倒着扫,都是O(nlogn) #include <stdio.h> #inc ...

  3. CodeForces 671C - Ultimate Weirdness of an Array

    题意: 给以一个定义, F(l, r) 的值表示序列 A[1:n]的子序列 A[1....(l-1),(r+1)...n] 之中 任意两个数的最大公约数的最大值. 求 Sum=∑i=1N∑j=1N(F ...

  4. Ultimate Weirdness of an Array CodeForces - 671C (gcd,线段树)

    大意: 定义一个数列的特征值为两个数gcd的最大值, $f(l,r)$表示数列删除区间$[l,r]$的元素后剩余元素的特征值, 求$\sum_{i=1}^n\sum_{j=i}^n{f(i,j)}$ ...

  5. Codeforces 671C. Ultimate Weirdness of an Array(数论+线段树)

    看见$a_i\leq 200000$和gcd,就大概知道是要枚举gcd也就是答案了... 因为答案是max,可以发现我们很容易算出<=i的答案,但是很难求出单个i的答案,所以我们可以运用差分的思 ...

  6. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  7. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  8. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  9. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

随机推荐

  1. scrapy使用记录

    1 进入pip安装目录 python -m pip install --upgrade pip pip install Scrapy 2. 创建一个项目 scrapy startproject tes ...

  2. [剑指Offer] 9.变态跳台阶

     题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. [思路1]每个台阶都有跳与不跳两种可能性(最后一个台阶除外),最后一个台阶必 ...

  3. 当xml结构很深时候 可以通过父节点删除子元素

    当xml结构很深时候 可以通过父节点删除子元素

  4. 服务追踪数据使用 RabbitMQ 进行采集 + 数据存储使用 Elasticsearch + 数据展示使用 Kibana

    服务追踪数据使用 RabbitMQ 进行采集 + 数据存储使用 Elasticsearch + 数据展示使用 Kibana https://www.cnblogs.com/xishuai/p/elk- ...

  5. dva的基本用法

    dva是一个状态管理工具,整合了redux,redux-saga,react-router,fetch等框架,目前只能用于react的状态管理 1. dva的models dva的主要作用还是整合了r ...

  6. idea xml 绿背景色 去掉拼写检查

    去掉背景色 去掉拼写检查

  7. Spring 4 + Hibernate 4 下 getCurrentSession()的使用情况

    前言:1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会.   2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭 ...

  8. Ubuntu pppoe 拨号上网

    -------------蓝色是终端里面的连接方式,可以不看--------------------- ADSL上网,Ubuntu下是可以的,虽然以前没用过拨号上网,不过查了查也不是很麻烦. 打开终端 ...

  9. java中的构造块、静态块等说明

    一:这篇博客写的时候我在学校已经一个星期了,为什么又会想到写这le,因为这几天又在重新学下有关spring.myBatis的知识,其中在实例化sessionFactory的时候用到了静态块,虽然在学习 ...

  10. Struts2 内建的验证规则

    Struts2 内建的验证规则 conversion validator:转换验证器 date validator:日期验证器 double validator:浮点验证器 email validat ...