AT_arc133_b [ARC133B] Dividing Subsequence

模拟赛原题,来写篇题解。

只考虑匹配的状态,根据调和级数的数学知识,匹配的状态数不多,为 \(O(n\log n)\),考虑动态规划。

我们对于每个 \(a_i\) 预处理出可以匹配的位置 \(c_{i,j}\) 表示第 \(i\) 位可以匹配的第 \(j\) 个位置,记 \(f_{i,j}\) 表示第 \(i\) 位匹配第 \(j\) 个可以匹配的位置的最长子序列长度。显然有以下转移方程:

\[f_{i,j}=\max_{l\lt i,c_{l,k}\lt c_{i,j}}\{f_{l,k}\}+1
\]

线段树优化 dp,每次把 \(f_{i,j}\) 插到 \(c_{i,j}\) 上,查询时直接查询 \(\lt c_{i,j}\) 的位置即可,时间复杂度 \(O(n\log^2n)\)。

模拟赛时被卡常了,不过 Atcoders 上稳过。

#include <bits/stdc++.h>
using namespace std;
struct node
{
int mx;
}tr[900000];
int n,a[300000],b[300000],p[300000],ans=0,cnt=0,rt=1;
vector<int>c[300000],f[300000];
void pushup(int x)
{
tr[x].mx=max(tr[(x<<1)].mx,tr[(x<<1)|1].mx);
} void update(int x,int l,int r,int p,int k)
{
if(l==r)
{
tr[x].mx=max(tr[x].mx,k);
return;
}
int mid=(l+r)>>1;
if(p<=mid)update((x<<1),l,mid,p,k);
else update((x<<1)|1,mid+1,r,p,k);
pushup(x);
} int query(int x,int l,int r,int lx,int rx)
{
if(lx==0||rx==0)return 0;
if(l>=lx&&r<=rx)return tr[x].mx;
int mid=(l+r)>>1,ans=0;
if(lx<=mid)ans=max(ans,query((x<<1),l,mid,lx,rx));
if(rx>=mid+1)ans=max(ans,query((x<<1)|1,mid+1,r,lx,rx));
return ans;
} int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)scanf("%d",&b[i]),p[b[i]]=i;
for(int i=1;i<=n;i++)
for(int j=a[i];j<=n;j+=a[i])
c[i].push_back(p[j]);
for(int i=0;i<c[1].size();i++)f[1].push_back(1);
for(int i=0;i<c[1].size();i++)update(rt,1,n,c[1][i],f[1][i]);
for(int i=2;i<=n;i++)
{
for(int j=0;j<c[i].size();j++)f[i].push_back(query(rt,1,n,1,c[i][j]-1)+1);
for(int j=0;j<c[i].size();j++)update(rt,1,n,c[i][j],f[i][j]);
}
for(int i=1;i<=n;i++)
for(int j=0;j<f[i].size();j++)
ans=max(ans,f[i][j]);
printf("%d\n",ans);
return 0;
}

Atcoders [ARC133B] Dividing Subsequence 题解的更多相关文章

  1. [LeetCode] Is Subsequence 题解

    前言 这道题的实现方法有很多,包括dp,贪心算法,二分搜索,普通实现等等. 题目 Given a string s and a string t, check if s is subsequence ...

  2. Hdoj 1159.Common Subsequence 题解

    Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...

  3. 【AtCoder】AGC026 题解

    A - Colorful Slimes 2 找相同颜色的一段,然后答案加上段长除2下取整 代码 #include <iostream> #include <cstdio> us ...

  4. [Leetcode] Longest Palindromic Subsequence

    Longest Palindromic Subsequence 题解 题目来源:https://leetcode.com/problems/longest-palindromic-subsequenc ...

  5. LeetCode编程训练 - 折半查找(Binary Search)

    Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...

  6. [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总

    本文出自   http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner  打开 这个专题一共有25题,刷完 ...

  7. 算法与数据结构基础 - 折半查找(Binary Search)

    Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...

  8. 算法与数据结构基础 - 贪心(Greedy)

    贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...

  9. C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解

    版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...

  10. Codeforces 750E New Year and Old Subsequence 线段树 + dp (看题解)

    New Year and Old Subsequence 第一感觉是离线之后分治求dp, 但是感觉如果要把左边的dp值和右边的dp值合起来, 感觉很麻烦而且时间复杂度不怎么对.. 然后就gun取看题解 ...

随机推荐

  1. C#(如何解决使用enum和struct作为Dictionary的TKey带来的GC

  2. 在Winform开发框架支持多种数据库基础上,增加对国产数据库人大金仓的支持

    一个良好的产品,可能往往需要支持多种数据库的接入,根据实际业务的需要进行调整,有时候可能需要2到3种数据库的支持. 在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统 ...

  3. windows10 安装 git

    windows10 安装 git 1.前往官网:https://git-scm.com/downloads 网站会自动识别系统,若识别有误,则自己选择更改即可 2.双击运行 3.选择自己的安装目录 4 ...

  4. 【深度学习】MLE视角下的VAE与DDPM损失函数推导

    正文 最大似然估计的由来 VAE和DDPM都是likelihood-based生成模型,都是通过学习分布->采样实现图像生成的: 这类模型最大的特点就是希望实现 \[\theta = \arg\ ...

  5. 1.3K star!像拿快递一样传送文件,这么酷!

    嗨,大家好,我是小华同学,关注我们获得 "最新.最全.最优质" 开源项目和高效工作学习方法 trzsz 是一款革命性的文件传输工具,专为终端用户设计.它完美兼容传统 rz/sz 协 ...

  6. 【记录】OJ|区间DP|石子合并(环形)

    1. 题干 描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出一个算法,计算出将N堆石子 ...

  7. 制作带sshd功能的centos镜像

    docker run -it --name node1 docker.io/centos bash  创建node1容器 docker exec -it node1 bash 进入node1 yum ...

  8. uni-app小程序登录后…

    前情 最近新接了一个全新项目,是类似商城的小程序项目,我负责从0开始搭建小程序,我选用的技术栈是uni-app技术栈,其中就有一个用户登录功能,小程序部分页面是需要登录才可以查看的,对于未登录的用户需 ...

  9. ZigZag Conversion——LeetCode进阶路⑥

    原题链接https://leetcode.com/problems/zigzag-conversion/ 没开始看题目时,小陌发现这道题似乎备受嫌弃,被n多人踩了,还有点小同情 题目描述 The st ...

  10. Web前端入门第 57 问:JavaScript 数据类型与类型转换

    在程序语言中,数据类型是基础,一切程序都是建立在基础数据之上. 如果说程序如同万丈高楼平地起,那么数据类型就像沙.石.钢筋.水泥等等最基础的原料.一样的高楼,不同的人,用相同的原料,造的方法也会有千般 ...