Submission #68602985


Source Code Expand

//  ↘ ⬇ ⬇ ⬇ ⬇ ⬇ ↙
//  ➡ @roadfromroi ⬅
//  ↗ ⬆ ⬆ ⬆ ⬆ ⬆ ↖
/*
░░░░░░░█▐▓▓░████▄▄▄█▀▄▓▓▓▌█
░░░░░▄█▌▀▄▓▓▄▄▄▄▀▀▀▄▓▓▓▓▓▌█
░░░▄█▀▀▄▓█▓▓▓▓▓▓▓▓▓▓▓▓▀░▓▌█
░░█▀▄▓▓▓███▓▓▓███▓▓▓▄░░▄▓▐█▌
░█▌▓▓▓▀▀▓▓▓▓███▓▓▓▓▓▓▓▄▀▓▓▐█
▐█▐██▐░▄▓▓▓▓▓▀▄░▀▓▓▓▓▓▓▓▓▓▌█▌
█▌███▓▓▓▓▓▓▓▓▐░░▄▓▓███▓▓▓▄▀▐█
█▐█▓▀░░▀▓▓▓▓▓▓▓▓▓██████▓▓▓▓▐█
▌▓▄▌▀░▀░▐▀█▄▓▓██████████▓▓▓▌█▌
▌▓▓▓▄▄▀▀▓▓▓▀▓▓▓▓▓▓▓▓█▓█▓█▓▓▌█▌
█▐▓▓▓▓▓▓▄▄▄▓▓▓▓▓▓█▓█▓█▓█▓▓▓▐█ йоу
 */
#include <iostream>
#include "queue"
#include "vector"
#include "algorithm"
#include "numeric"
#include "climits"
#include "iomanip"
#include "bitset"
#include "cmath"
#include "map"
#include "deque"
#include "array"
#include "set"
#include "random"
#ifndef __APPLE__
#include "bits/stdc++.h"
#endif
#define all(x) x.begin(), x.end()
using namespace std;

typedef bitset<150001> bts;
void solve() {
    int n;
    cin >> n;
    vector<int> p(n);
    for (int i = 0; i < p.size(); ++i) {
        cin >> p[i];
        p[i]--;
    }
    int res = 0;
    vector<int> ar;
    vector<int> seen(p.size());
    vector<int> evens(n + 1);
    for (int i = 0; i < p.size(); ++i) {
        if (seen[i] == 0) {
            vector<int> clc;
            int v = i;
            while (seen[v] == 0) {
                seen[v] = 1;
                clc.push_back(v);
                v = p[v];
            }
            ar.push_back(clc.size());
            if (clc.size() % 2 == 0)
                evens[clc.size() / 2]++;
            //cout << clc.size() << ' ';
        }
    }
    bts canget;
    canget[0] = 1;
    for (int i = 0; i < evens.size(); ++i) {
        int dg = evens[i];
        for (int j = 0; (1<<(j+1)) - 1 <= evens[i]; ++j) {
            canget |= (canget << (i<<j));
            dg = evens[i] - (1<<(j+1)) + 1;
        }
        canget |= (canget << (dg * i));
    }
    vector<int> prvcn(n + 1, -1);
    prvcn[0] = 0;
    for (int i = 1; i <= n; ++i) {
        if (canget[i]) {
            //cerr << i << '\n';
            prvcn[i] = i;
        } else {
            prvcn[i] = prvcn[i-1];
        }
    }
    auto cmp = [](int a, int b) {
        if (a % 2 != b % 2)
            return a % 2 < b % 2;
        if (a % 2 == 0)
            return a < b;
        else
            return a > b;
    };
    sort(all(ar), cmp);
    int q;
    cin >> q;
    vector<int> ans(q);
    vector<array<int, 3>> quer(q);
    for (int i = 0; i < q; ++i) {
        int a, b, stepa;
        cin >> a >> b >> stepa;
        quer[i] = {a, b, i};
    }
    sort(all(quer));
    int pr = 0;
    vector<int> put0(ar.size());
    int ind = 0;
    int one1 = 0, one2 = 0;
    bool frst = 1;
    int answ = 0;
    int smdlt = 0;

    for (auto [val0, val1, indans] : quer) {
        int dlt2 = val0 - pr;
        pr = val0;//0 2 0 1 2
        for (int iqqq = 0; iqqq < dlt2; ++iqqq) {
            int dlt = 1;
            if (frst) {
                while (ind < ar.size()) {
                    int trg = ar[ind] / 2 - put0[ind];
                    int c = min(dlt, trg);
                    if (c != 0) {
                        for (int i = 0; i < c; ++i) {
                            answ += 2;
                            dlt--;
                            smdlt++;
                            put0[ind]++;
                            if (ar[ind] == 2) {
                                one2++;
                            } else {
                                if (put0[ind] == 1) {
                                    one1 += 2;
                                } else {
                                    one2++;
                                }
                                if (put0[ind] == ar[ind]/2) {
                                    if (ar[ind]/2 * 2 == ar[ind]) {
                                        one2++;
                                        one1 -= 2;
                                    }
                                }
                            }
                        }
                    } else {
                        if (trg == 0)
                            ind++;
                        else
                            break;
                    }
                }
                if (ind == ar.size()) {
                    frst = 0;
                    ind = 0;
                }
            }
            if (!frst) {
                while (ind < ar.size()) {
                    int trg = (ar[ind]+1) / 2 - put0[ind];
                    int c = min(dlt, trg);
                    if (c != 0) {
                        if (ar[ind] != 1) {
                            dlt--;
                            smdlt++;
                            put0[ind]++;
                            one1 -= 2;
                            one2++;
                            answ++;
                        } else {
                            dlt--;
                            smdlt++;
                            put0[ind]++;
                            answ++;
                        }
                    } else {
                        if (trg == 0)
                            ind++;
                        else
                            break;
                    }
                }
            }
        }
        //    cerr << answ << ' ' << one1 << ' ' << one2 << ' ' << smdlt << '\n';
        if (frst and ar[ind] % 2 == 0) {
            int c = min(val1, val0);
            int c2 = val0 - prvcn[c];
            int apl = prvcn[c] * 4 + c2 * 2;
            if (c2 != 0) {
                apl += min(c2+1, (val1-prvcn[c]));
                apl += min(c2-1, (val1-prvcn[c]));
            }
            ans[indans] = apl;
        } else {
            int cor = answ;
            int c = min(val1, one2);
            val1 -= c;
            cor += c * 2;
            c = min(val1, one1);
            cor += c;
            ans[indans] = cor;
        }
    }
    for (auto i : ans)
        cout << i << '\n';

}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    //cin >> t;
    while (t--) {
        solve();
    }
}

