令$f_{i}$表示以$i$为结尾的最长上升子序列,显然可以快速预处理

令$L=\max_{i=1}^{n}f_{i}$,当$L$为偶数,考虑如下构造——

将所有$f_{i}\le \frac{L}{2}$的$a_{i}$选入第1个序列,其余位置选入第2个序列

此时,来证明两个序列的最长上升子序列都是$\frac{L}{2}$

考虑这个长为$L$的最长上升子序列,其前$\frac{L}{2}$个元素必然都在第1个序列中,后$\frac{L}{2}$个元素必然都在第2个序列中,即两者最长上升子序列长度都大于等于$\frac{L}{2}$

另一方面,第1个序列中以$i$为结尾的最长上升序列小于等于$\frac{L}{2}$,第2个序列中以$i$为起点的最长上升序列小于等于$\frac{L}{2}$(由于$f_{i}>\frac{L}{2}$,且两者之和小于等于$L$,即有此结论),也都小于等于$\frac{L}{2}$

(其中$i$为各自序列中任意元素)

当$L$为奇数,假设$L=2k+1$,那么对于其中一个长为$L$的上升子序列,要存在一个元素$x$,其不在此序列中,且存在一个长为$k+1$的上升子序列包含其

关于这件事情的必要性是显然的,同时其也是充分的,考虑如下构造——

任选一个长为$L$的上升子序列,根据此性质,选择$x$并假设这个$k+1$的上升子序列为$p_{1},p_{2},...,p_{k+1}$

将所有满足$\forall 1\le j\le k+1,f_{i}\ne f_{p_{j}}$或$f_{i}=f_{x}$且$i\ne x$的$a_{i}$选入第1个序列,其余位置选入第2个序列

在第1个序列中,考虑这个长为$L$的上升子序列,设其中第$i$个位置为$x$,即有$f_{x}=i$,恰好包含$[1,L]$中所有值,其中恰有$k$个值不能选($f_{i}=f_{x}$是可以选的),构成一个长为$k+1$的上升子序列

在第2个序列中,$p_{i}$都被选入第2个序列,也构成一个长为$k+1$个上升子序列

另一方面,对于一个长为$k$的上升子序列,每一个位置的$f_{x}$必然各不相同,而注意到两个序列中都至多含有$k+1$个不同的$f$,即不存在长为$k+2$的上升子序列

关于判定,求出以每一个元素为起点和终点的最长上升子序列,即可求出强制包含某个元素的最长上升子序列,判定其是否大于等于$k+1$即可

由此,即解决此问题,时间复杂度为$o(n\log n)$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 int t,n,ans,a[N],vis[N],f[N],g[N],mx[N<<2];
8 void build(int k,int l,int r){
9 mx[k]=0;
10 if (l==r)return;
11 build(L,l,mid);
12 build(R,mid+1,r);
13 }
14 void update(int k,int l,int r,int x,int y){
15 if (l==r){
16 mx[k]=y;
17 return;
18 }
19 if (x<=mid)update(L,l,mid,x,y);
20 else update(R,mid+1,r,x,y);
21 mx[k]=max(mx[L],mx[R]);
22 }
23 int query(int k,int l,int r,int x,int y){
24 if ((l>y)||(x>r))return 0;
25 if ((x<=l)&&(r<=y))return mx[k];
26 return max(query(L,l,mid,x,y),query(R,mid+1,r,x,y));
27 }
28 int main(){
29 scanf("%d",&t);
30 while (t--){
31 scanf("%d",&n);
32 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
33 ans=0;
34 build(1,1,n);
35 for(int i=1;i<=n;i++){
36 f[i]=query(1,1,n,1,a[i]-1)+1;
37 update(1,1,n,a[i],f[i]);
38 ans=max(ans,f[i]);
39 }
40 if (ans%2==0)printf("YES\n");
41 else{
42 build(1,1,n);
43 for(int i=n;i;i--){
44 g[i]=query(1,1,n,a[i]+1,n)+1;
45 update(1,1,n,a[i],g[i]);
46 }
47 bool flag=0;
48 for(int i=n,j=ans;i;i--)
49 if (f[i]==j)j--;
50 else{
51 if (f[i]+g[i]-1>=ans/2+1){
52 printf("YES\n");
53 flag=1;
54 break;
55 }
56 }
57 if (!flag)printf("NO\n");
58 }
59 }
60 }

