CSES - HIIT Open 2024 - Results
Submission details
Task:Key cutting
Sender:Vaicode
Submission time:2024-11-16 16:34:00 +0200
Language:C++ (C++20)
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.00 sdetails
#2ACCEPTED0.00 sdetails
#3ACCEPTED0.00 sdetails
#4ACCEPTED0.00 sdetails
#5ACCEPTED0.00 sdetails
#6ACCEPTED0.00 sdetails
#7ACCEPTED0.00 sdetails
#8ACCEPTED0.00 sdetails
#9ACCEPTED0.03 sdetails
#10ACCEPTED0.04 sdetails
#11ACCEPTED0.05 sdetails
#12ACCEPTED0.07 sdetails
#13ACCEPTED0.10 sdetails
#14ACCEPTED0.11 sdetails

Code

#include<iostream>
#include<vector>
#include <cmath>
#include<list>
#include<queue> 
#include<climits> 

using namespace std;


struct vless : std::binary_function<vector<int>, vector<int>, bool>
{
    bool operator()(const vector<int>& a, const vector<int> &b) const { return a[0] < b[0]; }
};

int main()
{
    int n = 0;
    cin >> n;

    //vector<int> segs = {1, 0, 1, 1, 0, 2, 1, 3, 3, 1, 2, 3, 4, 0};
//    vector<int> segs = {1, 0, 1, 1, 0, 2, 1, 3, 3, 1};

    vector<vector<int> > sdata;

    priority_queue<vector<int>, vector<vector<int> >, vless> q;
    

    int prev = -1;
    int prev_d = -1;

    for(int i = 0; i < n; ++i)
    //for(size_t i = 0; i < size(segs); ++i)
    {
        //int d = segs[i];
        int d = 0;
        cin >> d;
        vector<int> sitem = vector<int>({-1, -1, -1});
        sitem[0] = d;

        if(prev_d != d)
        {
            sitem[1] = prev;
            if(prev >= 0)
                sdata[prev][2] = i;
            prev = i;
            prev_d = d;
            // cout << "DEBUG HEAP i" << i << " " << d << endl;
            if(d > 0)
                q.push({d, int(i)});
        }

        sdata.push_back(sitem);
    }

//    for(size_t i = 0; i < size(sdata); ++i)
  //      cout << sdata[i][0] << " " << sdata[i][1] << " " << sdata[i][2] << endl;

    int n_ops = 0;
    while(!q.empty())
    {
    //    cout << q.top()[0] << " i: " << q.top()[1] << endl;
        int i = q.top()[1];

        auto val = sdata[i][0];
        if(val < 0)
        {
//            cout << "DISC" << endl;
            q.pop();
            continue;
        }

        auto prev_i = sdata[i][1];
        auto next_i = sdata[i][2];

      //  cout << "UPDATE " << "i " << i << " prev_i " << i <<  " next_i " << next_i <<endl;
        auto prev_val = prev_i >= 0 ? sdata[prev_i][0] : INT_MAX;
        auto next_val = next_i >= 0 ? sdata[next_i][0] : INT_MAX;

        auto update_val = min(prev_val, next_val);

        if(update_val < val)
        {
            sdata[i][0] = -1;
            sdata[i][1] = -1;
            sdata[i][1] = -1;
            if(prev_i > 0)
                sdata[prev_i][2] = next_i;
            if(next_i > 0)
                sdata[next_i][1] = prev_i;

            if(prev_val == next_val && prev_val > 0)
            {
                int supernext_i = sdata[next_i][2];
                if(prev_i > 0)
                   sdata[prev_i][2] = supernext_i;
                if(supernext_i > 0)
                   sdata[supernext_i][1] = prev_i;

                sdata[next_i][0] = -1;
                sdata[next_i][1] = -1;
                sdata[next_i][1] = -1;
            }
        }

        //sdata[i]

        q.pop();
        ++n_ops;

    }
    cout << n_ops << endl;
}

Test details

Test 1

Verdict: ACCEPTED

input
3
1 2 1

correct output
2

user output
2

Test 2

Verdict: ACCEPTED

input
1
0

correct output
0

user output
0

Test 3

Verdict: ACCEPTED

input
1
9

correct output
1

user output
1

Test 4

Verdict: ACCEPTED

input
100
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
0

user output
0

Test 5

Verdict: ACCEPTED

input
100
0 0 0 1 1 0 0 0 0 1 1 1 0 1 1 ...

correct output
25

user output
25

Test 6

Verdict: ACCEPTED

input
100
2 1 2 1 2 0 0 0 1 1 2 2 1 2 2 ...

correct output
41

user output
41

Test 7

Verdict: ACCEPTED

input
100
36 5 10 37 94 59 20 31 64 2 58...

correct output
99

user output
99

Test 8

Verdict: ACCEPTED

input
100
228768416 32415139 952687252 6...

correct output
100

user output
100

Test 9

Verdict: ACCEPTED

input
100000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
0

user output
0

Test 10

Verdict: ACCEPTED

input
100000
1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 ...

correct output
24965

user output
24965

Test 11

Verdict: ACCEPTED

input
100000
2 1 2 2 2 2 2 1 1 0 1 1 0 1 1 ...

correct output
38968

user output
38968

Test 12

Verdict: ACCEPTED

input
100000
4 4 5 4 4 5 0 2 2 1 4 4 1 0 5 ...

correct output
59156

user output
59156

Test 13

Verdict: ACCEPTED

input
100000
18 5 6 16 8 10 1 7 4 15 5 9 19...

correct output
82598

user output
82598

Test 14

Verdict: ACCEPTED

input
100000
33 37 37 86 42 38 18 10 77 57 ...

correct output
94897

user output
94897