Submission #1471649


Source Code Expand

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#pragma GCC optimize ("-O3")
using namespace std; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); }
//---------------------------------------------------------------------------------------------------
/*---------------------------------------------------------------------------------------------------
            ∧_∧  
      ∧_∧  (´<_` )  Welcome to My Coding Space!
     ( ´_ゝ`) /  ⌒i     
    /   \     | |     
    /   / ̄ ̄ ̄ ̄/  |  
  __(__ニつ/     _/ .| .|____  
     \/____/ (u ⊃  
---------------------------------------------------------------------------------------------------*/



int N;
vector<int> E[201010];
int P[201010];
int A[201010];
//---------------------------------------------------------------------------------------------------
void pre() { // 葉を刈る
    queue<int> que;
    rep(i, 1, N + 1) if (E[i].size() == 0) que.push(i);
    while (!que.empty()) {
        int cu = que.front(); que.pop();
        if (0 <= A[cu]) continue;

        set<int> s;
        int ng = 0;
        fore(to, E[cu]) {
            if (A[to] < 0) ng = 1;
            s.insert(A[to]);
        }

        if (ng) continue;

        int g = 0;
        while (s.count(g)) g++;

        A[cu] = g;
        que.push(P[cu]);
    }
}
//---------------------------------------------------------------------------------------------------
bool check(int i, int x) {
    int pre = x;
    int cu = P[i];
    while (cu != i) {
        set<int> s;
        s.insert(pre);
        fore(to, E[cu]) s.insert(A[to]);
        int g = 0;
        while (s.count(g)) g++;
        pre = g;
        cu = P[cu];
    }

    set<int> s;
    s.insert(pre);
    fore(to, E[i]) s.insert(A[to]);
    int g = 0;
    while (s.count(g)) g++;
    
    return g == x;
}
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;
    rep(i, 1, N + 1) {
        int p; cin >> p;
        E[p].push_back(i);
        P[i] = p;
    }
    rep(i, 1, N + 1) A[i] = -1;

    pre();

    int fixid = 0;
    rep(i, 1, N + 1) if (A[i] < 0) fixid = i;

    set<int> s;
    fore(to, E[fixid]) s.insert(A[to]);
    int fir = 0;
    while (s.count(fir)) fir++;
    int sec = fir + 1;
    while (s.count(sec)) sec++;

    string ans = "IMPOSSIBLE";
    if (check(fixid, fir)) ans = "POSSIBLE";
    else if (check(fixid, sec)) ans = "POSSIBLE";

    cout << ans << endl;
}

Submission Info

Submission Time
Task F - Namori Grundy
User hamayanhamayan
Language C++14 (GCC 5.4.1)
Score 800
Code Size 2827 Byte
Status AC
Exec Time 68 ms
Memory 11904 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 800 / 800
Status
AC × 4
AC × 68
Set Name Test Cases
Sample example0, example1, example2, example3
All example0, example1, example2, example3, loop0, loop1, loop10, loop11, loop12, loop13, loop14, loop15, loop16, loop17, loop18, loop19, loop2, loop3, loop4, loop5, loop6, loop7, loop8, loop9, loopex0, loopex1, loopex10, loopex11, loopex12, loopex13, loopex14, loopex15, loopex16, loopex17, loopex18, loopex19, loopex2, loopex20, loopex21, loopex22, loopex23, loopex3, loopex4, loopex5, loopex6, loopex7, loopex8, loopex9, rand0, rand1, rand2, rand3, rand4, rand5, rand6, rand7, rand8, rand9, small0, small1, small2, small3, small4, small5, small6, small7, small8, small9
Case Name Status Exec Time Memory
example0 AC 3 ms 4992 KB
example1 AC 3 ms 4992 KB
example2 AC 3 ms 4992 KB
example3 AC 3 ms 4992 KB
loop0 AC 62 ms 9728 KB
loop1 AC 62 ms 9728 KB
loop10 AC 62 ms 9728 KB
loop11 AC 62 ms 9728 KB
loop12 AC 62 ms 9728 KB
loop13 AC 62 ms 9728 KB
loop14 AC 62 ms 9728 KB
loop15 AC 62 ms 9728 KB
loop16 AC 62 ms 9728 KB
loop17 AC 62 ms 9728 KB
loop18 AC 62 ms 9728 KB
loop19 AC 62 ms 9728 KB
loop2 AC 62 ms 9728 KB
loop3 AC 63 ms 9728 KB
loop4 AC 63 ms 9728 KB
loop5 AC 62 ms 9728 KB
loop6 AC 63 ms 9728 KB
loop7 AC 62 ms 9728 KB
loop8 AC 61 ms 9728 KB
loop9 AC 62 ms 9728 KB
loopex0 AC 63 ms 9856 KB
loopex1 AC 62 ms 9728 KB
loopex10 AC 62 ms 9728 KB
loopex11 AC 62 ms 9728 KB
loopex12 AC 62 ms 9728 KB
loopex13 AC 62 ms 9728 KB
loopex14 AC 68 ms 9728 KB
loopex15 AC 63 ms 9728 KB
loopex16 AC 63 ms 9856 KB
loopex17 AC 62 ms 9728 KB
loopex18 AC 66 ms 9856 KB
loopex19 AC 62 ms 9728 KB
loopex2 AC 63 ms 9728 KB
loopex20 AC 62 ms 9728 KB
loopex21 AC 63 ms 9728 KB
loopex22 AC 63 ms 9728 KB
loopex23 AC 62 ms 9728 KB
loopex3 AC 62 ms 9728 KB
loopex4 AC 63 ms 9728 KB
loopex5 AC 64 ms 9856 KB
loopex6 AC 62 ms 9728 KB
loopex7 AC 63 ms 9728 KB
loopex8 AC 63 ms 9728 KB
loopex9 AC 63 ms 9856 KB
rand0 AC 18 ms 6400 KB
rand1 AC 26 ms 7168 KB
rand2 AC 9 ms 5760 KB
rand3 AC 50 ms 9344 KB
rand4 AC 60 ms 11904 KB
rand5 AC 30 ms 7424 KB
rand6 AC 13 ms 6144 KB
rand7 AC 6 ms 5248 KB
rand8 AC 43 ms 8704 KB
rand9 AC 5 ms 5248 KB
small0 AC 3 ms 4992 KB
small1 AC 3 ms 4992 KB
small2 AC 3 ms 4992 KB
small3 AC 3 ms 4992 KB
small4 AC 3 ms 4992 KB
small5 AC 3 ms 4992 KB
small6 AC 3 ms 4992 KB
small7 AC 3 ms 4992 KB
small8 AC 3 ms 4992 KB
small9 AC 3 ms 4992 KB