[atAGC052D]Equal LIS的更多相关文章

  1. Codeforces Round #371 (Div. 2)E. Sonya and Problem Wihtout a Legend[DP 离散化 LIS相关]

    E. Sonya and Problem Wihtout a Legend time limit per test 5 seconds memory limit per test 256 megaby ...

  2. 【HDU 4352】 XHXJ's LIS (数位DP+状态压缩+LIS)

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 1053. Path of Equal Weight (30)

    Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. The weight of ...

  4. XHXJ's LIS(数位DP)

    XHXJ's LIS http://acm.hdu.edu.cn/showproblem.php?pid=4352 Time Limit: 2000/1000 MS (Java/Others)     ...

  5. HDU 4352 - XHXJ's LIS - [数位DP][LIS问题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  6. hdu 4352 XHXJ's LIS 数位dp+状态压缩

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others ...

  7. POJ 1836-Alignment(DP/LIS变形)

    Alignment Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13465   Accepted: 4336 Descri ...

  8. poj 1836 LIS变形

    题目链接http://poj.org/problem?id=1836 Alignment Time Limit: 1000MS   Memory Limit: 30000K Total Submiss ...

  9. CodeForces - 650D:Zip-line (LIS & DP)

    Vasya has decided to build a zip-line on trees of a nearby forest. He wants the line to be as long a ...

随机推荐

  1. 解决Vite-React项目中js使用jsx语法报错的问题

    背景 在做存量项目接入Vite测试时发现,存量(老)项目中很多是直接在js中书写jsx语法,使用Vite启动时就会抛出一堆问题Failed to parse source. 不嫌麻烦可以跑个脚本批量修 ...

  2. 题解 P6454 麻将 加强版

    题目传送门 题目大意 不想写了,直接看题面吧. 思路 被这个题搞自闭了,因为读错题目想一个非常恶心的东西想了一场考试,然后就删代码,然后就被骂了.哎. 需要注意的是:我们只能选一次雀头 于是,不难看出 ...

  3. 洛谷3648 [APIO2014]序列分割(斜率优化+dp)

    首先对于这个题目. qwq 存在一个性质就是,最终的答案只跟你的分割的位置有关,而和顺序无关. 举一个小栗子 \(a\ b\ c\) 将这个东西分成两块. 如果我们先分割\(ab\)之间的话,\(an ...

  4. 洛谷4172 WC2006水管局长(LCT维护最小生成树)

    这个题和魔法森林感觉有很相近的地方啊 同样也是维护一个类似最大边权最小的生成树 但是不同的是,这个题是有\(cut\)和询问,两种操作.... 这可如何是好啊? 我们不妨倒着来考虑,假设所有要\(cu ...

  5. FastAPI 学习之路(七)字符串的校验

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  6. 自定义ConditionalOnXX注解

    一.Conditional注解介绍 对SpringBoot有足够了解的小伙伴应该都用过Conditional系列注解,该注解可用在类或者方法上用于控制Bean的初始化. 常用的Conditional注 ...

  7. 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链

    散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...

  8. Java:并发笔记-06

    Java:并发笔记-06 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 5. 共享模型之无锁 本章内容 CAS 与 volatile 原子整数 原子引用 原子 ...

  9. 洛谷 P4867 Gty的二逼妹子序列

    链接: P4867 题意: 给出长度为 \(n(1\leq n\leq 10^5)\) 的序列 \(s\),保证\(1\leq s_i\leq n\).有 \(m(1\leq m\leq 10^6)\ ...

  10. 通过silky框架在.net平台构建微服务应用

    目录 必要前提 使用Web主机构建微服务应用 使用.NET通用主机构建微服务应用 构建具有websocket服务能力的微服务应用 构建Silky微服务网关 开源地址 在线文档 在线示例 必要前提 (必 ...