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)}$
怎么这div.1的C怎么这么难.....好像D过的人比C还要多.
特征值不好处理, 考虑将贡献转为前缀
即转化为对于所有的$x$, 求出$H[x]=\space f(l,r)\le x$的个数, 显然$H[x]$是单调不减的.
记$next[x]_l=\space f(l,r)\le x$的最小$r$, 就有$H[x]=\sum\limits_{i=1}^n(n+1-next[x]_i)$
显然$next[x]$是单调不增的, 考虑如何维护$next$.
我们从大到小枚举$x$, 这样初始$next[x]_i=i$, 考虑$x$变为$x-1$时, 每个位置的$next$值如何变化.
可以先枚举$gcd$, 预处理出$a_i|gcd$的位置$i$, 假设为$v_1,v_2,...,v_{m-1},v_{m}$.
那么显然对于$[v_2+1,n]$位置的$next$值与$n+1$取最大.
对于$[v_1+1,v_2]$位置的$next$值与$v_m$取最大.
对于$[1,v_1]$位置的$next$值与$v_{m-1}$取最大.
所以就需要支持区间取最大值, 区间求和, 可以用$STL$的$set$或线段树实现, 复杂度都是$O(nlog^2n)$
#include <iostream>
#include <algorithm>
#include <cstdio>
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define mid ((l+r)>>1)
#define lc (o<<1)
#define rc (lc|1)
#define ls lc,l,mid
#define rs rc,mid+1,r
using namespace std;
typedef long long ll; const int N = 1e6+10, INF = 0x3f3f3f3f;
int n, mx, a[N];
struct {
int ma,mi,tag;
ll sum;
void upd(int x, int t) {
ma=mi=tag=x, sum=(ll)t*x;
}
} tr[N<<2];
int L1[N], L2[N], R1[N], R2[N];
ll H[N]; void pu(int o) {
tr[o].ma = max(tr[lc].ma,tr[rc].ma);
tr[o].mi = min(tr[lc].mi,tr[rc].mi);
tr[o].sum = tr[lc].sum+tr[rc].sum;
}
void pd(int o, int l, int r) {
if (tr[o].tag) {
tr[lc].upd(tr[o].tag,mid-l+1);
tr[rc].upd(tr[o].tag,r-mid);
tr[o].tag = 0;
}
}
void build(int o, int l, int r) {
if (l==r) return tr[o].upd(l,1);
build(ls),build(rs);
pu(o);
}
void update(int o, int l, int r, int ql, int qr, int v) {
if (ql>qr||tr[o].mi>=v) return;
if (ql<=l&&r<=qr&&tr[o].ma<=v) return tr[o].upd(v,r-l+1);
pd(o,l,r);
if (mid>=ql) update(ls,ql,qr,v);
if (mid<qr) update(rs,ql,qr,v);
pu(o);
} int main() {
scanf("%d", &n);
REP(i,1,n) {
int t;
scanf("%d", &t);
a[t] = i;
mx = max(mx, t);
}
REP(i,1,mx) {
for (int j=i; j<=mx; j+=i) if (a[j]) {
if (!L1[i]||L1[i]>a[j]) L2[i] = L1[i], L1[i] = a[j];
else if (!L2[i]||L2[i]>a[j]) L2[i] = a[j];
if (R1[i]<a[j]) R2[i] = R1[i], R1[i] = a[j];
else if (R2[i]<a[j]) R2[i] = a[j];
}
}
build(1,1,n);
PER(i,1,mx) {
if (L1[i]!=R1[i]) {
update(1,1,n,1,L1[i],R2[i]);
update(1,1,n,L1[i]+1,L2[i],R1[i]);
update(1,1,n,L2[i]+1,n,n+1);
}
H[i] = (ll)(n*(n+1))-tr[1].sum;
}
ll ans = 0;
REP(i,1,mx-1) {
ans += (ll)i*(H[i+1]-H[i]);
}
printf("%lld\n", ans);
}
Ultimate Weirdness of an Array CodeForces - 671C (gcd,线段树)的更多相关文章
- G - Greg and Array CodeForces - 296C 差分+线段树
题目大意:输入n,m,k.n个数,m个区间更新标记为1~m.n次操作,每次操作有两个数x,y表示执行第x~y个区间更新. 题解:通过差分来表示某个区间更新操作执行的次数.然后用线段树来更新区间. #i ...
- 【CodeForces】671 C. Ultimate Weirdness of an Array
[题目]C. Ultimate Weirdness of an Array [题意]给定长度为n的正整数序列,定义一个序列的价值为max(gcd(ai,aj)),1<=i<j<=n, ...
- Codeforces 671C - Ultimate Weirdness of an Array(线段树维护+找性质)
Codeforces 题目传送门 & 洛谷题目传送门 *2800 的 DS,不过还是被我自己想出来了 u1s1 这个 D1C 比某些 D1D 不知道难到什么地方去了 首先碰到这类问题我们肯定考 ...
- Codeforces 671C. Ultimate Weirdness of an Array(数论+线段树)
看见$a_i\leq 200000$和gcd,就大概知道是要枚举gcd也就是答案了... 因为答案是max,可以发现我们很容易算出<=i的答案,但是很难求出单个i的答案,所以我们可以运用差分的思 ...
- CF671C. Ultimate Weirdness of an Array
n<=200000个<=200000的数问所有的f(i,j)的和,表示去掉区间i到j后的剩余的数字中任选两个数的最大gcd. 数论日常不会.. 先试着计算一个数组:Hi表示f(l,r)&l ...
- Codeforces Round #373 (Div. 2) E. Sasha and Array 矩阵快速幂+线段树
E. Sasha and Array time limit per test 5 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 1076G - Array Game(博弈论+线段树)
Codeforces 题面传送门 & 洛谷题面传送门 一道 hot tea--听讲解时半懂不懂因为不知道题目意思,最后终究还是琢磨出来了( 首先注意到对于每个 \(a_i\),它具体是什么并不 ...
- F - One Occurrence CodeForces - 1000F (线段树+离线处理)
You are given an array aa consisting of nn integers, and qq queries to it. ii-th query is denoted by ...
- Almost Regular Bracket Sequence CodeForces - 1095E (线段树,单点更新,区间查询维护括号序列)
Almost Regular Bracket Sequence CodeForces - 1095E You are given a bracket sequence ss consisting of ...
随机推荐
- python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...
- MHA集群(gtid复制)和vip漂移
在上一片博客中,讲述了怎么去配置MHA架构!这片博客不再细说,只说明其中MySQL主从搭建,这里使用的是gtid加上半同步复制! 步骤与上一片博客一样,不同之处在于MySQL主从的搭建!详细的gtid ...
- Python Web学习笔记之SOCK_STREAM和SOCK_DGRAM
SOCK_STREAM 数据流 一般是tcp/ip协议的编程 有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料(如文件)传送 SOCK_DGRAM 数据包 udp协议网络编程 ...
- HTML 语义化标签-新增标签介绍
HTML 基础知识 版权声明:未经博主授权,内容严禁转载 ! HTML语义化标签概念 如果没有语义化标签,上面这些 div 都是没有实际意义的,只是我们提供给浏览器的指令. 和 语义化 代码对比: 什 ...
- 20145339顿珠 Exp5 MSF基础应用
20145339顿珠 Exp5 MS08_067漏洞测试 实验过程 IP地址:192.168.1.104 虚拟机ip:192.168.1.102 在控制台内使用search ms08_067查看相关信 ...
- C++类的静态成员变量初始化 Win32 API 定时器使用
1.类的静态成员变量 .h 类声明入下 class A { public: static int x; }; .cpp文件 这样初始化. ; 2.定时器使用 1.SetTimer(HWND,UINT, ...
- div转svg svg转canvas svg生成图片及图片下载 分享
链接来自:http://blog.csdn.net/u010081689/article/details/50728854
- Python3基础 函数 未指定返回值,返回NONE
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- luogu P4396 [AHOI2013]作业
目录 题目 思路 错误&&傻叉 代码 题目 luogu 思路 每次都是插入比之前所有数字大的数,所以之前的答案就不会改变 用fhq-treap求出原序列,然后用树状数组依次算出每个值得 ...
- yum第三方安装-软件包没签名及更新错误
yum安装时 后面加 --nogpgcheck 阿里云源文件:http://mirrors.aliyun.com/repo/Centos-7.repo epel repo源:http://mirror ...