P4093[HEOI2016/TJOI2016]序列

这篇具有很好参考价值的文章主要介绍了P4093[HEOI2016/TJOI2016]序列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

P4093[HEOI2016/TJOI2016]序列

题目描述

佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他。

玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一个值发生变化。现在佳媛姐姐已经研究出了所有变化的可能性,她想请教你,能否选出一个子序列,使得在任意一种变化中,这个子序列都是不降的?请你告诉她这个子序列的最长长度即可。

输入格式

输入的第一行有两个正整数 n , m n,m n,m,分别表示序列的长度和变化的个数。

接下来一行有 n n n 个整数,表示这个数列原始的状态。

接下来 m m m 行,每行有 2 2 2 个整数 x , y x,y x,y,表示数列的第 x x x 项可以变化成 y y y 这个值。

输出格式

输出一个整数,表示对应的答案。

样例 #1

样例输入 #1

3 4 
1 2 3 
1 2 
2 3 
2 1 
3 4

样例输出 #1

3

提示

注意:每种变化最多只有一个值发生变化。

在样例输入中,所有的变化是:

1 2 3
2 2 3
1 3 3
1 1 3
1 2 4

选择子序列为原序列,即在任意一种变化中均为不降子序列。

对于 20 % 20\% 20% 数据,所有数均为正整数,且小于等于 300 300 300

对于 50 % 50\% 50% 数据,所有数字均为正整数,且小于等于 3000 3000 3000

对于 100 % 100\% 100% 数据,所有数字均为正整数,且小于等于 1 0 5 10^5 105 1 ≤ x ≤ n 1\le x\le n 1xn

题目大意

有一个序列以及它的 n n n 种不同的变化,每次变化可以把 a x a_x ax 变成 y y y

你需要找出一个序列,使得在任何一种变化中(可以不变化),这个序列保持不降。

题目问你这种满足这种要求的序列的最大长度是多少?

思路

我们可以处理出 M x [ i ] , M n [ i ] Mx[i] , Mn[i] Mx[i],Mn[i] 表示在所有变化中 i i i 可以达到的最大值和最小值。

