Codeforces 671C Ultimate Weirdness of an Array 线段树 (看题解)

Ultimate Weirdness of an Array

写不出来, 日常好菜啊。。

考虑枚举GCD, 算出一共有多少个对 f(l, r) <= GCD, 我们用fuc[ i ] 表示的是在 l = i 这个位置开始, 最小的合法的 R, 

可以发现这个函数随 i 单调不下降, 枚举GCD 的时候, 找到GCD 的倍数的位置, 用线段树更新最大值。

#include<bits/stdc++.h>
#define LL long long
#define LD long double
#define ull unsigned long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ALL(x) (x).begin(), (x).end()
#define fio ios::sync_with_stdio(false); cin.tie(0);using namespace std;const int N = 2e5 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
const double PI = acos(-1);template<class T, class S> inline void add(T& a, S b) {a += b; if(a >= mod) a -= mod;}
template<class T, class S> inline void sub(T& a, S b) {a -= b; if(a < 0) a += mod;}
template<class T, class S> inline bool chkmax(T& a, S b) {return a < b ? a = b, true : false;}
template<class T, class S> inline bool chkmin(T& a, S b) {return a > b ? a = b, true : false;}int n, a[N];
int maxPos[N][2];
int minPos[N][2];
int cnt[N];
LL H[N];
int mx[2], mn[2], tot;#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
struct segmentTree {LL sum[N << 2]; int lazy[N << 2], mn[N << 2], mx[N << 2];inline void pull(int rt) {sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];mx[rt] = max(mx[rt << 1], mx[rt << 1 | 1]);mn[rt] = min(mn[rt << 1], mn[rt << 1 | 1]);}inline void push(int rt, int l, int r) {if(~lazy[rt]) {int mid = l + r >> 1;sum[rt << 1] = 1LL * (mid - l + 1) * lazy[rt];sum[rt << 1 | 1] = 1LL * (r - mid) * lazy[rt];lazy[rt << 1] = lazy[rt << 1 | 1] = lazy[rt];mx[rt << 1] = mn[rt << 1] = lazy[rt];mx[rt << 1 | 1] = mn[rt << 1 | 1] = lazy[rt];lazy[rt] = -1;}}void build(int l, int r, int rt) {lazy[rt] = -1;if(l == r) {sum[rt] = l;mx[rt] = l;mn[rt] = l;return;}int mid = l + r >> 1;build(lson); build(rson);pull(rt);}void update(int L, int R, int val, int l, int r, int rt) {if(R < l || r < L || R < L) return;if(mn[rt] >= val) return;if(L <= l && r <= R && mx[rt] <= val) {sum[rt] = 1LL * (r - l + 1) * val;mx[rt] = val;mn[rt] = val;lazy[rt] = val;return;}if(l == r) return;push(rt, l, r);int mid = l + r >> 1;update(L, R, val, lson);update(L, R, val, rson);pull(rt);}
} Tree;int main() {memset(maxPos, 0xc0, sizeof(maxPos));memset(minPos, 0x3f, sizeof(minPos));scanf("%d", &n);for(int i = 1; i <= n; i++) {scanf("%d", &a[i]);cnt[a[i]]++;if(i >= maxPos[a[i]][0]) {maxPos[a[i]][1] =  maxPos[a[i]][0];maxPos[a[i]][0] = i;} else if(i > maxPos[a[i]][1]) maxPos[a[i]][1] = i;if(i <= minPos[a[i]][0]) {minPos[a[i]][1] =  minPos[a[i]][0];minPos[a[i]][0] = i;} else if(i < minPos[a[i]][1]) minPos[a[i]][1] = i;}Tree.build(1, n, 1);for(int v = 200000; v >= 0; v--) {H[v] = 1LL * n * n - Tree.sum[1] + n;if(!v) break;mx[0] = mx[1] = -inf - 1;mn[0] = mn[1] = inf;tot = 0;for(int w = v; w <= 200000; w += v) {if(maxPos[w][0] == -inf - 1) continue;if(maxPos[w][0] >= mx[0]) mx[1] = mx[0], mx[0] = maxPos[w][0];else if(maxPos[w][0] > mx[1]) mx[1] = maxPos[w][0];if(maxPos[w][1] >= mx[0]) mx[1] = mx[0], mx[0] = maxPos[w][1];else if(maxPos[w][1] > mx[1]) mx[1] = maxPos[w][1];if(minPos[w][0] <= mn[0]) mn[1] = mn[0], mn[0] = minPos[w][0];else if(minPos[w][0] < mn[1]) mn[1] = minPos[w][0];if(minPos[w][1] <= mn[0]) mn[1] = mn[0], mn[0] = minPos[w][1];else if(minPos[w][1] < mn[1]) mn[1] = minPos[w][1];tot += cnt[w];}if(tot == 2) {int p1 = mn[0], p2 = mn[1];Tree.update(1, p1, p1, 1, n, 1);Tree.update(p1 + 1, p2, p2, 1, n, 1);Tree.update(p2 + 1, n, n + 1, 1, n, 1);} else if(tot == 3) {int p1 = mn[0], p2 = mn[1], p3 = mx[0];Tree.update(1, p1, p2, 1, n, 1);Tree.update(p1 + 1, p2, p3, 1, n, 1);Tree.update(p2 + 1, n, n + 1, 1, n, 1);} else if(tot > 3){int p1 = mn[0], p2 = mn[1], p3 = mx[1], p4 = mx[0];Tree.update(p2 + 1, n, n + 1, 1, n, 1);Tree.update(p1 + 1, p2, p4, 1, n, 1);Tree.update(1, p1, p3, 1, n, 1);}}LL ans = 0;for(int i = 1; i <= 200000; i++)ans += (H[i] - H[i - 1]) * i;printf("%lld\n", ans);return 0;
}/*
*/

 

