Submission #1029536

#TimeUsernameProblemLanguageResultExecution timeMemory
102953612345678Teleporters (IOI08_teleporters)C++17
80 / 100
1051 ms65536 KiB
#include <bits/stdc++.h>

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

using namespace std;

const int nx=1e6+5;

int n, m, u[nx], v[nx], p[nx], res, vs[nx];
set<pair<int, int>> s;
priority_queue<int> pq;

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>m;
    for (int i=1; i<=n; i++) cin>>u[i]>>v[i], s.insert({u[i], i}), s.insert({v[i], i});
    for (int i=1; i<=n; i++)
    {
        if (s.lower_bound(make_pair(v[i]+1, 0))==s.end()) p[i]=-1;
        else
        {
            auto tmp=*s.lower_bound(make_pair(v[i]+1, 0));
            if (tmp.first==u[tmp.second]) p[i]=tmp.second;
            else p[i]=tmp.second+n;
        }
        if (s.lower_bound(make_pair(u[i]+1, 0))==s.end()) p[i+n]=-1;
        else
        {
            auto tmp=*s.lower_bound(make_pair(u[i]+1, 0));
            if (tmp.first==u[tmp.second]) p[i+n]=tmp.second;
            else p[i+n]=tmp.second+n;
        }
    }
    int st=(*s.begin()).second;
    while (st!=-1) vs[st]=1, res++, st=p[st];
    s.clear();
    for (int i=1; i<=2*n; i++)
    {
        if (!vs[i])
        {
            int sz=1, tmp=i;
            while (p[tmp]!=i) vs[tmp]=1, sz++, tmp=p[tmp];
            vs[tmp]=1;
            pq.push(sz); 
        }
    }
    while (m>0&&!pq.empty()) m--, res+=pq.top()+2, pq.pop();
    res+=2*m;
    if (m%2) res--;
    cout<<res;
}
#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...
#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...
#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...
#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...