[TJOI2013]最长上升子序列 [SCOI2009]游戏

简介: [TJOI2013]最长上升子序列 [SCOI2009]游戏

[TJOI2013]最长上升子序列

题目描述

运行代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n;
int f[N], tr[N];
vector<int> v; 
void add(int x, int k)
{
    for ( ; x <= n; x += x & -x) 
        tr[x] = max(tr[x], k);
} 
int query(int x)
{
    int r = 0;
    for ( ; x; x -= x & -x)
        r = max(r, tr[x]);
    return r;
}
int main()
{
    cin>>n; 
    for (int i = 1; i <= n; i ++ )
    {
        int x;
        cin>>x;
        v.insert(v.begin() + x, i);
    }
    for (auto x : v) {
        f[x] = query(x - 1) + 1;
        add(x, f[x]);
    }
    for (int i = 1; i <= n; i ++ )
    {
        f[i] = max(f[i], f[i - 1]);
        cout<<f[i]<<endl;
    } 
    return 0;
}

代码思路

  • int f[N], tr[N]; 分别存储原序列每个位置的最长上升子序列长度和树状数组。vector<int> v; 用于存储离散化后的序列位置。
  • 函数 add(x, k): 更新树状数组 tr[],使得位置 x 对应的值变为 max(tr[x], k)。这是通过位运算快速定位并更新相关位置实现的。
  • 函数 query(x): 查询位置 x 之前(包括 x)的最大值。这是树状数组查询操作的基本应用。
  • 主函数 main():
  • 输入序列长度 n
  • 遍历输入每个元素的位置 x,并在向量 v 的对应位置插入当前的序号 i,实现离散化。
  • 遍历离散化后的序列 v,对每个位置 x
  • 计算其最长上升子序列长度 f[x] 为当前位置左边最大长度加上 1。
  • 更新树状数组 tr[]
  • 最后再次遍历 f[],利用前一个位置的最长上升子序列长度更新当前的 f[i],保证连续性,并输出最终的最长上升子序列长度序列。

[SCOI2009]游戏

题目描述

运行代码

#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N=1e4;
int p[N],v[N],dp[N];
signed main()
{
    int n;
    cin>>n;
    for(int i=2;i<=n;i++)  
    {
        if(!v[i]) 
         p[++p[0]]=i;
        for(int j=1;j<=p[0] && i*p[j]<=n;j++)
        {
            v[i*p[j]]=1;
            if(!(i%p[j])) break;
        }
    }
    for(int i=dp[0]=1;i<=p[0];i++) 
        for(int j=n;j>=p[i];j--)
            for(int k=p[i];k<=j;k*=p[i])
                dp[j]+=dp[j-k];
    dp[0]=0;
    for(int i=1;i<=n;i++)
        dp[0]+=dp[i];
    cout<<dp[0]+1<<endl;
    return 0;
}

代码思路

素数筛

  • 使用埃拉托斯特尼筛法生成素数:初始化数组v[N]标记每个数是否为合数,数组p[N]存储素数。
  • 当遍历到数i时,如果v[i]为0,说明i是素数,将其存入素数数组p中。
  • 针对当前素数i,将所有i的倍数标记为合数(v[i*p[j]]=1),当遇到i的平方时跳出内层循环,减少重复计算。

计算欧拉函数之和

  • 初始化动态规划数组dp[N],其中dp[i]表示小于等于i的数中,欧拉函数值的和。
  • 外层循环遍历素数数组p。内层循环倒序遍历从n到每个素数的倍数(步进为当前素数)。内内层循环计算当前素数的幂次方(不超过当前数j),累加到dp数组中,实际上是在计算形如φ(j-k)的和,其中k是当前素数的幂次方序列,这样做可以高效地累加每个数的欧拉函数值。
  • 最后,dp[0]=0用于初始化累加和的起始值。
  • 遍历dp数组,累加所有dp[i]的值,得到小于等于n的所有欧拉函数值之和。
  • 输出结果加1(因为题目要求包括n自身),cout<<dp[0]+1<<endl;
目录
相关文章
|
开发框架 前端开发 JavaScript
循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示
循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示
|
资源调度 分布式计算 算法
Floyd 循环检测算法(快慢指针法/龟兔指针法)
Floyd Cycle Detection Algorithm,即Floyd 循环检测算法,又称快慢指针法、龟兔指针法。该算法用于判断链表是否存在环,以及判断环的起点与长度的算法。
Floyd 循环检测算法(快慢指针法/龟兔指针法)
|
缓存 网络协议 调度
《CDN 之我见》系列一:原理篇(由来、调度)
CDN是将源站内容分发至全国所有的节点,从而缩短用户查看对象的延迟,提高用户访问网站的响应速度与网站的可用性的技术。它能够有效解决网络带宽小、用户访问量大、网点分布不均等问题。为了让大家更全面的了解CDN的原理、调度、缓存和安全等关键技术点,阿里云高级技术专家白金将自己从事 CDN 相关领域工作 8 年来的一些经验、收获和个人认知撰写成《CDN之我见》系列文章,分享给大家。
21885 0
|
4天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1106 0
|
3天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
533 10
|
13天前
|
人工智能 运维 安全
|
12天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
4天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
303 0

热门文章

最新文章