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. Chrome 135 版本新特性

    Chrome 135 版本新特性 一.Chrome 135 版本浏览器更新 ** 1. 第三方托管账户注册迁移到 OIDC 授权码流程** Chrome 135 将账户注册的登录页面从营销网站迁移到动 ...

  2. 魔方求解器桌面版(层先法,基于Tauri实现)

    开发了一个桌面版的三阶魔方求解器,代码地址:https://github.com/davelet/rubik-cube-restore/pull/2 .欢迎使用. 一.层先法求解 代码逻辑是从前面的j ...

  3. async/await Task.Delay 和Thread.Sleep的理解

    async/await Task.Delay 和Thread.Sleep的理解 相关学习资料: 第十七节:从状态机的角度async和await的实现原理(新) - Yaopengfei - 博客园 ( ...

  4. 《原型设计工具深度解析:Axure到墨刀的实战指南》

    原型设计工具深度解析:从Axure到墨刀的实战应用 项目背景 "Shou学"作为信息学院本科必修课指南平台,需通过高保真原型实现课程导航.知识点拆解.习题模拟等核心功能.本文结合& ...

  5. vue3 基础-API-响应式 toRef, context

    上篇讲了构造响应式变量 ref 和 reactive 函数, 其中 ref 针对基础类型, reactive 针对引用类型. 而 toRefs 可以将响应式变量进行结构后, 仍然具备响应式. 而本篇继 ...

  6. Vite 3 来了!新增功能 + 如何迁移

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  7. Jupyter notebook添加Anaconda中的虚拟环境

    1.创建虚拟环境 conda create -n your_virtual_env python=3.6 2.激活新创建的环境 activate your_virtual_env 3.安装nb_con ...

  8. 赛前十天——打印输入字符串的全排列&&cls(java实现)

    package javaPractice; import java.util.Scanner; public class Contest13 { public static void main(Str ...

  9. Windows下使用Qt复制文件夹(xcopy,非QFile)

    Windows下使用Qt复制文件夹(xcopy,非QFile) .h文件 #ifndef CXCOPY_H #define CXCOPY_H #include <QWidget> #inc ...

  10. OAuth2密码模式:信任的甜蜜陷阱与安全指南

    title: OAuth2密码模式:信任的甜蜜陷阱与安全指南 date: 2025/05/29 14:56:19 updated: 2025/05/29 14:56:19 author: cmdrag ...