[ABC354F] Useless for LIS
写在最前面的话:如果你懂这道题的线段树或者树状数组解法,那么本题解对你可能没有帮助。
[ABC354F] Useless for LIS
题面翻译
- 给定一个长度为
的序列 。求出所有 使得存在任意一个 的最长上升子序列包含 。多测。 , 。
题目描述
長さ
-
最長増加部分列の長さを
とする。各要素が 以上 以下の単調増加な整数列- ある
が存在して である
最長増加部分列とは?列
列
输入格式
入力は以下の形式で標準入力から与えられる。
ここで
输出格式
以下の形式で出力せよ。
ここで
样例 #1
样例输入 #1
1
5
2 1 4 5 3
样例输出 #1
4
1 2 3 4
样例 #2
样例输入 #2
2
6
2 5 3 4 3 4
5
10000 1000 100 1 10
样例输出 #2
5
1 3 4 5 6
2
4 5
提示
制約
- 全てのテストケースにおける
の総和は 以下
Sample Explanation 1
最長増加部分列の
题目解析
给你一个长度为
首先,一个个枚举最长上生子序列然后记录肯定不行(可以用搜索做,但
以
AC code(请不要介意我奇怪的码风):
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int T,n,a[N],f[N],dp[N],cnt,b[N],f2[N],dp2[N],cnt2;
int main(){
//freopen("xx.in","r",stdin);
//freopen("xx.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--){
cnt=0;
cnt2=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
if(a[i]>f[cnt]){
f[++cnt]=a[i];
dp[i]=cnt;
}else{
int x=lower_bound(f+1,f+cnt+1,a[i])-f;
x=min(x,cnt);
dp[i]=x;
f[x]=a[i];
}
}
for(int i=1;i<=n;i++){
b[i]=a[n-i+1];
b[i]=-b[i];
}
f2[0]=INT_MIN;
for(int i=1;i<=n;i++){
if(b[i]>f2[cnt2]){
f2[++cnt2]=b[i];
dp2[i]=cnt2;
}else{
int x=lower_bound(f2+1,f2+cnt2+1,b[i])-f2;
x=min(x,cnt);
dp2[i]=x;
f2[x]=b[i];
}
}
int maxs=0;
for(int i=1;i<=n;i++){
maxs=max(maxs,dp[i]);
}
int cnt=0;
for(int i=1;i<=n;i++){
if(dp[i]+dp2[n-i+1]-1==maxs){
cnt++;
}
}
cout<<cnt<<"\n";
for(int i=1;i<=n;i++){
if(dp[i]+dp2[n-i+1]-1==maxs){
cout<<i<<" ";
}
}
cout<<"\n";
}
return 0;
}
附:人生第一次 Unknown Error,所以在AtCoder上交的
完结撒花!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!