#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pb push_back
const int N=3e5+5;
int a[N];
int dp[N];
vector<pair<int,int> > v[N];
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int mx=0;
for(int i=1;i<=n;i++){
dp[i]=1;
for(int j=1;j<i;j++){
if(a[i]>a[j])dp[i]=max(dp[i],dp[j]+1);
}
v[dp[i]].pb({a[i],i});
mx=max(mx,dp[i]);
}
for(int i=1;i<=mx;i++){
sort(v[i].begin(),v[i].end());
reverse(v[i].begin(),v[i].end());
}
vector<vector<pair<int,int>>>ans;
while(!v[mx].empty()){
auto [x,idx] =v[mx].back();
vector<pair<int,int>>tmp={{x,idx}};
v[mx].pop_back();
int u=1;
for(int i=mx-1;i>=1;i--){
pair<int,int>kk={1e9,1e9};
for(auto p:v[i]){
if(p.ss<idx and p.ff<x){
kk=min(kk,p);
}
}
x=kk.ff;idx=kk.ss;
if(idx==1e9)u=0;
tmp.pb({x,idx});
}
if(u==0)continue;
reverse(tmp.begin(),tmp.end());
ans.pb(tmp);
for(int i=1;i<mx;i++){
auto it = find(v[i].begin(), v[i].end(),tmp[i-1]);
if (it != v[i].end()) {
v[i].erase(it);
}
}
}
cout<<ans.size()<<" "<<ans[0].size()<<endl;
for(auto v:ans){
for(auto p:v)cout<<p.ss<<" ";
cout<<endl;
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |