首页 > 其他分享 >Codeforces 486E LIS of Sequence

Codeforces 486E LIS of Sequence

时间:2024-02-24 20:22:17浏览次数:24  
标签:Sequence int text 路径 Codeforces maxn LIS mx

考虑一个暴力的做法:

建立一个超级起点 \(a_0 = 0\) 超级终点 \(a_{n + 1} = \inf\)。
求出 \(f_i\) 代表 \(1\sim i\) 且以 \(i\) 结尾的 \(\text{LIS}\) 长度。
考虑 \(f_i = \max\{f_j + 1\}(j < i \land a_j < a_i)\) 这个转移的式子,如果 \(f_i = f_j + 1(j < i\land a_j < a_i)\) 就连一条 \(j\to i\) 的边。

那么从 \(0\to n + 1\) 的一条路径就代表着一个合法的 \(\text{LIS}\),路径上的点就是可能出现在 \(\text{LIS}\) 中的编号。
那么如果 \(a_i\) 满足任意 \(\text{LIS}\) 都有它,就需要满足对于任意 \(j\not = i\),\(f_j\not = f_i\) 或不存在经过 \(j\) 的合法路径。
因为每条路径的 \(f_i\) 必然是递增的,同一种 \(f_i\) 不会出现 \(2\) 次,那么就会存在一条经过 \(j\) 而不经过 \(i\) 的路径,\(i\) 就不是唯一的。

考虑到这个做法的主要瓶颈就是处理 \(i\) 是否会在一条 \(0\to n + 1\) 的路径中出现。
那么就可以拆成 \(0\to i\to n + 1\)。

首先能发现通过 \(f_i\) 的转移就一定存在 \(0\to i\) 的路径。
于是就只用考虑是否有 \(i\to n + 1\) 的路径了。
那么考虑相当于建反边转化为从 \(n + 1\to i\) 的路径,从 \(n\) 到 \(1\) 倒着处理。
那么 \(i\) 合法就相当于是存在 \(j > i\) 满足 \(f_j = f_i + 1, a_j > a_i\) 且 \(j\) 合法。
因为最后一个条件首先保证了存在 \(n + 1\to j\) 的路径,前面的条件保证了反图中存在 \(j\to i\) 的边,于是就有 \(n + 1\to i\) 的路径。

能够发现只需要对于 \(f\) 的取值 \(x\) 维护满足 \(f_i = x\) 且 \(i\) 合法的 \(\max\{i\}\),这是容易做到的而且是线性的。

时间复杂度 \(O(n\log n)\)。

#include<bits/stdc++.h>
const int maxn = 1e5 + 10;
int a[maxn], f[maxn], stk[maxn], m;
int mx[maxn], op[maxn], cnt[maxn];
int main() {
    int n; scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    a[++n] = 2e5;
    for (int i = 1; i <= n; i++) {
        int l = 0, r = m;
        while (l <= r) {
            int mid = (l + r) >> 1;
            a[i] > a[stk[mid]] ? (f[i] = mid + 1, l = mid + 1) : (r = mid - 1);
        }
        f[i] > m && (m++), stk[f[i]] = i;
    }
    mx[m] = 2e5;
    for (int i = n - 1; i; i--) op[i] = a[i] < mx[f[i] + 1], op[i] && (mx[f[i]] = std::max(mx[f[i]], a[i]), cnt[f[i]]++);
    for (int i = 1; i < n; i++) printf("%d", ! op[i] ? 1 : (cnt[f[i]] > 1 ? 2 : 3));
    return 0;
}

标签:Sequence,int,text,路径,Codeforces,maxn,LIS,mx
From: https://www.cnblogs.com/rizynvu/p/18031512

相关文章

  • codeforces 1575M Managing Telephone Poles
    假设固定了\((x,y)\),考虑其和\((x',y')\)的距离\((x-x')^2+(y-y')^2=x^2-2xx'+x'^2+y^2-2yy'+y'^2=(x^2+y^2)+(-2xx'+x'^2)+(-2yy'+y'^2)\)。第一个括号内的式子是个定值,不用管;第二三个式子都是一次函数的形式......
  • Educational Codeforces Round 162 (Rated for Div. 2)
    不会F的场。A答案是最左的\(1\)和最右的\(1\)之间的\(0\)的个数。Code#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){ ios::sync_with_stdio(false); cin.tie(0); intt; cin>>t; while(t--){ intn; cin>>n......
  • Educational Codeforces Round 162 [Rated for Div. 2]
    第二次,三道题,剩下的回学校再补,总结:还是需要多练习A:让数列里所有的1都挨在一起,可以看出,相邻1之间有多少个0就需要操作几次,特判:当只有一个1或者原本全是1就输出0;voidsolve(){cin>>n;inttop1=0,top2=0,cnt=0;memset(a,0,sizeof(a));memset(b,0,siz......
  • Edu-English-Phonetic-IPA:国际音标发音学:英语音标的学习神器,终于找到
    https://mp.weixin.qq.com/s?__biz=MzU3NTIzOTA5OA==&mid=2247493736&idx=1&sn=8ed10241adeaa148ee3053f5db94214e&chksm=fd248ebdca5307abf32a39eed20bb83818e00692a87298d3b1c2d2cb7b2d6572df0c0301fe7d&scene=27英语音标的学习神器,终于找到音标是记录语言的符号,对音标的正确......
  • UOJ228/HDU5828 基础数据结构练习题/Rikka with Sequence 题解(势能线段树)
    势能线段树。如果线段树上一个节点的\(\max-\min\ge2\),我们称其为关键节点,考虑定义势能\(\phi\)为线段树上关键节点的个数。对于每次开方操作,如果当前节点为关键节点,则暴力递归左右儿子修改,否则:如果当前节点\(\max=\min\)或\(\max=\min+1\)且\(\max\)不是完全平方数,......
  • CMakeLists的编写注意
    `add_executable(${CMAKE_PROJECT_NAME})`的位置对于`link_directories`命令的影响可能与项目的目录结构和依赖项的设置有关。一般来说,`link_directories`命令应该在`add_executable`命令之前调用,以确保在链接时能够正确找到所需的库文件。如果在`add_executable`之后调用`link_d......
  • redis自学(4)ZipList
    ZipList是一种特殊的“双端链表”,由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作,并且该操作的时间复杂度为O(1)。    ZipListEntryZipList中的Entry并不像普通链表那样记录前后节点的指针,因为记录两个指针要占用16个字节,浪费内存。而是采用了下......
  • 在sequence 中 通过后门方式调用task
     可以使用void‘($cast(slaver_drv_use,uvm_top_find("xxxx")));在sequence中调用svt_axi_slave_agent(component) 的task。代码示意 svt_axi_slave_agent   slaver_drv_use;声明句柄void‘($cast(slaver_drv_use,uvm_top_find("uvm_test_top.te_env_inst.amba_s......
  • 两个不同的 List 拼接,根据公共字段进行拼接,放入一个新的集合
    //List1List<FaultReport>reportDetail=reportMapper.getReportDetail(pagePo);List<Long>collect=reportDetail.stream().map(FaultReport::getId).collect(Collectors.toList());//List2List<FaultAppro......
  • Visual Studio 2022 .Net 8 启用AOT publish enabled 发布失败
    .Net8NativeAOT的优势: 我使用VisualStudio2022创建了一个面向.NET8的控制台应用程序。我在创建项目时选中了启用本机AOT发布选项。它给出了以下错误: 错误文本:发布遇到错误。发布遇到错误。我们无法确定错误的原因。检查输出日志以获取更多详细信息。诊断......