Submission #229316

# Submission time Handle Problem Language Result Execution time Memory
229316 2020-05-04T07:31:26 Z 534351 Lokahian Relics (FXCUP4_lokahia) C++17
0 / 100
5 ms 640 KB
#include "lokahia.h"
#include <bits/stdc++.h>

using namespace std;

template<class T, class U>
void ckmin(T &a, U b)
{
    if (a > b) a = b;
}

template<class T, class U>
void ckmax(T &a, U b)
{
    if (a < b) a = b;
}

#define MP make_pair
#define PB push_back
#define LB lower_bound
#define UB upper_bound
#define fi first
#define se second
#define SZ(x) ((int) (x).size())
#define ALL(x) (x).begin(), (x).end()
#define FOR(i, a, b) for (auto i = (a); i < (b); i++)
#define FORD(i, a, b) for (auto i = (a) - 1; i >= (b); i--)

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpi;
typedef vector<pll> vpl;

const int MAXN = 213;

map<int, int> mp[MAXN];
int dsu[MAXN], stor[MAXN];

int get(int u)
{
    return (u == dsu[u] ? u : dsu[u] = get(dsu[u]));
}
void merge(int u, int v)
{
    u = get(u);
    v = get(v);
    if (u == v) return;
    ckmax(stor[u], stor[v]);
    dsu[v] = u;
    return;
}
int ask(int i, int j)
{
    if (i == j) return i;
    if (mp[i].count(j))
    {
        return mp[i][j];
    }
    int res = CollectRelics(i, j);
    mp[i][j] = res;
    mp[j][i] = res;
    // cerr << "ask " << i << ' ' << j << " = " << res << endl;
    return res;
}
int FindBase(int N)
{
    if (N == 1)
    {
        return 0;
    }
    if (N == 2)
    {
        return ask(0, 1);
    }
    vi bucket, lis;
    FOR(i, 0, N)
    {
        if (!lis.empty() && ask(lis.back(), i) != -1)
        {
            int x = ask(lis.back(), i);
            merge(lis.back(), i);
            ckmax(stor[get(i)], x);
            bucket.PB(i);
            continue;
        }
        else
        {
            lis.PB(i);
            if (!bucket.empty())
            {
                lis.PB(bucket.back());
                bucket.pop_back();
            }
        }
    }
    int cand = lis.back();
    // for (int x : lis)
    // {
    //     cerr << x << ' ';
    // }
    // cerr << endl;
    // cerr << "cand = " << bucket.back() << endl;
    int maj = -1, num = 0;
    while(!lis.empty())
    {
        int n = ask(cand, lis.back());
        if (n == -1)
        {
            lis.pop_back();
            if (bucket.empty())
            {
                break;
            }
            bucket.pop_back();
        }
        else
        {
            merge(lis.back(), cand);
            if (lis.back() != cand)
            {
                ckmax(stor[get(cand)], n);
            }
            if (SZ(lis) == 1)
            {
                bucket.PB(lis.back());
                lis.pop_back();
            }
            else
            {
                lis.pop_back();
                int nn = ask(cand, lis.back());
                ckmax(stor[get(cand)], nn);
                lis.pop_back();
            }
        }
    }
    if (bucket.empty()) return -1;
    for (int w : bucket)
    {
        int nn = ask(cand, w);
        ckmax(stor[get(cand)], nn);
        // ckmax(maj, nn);
    }
    return stor[get(cand)];
    // cerr << "cand = " << cand << " maj = " << maj << endl;
}

Compilation message

lokahia.cpp: In function 'int FindBase(int)':
lokahia.cpp:107:9: warning: unused variable 'maj' [-Wunused-variable]
     int maj = -1, num = 0;
         ^~~
lokahia.cpp:107:19: warning: unused variable 'num' [-Wunused-variable]
     int maj = -1, num = 0;
                   ^~~
# Verdict Execution time Memory Grader output
1 Correct 4 ms 512 KB Correct : C = 0
2 Incorrect 5 ms 640 KB Wrong
3 Partially correct 5 ms 640 KB Partially correct : C = 357
4 Correct 5 ms 640 KB Correct : C = 199
5 Correct 5 ms 512 KB Correct : C = 4
6 Partially correct 5 ms 640 KB Partially correct : C = 397
7 Correct 5 ms 640 KB Correct : C = 235
8 Correct 5 ms 640 KB Correct : C = 200
9 Correct 5 ms 640 KB Correct : C = 199
10 Correct 5 ms 640 KB Correct : C = 199
11 Correct 5 ms 640 KB Correct : C = 235
12 Partially correct 5 ms 640 KB Partially correct : C = 395
13 Correct 5 ms 640 KB Correct : C = 119
14 Correct 5 ms 640 KB Correct : C = 119
15 Correct 5 ms 640 KB Correct : C = 198
16 Correct 5 ms 640 KB Correct : C = 120
17 Correct 5 ms 640 KB Correct : C = 233
18 Partially correct 5 ms 640 KB Partially correct : C = 395
19 Correct 5 ms 640 KB Correct : C = 234
20 Incorrect 5 ms 640 KB Wrong
21 Incorrect 5 ms 640 KB Wrong
22 Correct 5 ms 640 KB Correct : C = 119
23 Correct 5 ms 640 KB Correct : C = 202
24 Partially correct 5 ms 640 KB Partially correct : C = 396
25 Correct 5 ms 640 KB Correct : C = 236
26 Correct 5 ms 640 KB Correct : C = 118
27 Partially correct 5 ms 640 KB Partially correct : C = 390