显然我们可以用 d p dp dp 来做这道题,转移方程:
KaTeX parse error: Undefined control sequence: \and at position 34: …f_j) (i \leq j \̲a̲n̲d̲ ̲a_j \leq Mn_i \…
我们观察一下这个转移方程,发现这是一个 O ( n 2 ) O(n ^ 2) O(n2) 的方法吗,然后我们考虑用 CDQ分治 + 树状数组 维护

对于区间 [ l , r ] [l , r] [l,r]

我们把 [ l , m i d ] [l , mid] [l,mid] 按照 M x i Mx_i Mxi 升序排序,把区间 [ m i d + 1 , r ] [mid + 1 , r] [mid+1,r] 按照 a i a_i ai 升序排序

然后对于 [ m i d + 1 , r ] [mid + 1 , r] [mid+1,r] 用树状数组维护小于 M n i Mn_i Mni 的数就好了。

然后就发现我们把它转化成了三维偏序问题。

最后时间复杂度就变成了 O ( n l o g 2 n ) O(n log_2 n) O(nlog2n) 可以通过。文章来源地址https://www.toymoban.com/news/detail-434621.html

code

#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define fd(x , y , z) for(int x = y ; x >= z ; x --)
#define LL long long
using namespace std;
const int N = 1e5 + 5;
int tr[N] , f[N] , n , m , a[N] , ans , Mx[N] , Mn[N] , p[N];
int read () {
    int val = 0 , fu = 1;
    char ch = getchar ();
    while (ch < '0' || ch > '9') {
        if (ch == '-') fu = -1;
        ch = getchar ();
    }
    while (ch >= '0' && ch <= '9') {
        val = val * 10 + (ch - '0');
        ch = getchar ();
    }
    return val * fu;
}
bool cmp1 (int x , int y) { return Mx[x] < Mx[y]; }
bool cmp2 (int x , int y) { return a[x] < a[y]; }
int lowbit (int x) { return x & (-x); }
void Insert (int x , int y) {
    while (x <= n) {
        tr[x] = max (tr[x] , y);
        x += lowbit (x);
    }
}
int query (int x) {
    int sum = 0;
    while (x) {
        sum = max (sum , tr[x]);
        x -= lowbit (x);
    }
    return sum;
}
void Clear (int x) {
    while (x <= n) {
        tr[x] = 0;
        x += lowbit (x);
    }
}
void cdq (int l , int r) {
    if (l == r) {
        f[l] = max (f[l] , 1);
        return;
    }
    else {
        int mid = l + r >> 1;
        cdq (l , mid);
        fu (i , l , r) 
            p[i] = i;
        sort (p + l , p + mid + 1 , cmp1) , sort (p + mid + 1 , p + r + 1 , cmp2);
        int j = l;
        fu (i , mid + 1 , r) {
            while (j <= mid && Mx[p[j]] <= a[p[i]]) {
                Insert (a[p[j]] , f[p[j]]);
                j ++;
            }
            f[p[i]] = max (f[p[i]] , query (Mn[p[i]]) + 1);
        }
        fu (i , l , mid) {
            Clear (a[i]);
        }
        cdq (mid + 1 , r);
    }
}
int main () {
    n = read () , m = read ();
    fu (i , 1 , n) {
        a[i] = read ();
        Mx[i] = Mn[i] = a[i];
    }
    int x , y;
    fu (i , 1 , m) {
        x = read () , y = read ();
        Mx[x] = max (Mx[x] , y) , Mn[x] = min (Mn[x] , y);
    }
    cdq (1 , n);
    fu (i , 1 , n)
        ans = max (ans , f[i]);
    printf ("%d" , ans);
    return 0;
}

到了这里,关于P4093[HEOI2016/TJOI2016]序列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SqlServer2016下载安装步骤详解 SQL Server2016的彻底删除_还能坚持的博客-CSDN博客_sqlserver2016完全卸载

    Windows 下安装sql server 2016(附安装包资源)_极光稻草人的博客-CSDN博客_sql server 2016 安装链接: 链接:https://pan.baidu.com/s/1rPG8Ya4jSbhmHvFCDzTVew  提取码:MXJ0 如果原来以及安装过sqlServer2016或其他版本的,需彻底删除,可参考: 遇到的问题: 1.polybase要求安装orcale jre 7更新 51或更

    2024年02月05日
    浏览(75)
  • 工具-visio2016和本地正版office2016安装冲突问题(已解决,成功安装并存)

    我是戴尔电脑自带的2016正版office, 但是内部不带Visio,工作学习又非常需要,所以要并存安装。 我的是这样的 C:Program FilesMicrosoft OfficeOffice16 win +r 通过cmd进入命令行 cd C:Program FilesMicrosoft OfficeOffice16 继续输入cscript ospp.vbs /dstatus 会出现这样的图(我网上找的),retail ed

    2024年02月04日
    浏览(34)
  • CVE-2016-2183

    漏洞描述 TLS, SSH, IPSec 协商及其他产品中使用的DES及Triple DES密码存在大约四十亿块的生日界,这可使远程攻击者通过Sweet32攻击,获取纯文本数据。 该漏洞又称为 SWEET32,是对较旧的分组密码算法的攻击,使用 64 位的块大小,缓解 SWEET32 攻击 OpenSSL 1.0.1 和 OpenSSL 1.0.2 中基于

    2024年02月15日
    浏览(29)
  • CVE-2016-3088漏洞复现

    1.背景介绍。 ActiveMQ的web控制台分三个应用,admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口;admin和api都需要登录后才能使用,fileserver无需登录。 fileserver是一个RESTful API接口,我们可以通过GET、PUT、DELETE等HTTP请求对其中存储的文件进行读写

    2023年04月25日
    浏览(52)
  • windows安装office2016

    多个不同版本的Microsoft Office不能共存在一个Windows系统中。 电脑上安装的可能有 买电脑时候安装的office,是正版的office。 有可能安装的就是office2016 如果安装office时候提示 需要先卸载电脑上其他版本的office, 微软卸载教程工具 下载地址 下载之后是一个文件后缀名为 .iso 的

    2024年02月06日
    浏览(27)
  • CVE-2016-1000027分析

            要想分析首先要了解什么是Spring HTTP Invoker,HttpInvoker是基于HTTP之上提供RPC,同时又使用了Java的对象序列化机制,实现了穿透防火墙或多系统之间的通信。         具体的实现过程很复杂,我们不用太深入的去了解,只需要知道HttpInvoker主要是使用http协议通过传输序

    2024年02月04日
    浏览(23)
  • HMM补丁说明2016

    原文网址:HMM (Heterogeneous Memory Management) [LWN.net] 邮件ID:1457469802-11850-1-git-send-email-jglisse@redhat.com 邮件作者:Jerome Glisse 邮件时间:2016年5月8日 HMM补丁提交说明书 上次我给Linus和Andrew讲到过,将HMM补丁提交到上游社区的需求是,我们希望无论闭源驱动还是开源驱动,除了Mella

    2024年02月09日
    浏览(22)
  • 2016大数据小盘点

    今天是2017年春节大年初一。记忆中,从上初中起,我就对过年不怎么感冒了。时间永不停歇,过年只是人为的加上了个标识。既然是标识,对个人而言,生日的意义也许更胜于过年。 然而过去的2016年,如果在许多年后回过头来看看,在工作、学习、生活上,方方面面,也许

    2023年04月08日
    浏览(16)
  • Microsoft Office 2016安装

    哈喽,大家好。今天一起学习的是office2016的安装,有兴趣的小伙伴也可以来一起试试手。 演示操作系统:Windows 10 支持Win7、11安装,不支持WinXP系统 系统类型:64位 演示版本:SW_DVD5_Office_Professional_Plus_2016_64Bit_ChnSimp_MLF_X20-42426.iso 【Microsoft Office 2016 原版镜像】 ​2.1.1 镜像文件

    2024年02月06日
    浏览(34)
  • Windows 2016安装Jenkins

    Jenkins 下载,安装 下载OpenJDK 11 for Wndows 两种方式 https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20%2B8/OpenJDK11U-jdk_x64_windows_hotspot_11.0.20_8.msi how to enable administrator user to logon as service on windows servder 2016? To enable the administrator user to log on as a service on Windows Server 2016, you ca

    2024年02月13日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包