转载于:https://www.cnblogs.com/CJLHY/p/10978952.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓开发环境_我的安卓开发环境

大家好&#xff0c;今天想跟大家分享一下我的安卓开发环境&#xff0c;分别是硬件环境和软件环境。那么在开始之前先交代下我的背景&#xff0c;我从事安卓开发1年8个月&#xff0c;安卓教学9个月&#xff0c;大项目1个&#xff0c;小项目100。先说说硬件环境吧&#xff0c;直接…

构造函数,拷贝构造函数,赋值函数

C中一般创建对象&#xff0c;拷贝或赋值的方式有构造函数&#xff0c;拷贝构造函数&#xff0c;赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数&#xff0c;是当创建一个类的对象时&#xff0c;它被调用来…

性能优化系列

常见性能优化策略的总结&#xff08;转&#xff09; https://www.cnblogs.com/ajianbeyourself/p/6132546.html 网站前端和后台性能优化的34条宝贵经验和方法 https://www.imooc.com/article/41237 一次性能优化实战经历 https://www.cnblogs.com/SameZhao/p/6238997.html …

qotd服务_QOTD:Java线程与Java堆空间

qotd服务以下问题很常见&#xff0c;并且与OutOfMemoryError有关&#xff1a;在JVM线程创建过程和JVM线程容量期间无法创建新的本机线程问题。 这也是我向新技术候选人&#xff08;高级职位&#xff09;提出的典型面试问题。 我建议您在查看答案之前尝试提供自己的答复。 题&a…

ecs服务器数据迁移_某国际物流集团的云迁移解决方案

新钛云服已为您服务905天云计算流行当下&#xff0c;使用新技术较早的互联网企业&#xff0c;已基本实现云计算实施。传统企业也开始接触云计算并进行使用&#xff0c;但由于与互联网轻实体资产的模式不同&#xff0c;其往往面临着业务迁移上云的难题。云迁移过程非常复杂&…

红黑树的红黑标志有什么用

红黑树使用红黑二色进行“着色”&#xff0c;目的是利用颜色值作为二叉树的平衡对称性的检查&#xff0c;只要插入的节点“着色”满足红黑二色的规定&#xff0c;最短路径与最长路径不会相差的太远&#xff0c;红黑树的节点分布就能大体上达至均衡。 演示动画网站&#xff1a;h…

内存泄露与内存溢出

内存泄露是指你的应用使用资源之后没有及时释放&#xff0c;导致应用内存中持有了不需要的资源&#xff0c;这是一种状态描述。 内存溢出是指你的应用的内存已经不能满足正常使用了&#xff0c;堆栈已经达到系统设置的最大值&#xff0c;进而导致崩溃&#xff0c;这事一种结果描…

琥珀项目:较小的,面向生产力的Java语言功能