/*
2 2 50
3 4 0 1 1 0 1 1
4 5 1 2 1 1 1 2
 1 5 3 2 4 1 5 3 2 4

 9
1 6 7 3 5 8 9 2 4
1
5 3 1

 9
1 6 7 3 5 8 9 2 4
1
5 3 1
 */

Submission Info

Submission Time
Task C - Maximize Sum of Mex
User SomethingNew
Language C++ 20 (gcc 12.2)
Score 900
Code Size 7006 Byte
Status AC
Exec Time 342 ms
Memory 13688 KiB

Compile Error

Main.cpp: In function ‘void solve()’:
Main.cpp:42:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   42 |     for (int i = 0; i < p.size(); ++i) {
      |                     ~~^~~~~~~~~~
Main.cpp:50:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   50 |     for (int i = 0; i < p.size(); ++i) {
      |                     ~~^~~~~~~~~~
Main.cpp:67:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   67 |     for (int i = 0; i < evens.size(); ++i) {
      |                     ~~^~~~~~~~~~~~~~
Main.cpp:118:28: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  118 |                 while (ind < ar.size()) {
      |                        ~~~~^~~~~~~~~~~
Main.cpp:150:25: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  150 |                 if (ind == ar.size()) {
      |                     ~~~~^~~~~~~~~~~~
Main.cpp:156:28: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  156 |                 while (ind < ar.size()) {
      |                        ~~~~^~~~~~~~~~~
Main.cpp:46:9: warning: unused variable ‘res’ [-Wunused-variable]
   46 |     int res = 0;
      |         ^~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 900 / 900
Status
AC × 3
AC × 51
Set Name Test Cases
Sample 01-sample-01.txt, 01-sample-02.txt, 01-sample-03.txt
All 01-sample-01.txt, 01-sample-02.txt, 01-sample-03.txt, 02-small-01.txt, 02-small-02.txt, 02-small-03.txt, 02-small-04.txt, 02-small-05.txt, 02-small-06.txt, 02-small-07.txt, 02-small-08.txt, 02-small-09.txt, 02-small-10.txt, 03-random-01.txt, 03-random-02.txt, 03-random-03.txt, 03-random-04.txt, 03-random-05.txt, 03-random-06.txt, 03-random-07.txt, 03-random-08.txt, 03-random-09.txt, 03-random-10.txt, 04-divide-01.txt, 04-divide-02.txt, 04-divide-03.txt, 04-divide-04.txt, 04-divide-05.txt, 04-divide-06.txt, 04-divide-07.txt, 04-divide-08.txt, 04-divide-09.txt, 04-divide-10.txt, 05-even-divide-01.txt, 05-even-divide-02.txt, 05-even-divide-03.txt, 05-even-divide-04.txt, 05-even-divide-05.txt, 05-even-divide-06.txt, 05-even-divide-07.txt, 05-even-divide-08.txt, 05-even-divide-09.txt, 05-even-divide-10.txt, 06-even-triangular-divide-01.txt, 06-even-triangular-divide-02.txt, 07-large-cycle-01.txt, 07-large-cycle-02.txt, 08-odd-triangular-divide-01.txt, 08-odd-triangular-divide-02.txt, 09-triangular-divide-01.txt, 09-triangular-divide-02.txt
Case Name Status Exec Time Memory
01-sample-01.txt AC 1 ms 3576 KiB
01-sample-02.txt AC 1 ms 3520 KiB
01-sample-03.txt AC 1 ms 3376 KiB
02-small-01.txt AC 1 ms 3472 KiB
02-small-02.txt AC 1 ms 3660 KiB
02-small-03.txt AC 1 ms 3488 KiB
02-small-04.txt AC 1 ms 3532 KiB
02-small-05.txt AC 1 ms 3412 KiB
02-small-06.txt AC 1 ms 3656 KiB
02-small-07.txt AC 1 ms 3656 KiB
02-small-08.txt AC 1 ms 3520 KiB
02-small-09.txt AC 1 ms 3384 KiB
02-small-10.txt AC 1 ms 3536 KiB
03-random-01.txt AC 326 ms 12612 KiB
03-random-02.txt AC 323 ms 12268 KiB
03-random-03.txt AC 332 ms 13512 KiB
03-random-04.txt AC 324 ms 12528 KiB
03-random-05.txt AC 327 ms 12580 KiB
03-random-06.txt AC 338 ms 12384 KiB
03-random-07.txt AC 336 ms 12896 KiB
03-random-08.txt AC 325 ms 12812 KiB
03-random-09.txt AC 331 ms 12868 KiB
03-random-10.txt AC 326 ms 12280 KiB
04-divide-01.txt AC 330 ms 12524 KiB
04-divide-02.txt AC 327 ms 12492 KiB
04-divide-03.txt AC 332 ms 12520 KiB
04-divide-04.txt AC 325 ms 12556 KiB
04-divide-05.txt AC 329 ms 12576 KiB
04-divide-06.txt AC 332 ms 12488 KiB
04-divide-07.txt AC 330 ms 12428 KiB
04-divide-08.txt AC 326 ms 12488 KiB
04-divide-09.txt AC 327 ms 12524 KiB
04-divide-10.txt AC 332 ms 12544 KiB
05-even-divide-01.txt AC 338 ms 13688 KiB
05-even-divide-02.txt AC 342 ms 13248 KiB
05-even-divide-03.txt AC 338 ms 13040 KiB
05-even-divide-04.txt AC 336 ms 12916 KiB
05-even-divide-05.txt AC 335 ms 12784 KiB
05-even-divide-06.txt AC 335 ms 12848 KiB
05-even-divide-07.txt AC 336 ms 12772 KiB
05-even-divide-08.txt AC 334 ms 12820 KiB
05-even-divide-09.txt AC 335 ms 12764 KiB
05-even-divide-10.txt AC 335 ms 12492 KiB
06-even-triangular-divide-01.txt AC 336 ms 12428 KiB
06-even-triangular-divide-02.txt AC 323 ms 12228 KiB
07-large-cycle-01.txt AC 334 ms 12428 KiB
07-large-cycle-02.txt AC 330 ms 12876 KiB
08-odd-triangular-divide-01.txt AC 333 ms 12520 KiB
08-odd-triangular-divide-02.txt AC 330 ms 12476 KiB
09-triangular-divide-01.txt AC 332 ms 12584 KiB
09-triangular-divide-02.txt AC 325 ms 12228 KiB