Submission #635843

#TimeUsernameProblemLanguageResultExecution timeMemory
635843MohammadAghilWatermelon (INOI20_watermelon)C++17
100 / 100
287 ms13804 KiB
#include <bits/stdc++.h>
//#pragma GCC optimize ("Ofast,unroll-loops")
//#pragma GCC target ("avx2")
using namespace std;
 
typedef long long ll;
typedef pair<int, int> pp;
 
#define rep(i,l,r) for(int i = (l); i < (r); i++)
#define per(i,r,l) for(int i = (r); i >= (l); i--)
#define all(x) begin(x), end(x)
#define sz(x) (int)x.size()
#define pb push_back
#define ff first
#define ss second
 
void dbg(){
    cerr << endl;
}
template<typename Head, typename... Tail> void dbg(Head h, Tail... t){
    cerr << " " << h << ",";
    dbg(t...);
}
#define er(...) cerr << __LINE__ << " <" << #__VA_ARGS__ << ">:", dbg(__VA_ARGS__)
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
void IOS(){
    cin.tie(0) -> sync_with_stdio(0);
    // #ifndef ONLINE_JUDGE
    //     freopen("inp.txt", "r", stdin);
    //     freopen("out.txt", "w", stdout);
    // #endif
}

const ll mod = 1e9 + 7, maxn = 1e5 + 5, lg = 20, inf = ll(1e9) + 5;

vector<int> adj[maxn];
int cnt[maxn], n;
 
int fen[maxn];
void upd(int i, int k){
    for(i++; i < maxn; i += i&-i) fen[i] = max(fen[i], k);
}
int get(int i){
    int res = 0;
    for(i++; i; i -= i&-i) res = max(res, fen[i]);
    return res;
}
vector<int> val(vector<int> p){
    vector<int> res(n);
    vector<int> stk;
    per(i,n-1,0){
        while(sz(stk) && p[stk.back()] < p[i]) stk.pop_back();
        if(sz(stk)){
            res[i] = get(stk.back()-1) + 1;
        }else res[i] = inf;
        upd(i, res[i]);
        stk.pb(i);
    }
    int tmp = n;
    rep(i,0,n) res[i] += res[i] == inf? tmp--: 0;
    return res;
}

vector<int> nxt(vector<int> p){
    vector<int> pos(n);
    rep(i,0,n) pos[p[i]] = i;
    rep(i,0,n) cnt[i] = 0;
    set<pp> s;
    int find = -1;
    per(i,n-1,0){
        s.insert({0, pos[i]});
        for(int c: adj[pos[i]]){
            s.erase(pp(cnt[c], c));
            s.insert(pp(++cnt[c], c));
        }
        auto it = s.upper_bound(pp(0, pos[i]));
        if(it != end(s) && it->ff == 0){
            find = i + 1;
            p[it->ss] = i;
            for(int c: adj[it->ss]){
                s.erase(pp(cnt[c], c));
                s.insert(pp(--cnt[c], c));
            }
            s.erase(it);
            break;
        }
    }
    if(find + 1){
        while(sz(s)){
            auto[_, r] = *begin(s);
            s.erase(begin(s));
            p[r] = find++;
            for(int c: adj[r]){
                s.erase(pp(cnt[c], c));
                s.insert(pp(--cnt[c], c));
            }     
        }
        return p;
    }
    return {};
}

int main(){ IOS();
    int k; cin >> n >> k;
    vector<int> a(n);
    int tmp = n;
    rep(i,0,n) {
        cin >> a[i];
        if(a[i] == -1){
            a[i] = inf + tmp, tmp--;
        }
    }

    vector<int> stk;
    rep(i,0,n){
        while(sz(stk) && a[stk.back()] < a[i]) stk.pop_back();
        if(sz(stk)){
            if(a[i] - a[stk.back()]){
                adj[i].pb(stk.back());
                cnt[stk.back()]++;
            } 
        }
        stk.pb(i);
    }
    stk.clear();
    per(i,n-1,0){
        while(sz(stk) && a[stk.back()] < a[i]) stk.pop_back();
        if(sz(stk)){
            adj[i].pb(stk.back());
            cnt[stk.back()]++;
        }
        stk.pb(i);
    }
    
    set<pp> s;
    rep(i,0,n) s.insert({cnt[i], i});
    vector<int> ans(n);
    int ptr = 0;
    while(sz(s) && begin(s)->ff == 0){
        auto[_, r] = *begin(s);
        s.erase(begin(s));
        ans[r] = ptr++;
        for(int c: adj[r]){
            s.erase(pp(cnt[c], c));
            s.insert(pp(--cnt[c], c));
        }
    }
    
    if(sz(s) || val(ans) != a){
        cout << -1 << '\n';
    } else{
        k--;
        while(k--){
            ans = nxt(ans);
            if(ans.empty()) return cout << -1 << '\n', 0;
        }
        rep(i,0,maxn) fen[i] = 0;
        if(val(ans) != a) cout << -1 << '\n';
        else for(int c: ans) cout << ++c << ' '; cout << '\n';
    }
    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:161:9: warning: this 'else' clause does not guard... [-Wmisleading-indentation]
  161 |         else for(int c: ans) cout << ++c << ' '; cout << '\n';
      |         ^~~~
Main.cpp:161:50: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'else'
  161 |         else for(int c: ans) cout << ++c << ' '; cout << '\n';
      |                                                  ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...