Brian Goetz最近的消息欢迎来到琥珀&#xff01; 介绍Project Amber &#xff08; OpenJDK的一部分&#xff0c; 最初于1月提出 &#xff09;。 Goetz通过介绍“欢迎使用Amber项目&#xff0c;这是我们面向特定生产力的Java语言JEP的孵化场”的介绍打开了这一消息。 Goetz重申&…

python个人收支管理系统相关题目_练手题:计算人均付费(SQLPython)

ARPU&#xff1a;人均付费总收入/总人数ARPPU&#xff1a;付费用户人均付费总收入/付费人数业务要求&#xff1a;1.各地市用户数、总费用(ARPU之和)是多少&#xff1f;2.表一中各地市ARPU(0,30),[30,50),[50-80),[80以上)用户数分别是多少&#xff1f;3.表二中用户有重复的记录…

Web 框架

1、Web框架 Web框架&#xff08;Web framework&#xff09;是一种开发框架&#xff0c;用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式&#xff0c;也为web行为提供了一套通用的方法。web框架已经实现了很多功能&#xff0c;开…

“引用作为函数参数”与 “引用作为函数返回值”

一、引用作为函数参数 作为函数参数时引用有两种原因&#xff1a;1、在函数内部会对此参数进行修改&#xff1b;2、提高函数调用和运行效率。 关于第一点&#xff0c;都知道C里提到函数就会提到形参和实参。如果函数的参数实质就是形参&#xff0c;不过这个形参的作用域只是在…

vue删除数组中的一条数据_删除排序数组中的重复项 II

删除排序数组中的重复项 II题目给定一个增序排列数组 nums &#xff0c;你需要在 原地 删除重复出现的元素&#xff0c;使得每个元素最多出现两次&#xff0c;返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的…

使用Docker堆栈部署的微服务-WildFly,Java EE和Couchbase

关于微服务的资料很多&#xff0c;只是用谷歌搜索就可以了 &#xff01; 几年前&#xff0c;我在比利时的Devoxx上发表了有关将单片重构为微服务的演讲&#xff0c;它得到了很好的评价&#xff1a; 该博客将展示Docker如何简化微服务的创建和关闭。 该博客中使用的所有代码都…

基于图像灰度的模板匹配

基于图像灰度的模板匹配 设模板图像T&#xff08;m*n&#xff09;&#xff0c;待匹配图像I&#xff08;M*N&#xff09;&#xff0c;两幅图像的原点都在左上角&#xff0c;这里有&#xff08;m<M&#xff0c;n<N&#xff09;。模板匹配的基本原理很简单&#xff1a;模板图…

学习activemq,在spring中activemq的配置信息

提供者&#xff1a; <?xml version"1.0" encoding"UTF-8"?><beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:jms"http://www.springframewor…

pca各个向量之间的相关度_PCA主成分分析

降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征&#xff0c;去除噪声和不重要的特征&#xff0c;从而实现提升数据处理速度的目的。降维的算法有很多&#xff0c;比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA…

matlab 图像坐标系

matlab 图像中图像坐标系与plot、 imrotate坐标系的区别 图像坐标系是以图像左上角为原点&#xff0c;访问图像像素点img&#xff08;m&#xff0c;n&#xff09;&#xff0c;如下图所示&#xff1a; plot的坐标系&#xff0c;以图像左上角为原点&#xff0c;在图像中划线时&am…

matlab impyramid图像金字塔

B impyramid&#xff08;I, direction&#xff09; direction 可取‘reduce’或‘expand’&#xff0c;表示图像的宽度与高度缩小为原来的1/2与变大为原来的2倍

python你会吗_Python这些问题你会吗?

Python这些问题你会吗&#xff1f;final作用域的代码一定会被执行吗&#xff1f;正常的情况下&#xff0c;finally作用域的代码一定会被执行的&#xff0c;不管是否发生异常。哪怕是调用了sys.exit函数&#xff0c;finally也是会被执行的&#xff0c;那怎么样才能让finally代码…

perl大骆驼和小骆驼_你好骆驼:自动文件传输

perl大骆驼和小骆驼Apache Camel在其主页上 &#xff08;以及Camel用户指南中 &#xff09;将其描述为“基于已知企业集成模式的通用开源集成框架”。 Camel框架基于《 企业集成模式 》一书&#xff0c;并提供了该书中描述的模式的实现 。 我看一下这篇文章中使用Camel的“ Hel…