제출 #1198068

#제출 시각아이디문제언어결과실행 시간메모리
1198068brover29Volontiranje (COCI21_volontiranje)C++17
50 / 110
1096 ms35560 KiB
#include <bits/stdc++.h>
//qwerty47924692
using namespace std;
using ll = int;
const ll N=1e6+29;
const string br="617283";
#define sz(a)(ll)a.size()
#define f first
#define s second
ll n,k,a[N],nxt[N],prv[N],s,f;
pair<ll,ll>st[4*N],dp[N];
vector<vector<ll>>v;
ll mx=0;
void update(ll v,ll l,ll r,ll pos,pair<ll,ll> x){
    if(l==r){
        st[v]=x;
        return;
    }
    ll mid=(r+l)>>1;
    if(pos<=mid)update(v*2,l,mid,pos,x);
    else update(v*2+1,mid+1,r,pos,x);
    st[v]=max(st[v*2],st[v*2+1]);
}
pair<ll,ll> get(ll v,ll l,ll r,ll x,ll y){
    if(l>y||x>r||x>y)return {0,0};
    if(x<=l&&r<=y)return st[v];
    ll mid=(r+l)>>1;
    return max(get(v*2,l,mid,x,y),get(v*2+1,mid+1,r,x,y));
}void del(ll i){
    nxt[prv[i]]=nxt[i];
    prv[nxt[i]]=prv[i];
    if(i==f)f=prv[i];
    if(i==s)s=nxt[i];
}
bool get(){
    ll cur=0;
    for(ll i=s;i<=f;i=nxt[i])update(1,1,n,a[i],{0,0});
    for(ll i=s;i<=f;i=nxt[i]){

        dp[i]=get(1,1,n,1,a[i]-1);
       // cout<<dp[i].f<<' ';
        dp[i].f++;
        update(1,1,n,a[i],{dp[i].f,i});
        cur=max(cur,dp[i].f);
    }vector<ll>b;
    if(cur!=mx)return 0;
    for(ll i=f;i>=s;i=prv[i]){
        if(dp[i].f==cur){
            while(i!=0){
                b.push_back(i);
                update(1,1,n,a[i],{0,0});
                del(i);
                i=dp[i].s;
            }
            v.push_back(b);
            break;
        }
    }
    return 1;

}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin>>n;
    s=1;
    f=n;
    for(ll i=1;i<=n;i++){
        cin>>a[i];
        nxt[i]=i+1;
        prv[i]=i-1;
        dp[i]=get(1,1,n,1,a[i]-1);
        dp[i].f++;
        update(1,1,n,a[i],{dp[i].f,i});
        mx=max(mx,dp[i].f);
    }
    while(get()){
        continue;
    }cout<<v.size()<<' '<<mx<<'\n';
    for(auto vv:v){
        reverse(vv.begin(),vv.end());
        for(ll i:vv){
            cout<<i<<' ';
        }
        cout<<'\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...