题解:P7810 [JRKSJ R2] Upper

news/2025/10/2 10:35:02/文章来源:https://www.cnblogs.com/FQBC/p/19123299

题目描述

\(n\) 张扑克,第 \(i\) 张扑克上写有一个正整数 \(a_i\)

现在要把扑克划分成若干个合法的连续子段,其中,一个连续子段 \([l,r]\)“合法”当且仅当这个子段同时满足两个条件:

  • \(a_l< a_r\)
  • \(\gcd(a_l,a_r)>1\)

请问最多能划分多少段。如果没有合法的划分方案,输出 \(-1\) 即可。

Solution

不妨先来想一想暴力的 dp 怎么写。

不难想到令 \(f_i\) 为以 \(i\) 结尾的最多段数,则可写出方程:

\[dp_i= \max \limits _{j=1} ^{i-1} (dp_j+1)[(\gcd(a_j,a_i)>1) ~\land~ (a_i>a_j) ] \]

其中中括号里的代表转移条件,\(\land\) 代表且。

时间复杂的 \(O(n^2)\),考虑优化。

如果只考虑 \(a_l<a_r\) 这个条件,我们不难想到值域的数据结构优化。

现在我们可以考虑 \(\gcd(a_l,a_r) > 1\) 的特殊性。

不妨先将 \(a_l,a_r\) 质因数分解,如果 \(\gcd(a_l,a_r) > 1\) 则它们必定包含相同的质因数。利用这条性质,我们可以将所有 \(a_i\) 所包含的质因数中给每一个质因数开一棵树状数组。

再结合 \(a_l<a_r\) 这个条件,我们就可以改成开值域数组数组。

但是有一个雷点就是不要离散化之后直接丢进去,因为当前 \(a_i\) 是质因数的倍数,所以可以将这个倍数离散化之后再塞进去,这样即可避免 MLE。

Tips

开树状数组时一定要用 vector,并且不要长度开多了。

dp 数组和树状数组一定要初始化为负无穷,不然就像我一样条半天。

Code

#include<bits/stdc++.h>
#define debug cout<<"fuck you"<<endl;
#define int long long
using namespace std;
const int N=3e5+5;bool vis[N];
int pri[N],cnt;void ol(int SZ){//预处理素数 memset(vis,1,sizeof(vis));vis[1]=0;for(int i=2;i<=SZ;i++){if(vis[i]) pri[++cnt]=i;for(int j=1;j<=cnt && pri[j]*i<=SZ;j++){vis[pri[j]*i]=0;if(i%pri[j]==0) break;}}
//	for(int i=1;i<=cnt;i++) cout<<pri[i]<<" ";
}vector<int> d[N],tmp_d[N];//d[i]为第i个数的质因数集合 
int num_d[N];
void push_d(int x,int num){//分解质因数 for(int i=1;pri[i]*pri[i]<=x;i++){if(x%pri[i]==0){d[num].push_back(pri[i]);while(x%pri[i]==0) x/=pri[i];} } if(x!=1) d[num].push_back(x);return;
} int lowbit(int x){return x&-x;
}
struct FK_tree{//树状数组 vector<int> tr;int max_n;void init(int xx){max_n=xx+1;tr.resize(xx+10,-1e9);}int ask(int fk){int res=-1e9;for(;fk;fk-=lowbit(fk))res=max(res,tr[fk]);return res;}void change(int fk,int fq){for(;fk<=max_n;fk+=lowbit(fk))tr[fk]=max(tr[fk],fq);}
};int get_rnk(int trr,int val){//离散化后获取倍数的排名 vector<int>::iterator iter = tmp_d[trr].begin() + num_d[trr]; //一定要用迭代器 return lower_bound(tmp_d[trr].begin(),iter,val) - tmp_d[trr].begin() + 1;//+1是为了避免RE 
}vector<FK_tree> tree;
int a[N],n,tot,f[N],tot_tr;
map<int,int> mp,trmp;
signed main(){tree.resize(2e5);ol(2e5);cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) push_d(a[i],i);memset(f,-0x7f,sizeof f);f[1]=-1; for(int i=1;i<=n;i++)for(int j=0;j<d[i].size();j++)if(trmp[d[i][j]]==0) trmp[d[i][j]]=++tot_tr,tree[trmp[d[i][j]]].init(2*N/d[i][j]);//cout<<tot_tr;for(int i=1;i<=n;i++)for(int j=0;j<d[i].size();j++)tmp_d[trmp[d[i][j]]].push_back(a[i]);for(int i=1;i<=tot_tr;i++){sort(tmp_d[i].begin(),tmp_d[i].end());num_d[i]=unique(tmp_d[i].begin(),tmp_d[i].end()) - tmp_d[i].begin();}for(int j=0;j<d[1].size();j++)tree[trmp[d[1][j]]].change(get_rnk(trmp[d[1][j]],a[1]),0);for(int i=2;i<=n;i++){for(int j=0;j<d[i].size();j++)f[i]=max(f[i],tree[trmp[d[i][j]]].ask(get_rnk(trmp[d[i][j]],a[i])-1)+1);for(int j=0;j<d[i+1].size();j++)//下一个区间的开头,所以要 +1 tree[trmp[d[i+1][j]]].change(get_rnk(trmp[d[i+1][j]],a[i+1]),f[i]);	}if(f[n]<0) cout<<-1;else cout<<f[n];
}

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

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

相关文章

网站关键词排名消失动漫设计与制作好学吗

Spring Data REST 提供了一种简单的方式来暴露 JPA 实体为 RESTful 服务&#xff0c;这使得构建基于 REST 的数据服务变得非常快速和高效。下面是一个使用 Spring Data REST 构建通用架构的基本示例&#xff1a; 首先&#xff0c;我们需要创建一个实体类&#xff08;例如&…

记录自己被AWS坑了6刀

AWS(Amazon Web services) 亚马逊云坑了我6刀。我被AWS反向薅羊毛了$6美元。 我试用了AWS的一年免费EC2服务器。 上个月开启了一个 load balancer ,我以为它和 cloudfront 一样是只按流量收费的,想不到 load balance…

Spring 框架中 ​​RestTemplate 的使用方法​​ - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

桂林新站优化网站模板后台怎么做

输入一个英文句子&#xff0c;翻转句子中单词的顺序&#xff0c;但单词内字符的顺序不变。为简单起见&#xff0c;标点符号和普通字母一样处理。例如输入字符串"I am a student. "&#xff0c;则输出"student. a am I"。 示例 1&#xff1a; 输入: "…

tnkstat3e-merge-0

统计思维(程序员的概率统计)第三版(一)原文:allendowney.github.io/ThinkStats/index.html 译者:飞龙 协议:CC BY-NC-SA 4.0统计思维第三版原文:allendowney.github.io/ThinkStats/index.htmlThink Stats 是面…

如何用pivotby函数实现数据透视(1)

背景 ========================================================================================= 因为每次都要统计当前毕业的毕业去向落实率,每次都在拉两次透视表,做N次VLOOPUP,再写一个求百分比的公式, ---…

网站建设 拖欠尾款水果建设网站前的市场分析

指针初阶 1.指针是什么2.指针和指针类型2.1 指针-整数2.2 指针的解引用 3.野指针3.1 野指针成因3.2如何避免野指针 4.指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算 5.指针和数组6.二级指针7.指针数组 1.指针是什么 指针是什么&#xff1f; 指针理解的2个要点&#xf…

JavaScript零基础入门速通(完整) - 指南

JavaScript零基础入门速通(完整) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

企业为什么做平台网站企业网站建设的实验报告

准备工作 这部分其实在谷歌或者百度上搜索下就可以完成的&#xff0c;可是我就是想再啰嗦一遍&#xff0c;说不定有比我更懒的同学呢哈哈~ 第一步 Python的安装配置 打开官网: https://www.python.org/downloads/ 目前官网上已经更新到3.6.1啦&#xff08;这更新速度我是服的&…

完整教程:Nginx反向代理核心原理揭秘

完整教程:Nginx反向代理核心原理揭秘pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

详细介绍:五大关系数据库(sqlserver、mysql、oracle、pgsql、sqlite)的对象名称和转义字符

详细介绍:五大关系数据库(sqlserver、mysql、oracle、pgsql、sqlite)的对象名称和转义字符2025-10-02 10:17 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !importa…

@RequestParam 什么时候可以省略?

参数名一致时 当HTTP请求中的参数名与控制器方法参数名完全一致时,@RequestParam可省略。 非必需参数 当请求参数为非必需(即允许未传递该参数时),可通过设置@RequestParam(required=false)或省略注解,此时即使未…

做全景效果图的网站wordpress适应ie6

《“爱读书”--给你讲技术》&#xff0c;我来看书&#xff0c;你来进步&#xff0c;让我们开始吧&#xff01;本书简介书名为《轻量级JavaEE企业应用实战》&#xff0c;是本人在学习JavaEE框架的时候阅读的第一本书&#xff0c;本书对于框架及相关基础知识讲述的比较详细和浅显…

段页式管理方式

分段分页管理中最大的优缺点优点 缺点分页管理 内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片 不方便按照逻辑模块实现信息的共享和保护分段管理 很方便按照逻辑模块实现信息的共享和保护 如果段长过大,…

网站建设与单位干部作风的关系网站竞价推广都有哪些

有些粉丝&#xff0c;希望对自定义业务中&#xff0c;驳回到发起人进行处理&#xff0c;比如可以重新进行发起流程&#xff0c;下面就给出一种方式&#xff0c;当然不一定是最好的方式&#xff0c;只是提供一种参考而已&#xff0c;以后可以考虑动态根据流程状态或节点信息进行…

推进电子设计革新:为什么模拟仿真正是核心助力?

在高速发展的电子设计领域,模拟仿真已成为现代工程师的「得力助手」,它不仅能快速验证设计,还能显著提升流程效率与质量。1、仿真的三大优势:提前预见,精准优化,高效迭代 错误无处遁形 仿真能在设计实施前及时暴…

河北网站seo策划公司变更地址需要多少钱

T2-简单 MST题解 题意 设 ω ( x ) \omega(x) ω(x)为 x x x的质因数所构成的集合大小&#xff1b; 给两个正整数 l l l r r r&#xff0c;图上有 r − l 1 r-l1 r−l1个点&#xff0c;为 l , l 1 , l 2 , ⋯ , r − 2 , r − 1 , r l,l1,l2,\cdots,r-2,r-1,r l,l1,l2,…

网站域名 格式怎么做学校网站和微信公众号

日常工作中&#xff0c;经常会用到FTP&#xff0c;一般情况下&#xff0c;FTP站点在IE中&#xff08;尤其是IE7以后版本&#xff09;打开&#xff0c;默认都不是以文件夹视图方式打开的&#xff0c;这时IE也会给你提示“若要在 Windows 资源管理器中查看此 FTP 站点&#xff0c…

完整教程:深度解析ZStack Cloud v5.4.0 LTS 基础架构三大核心突破

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:精读C++20设计模式:结构型设计模式:装饰器模式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …