Submission #1029533

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

using namespace std;

const int nx=1e6+5;

int n, m, u[nx], v[nx], p[2*nx], res, vs[2*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;
        }
    }
    //cout<<"debug\n";
    //for (int i=1; i<=n;i ++) cout<<i<<' '<<p[i]<<' '<<p[i+n]<<'\n';
    int st=(*s.begin()).second;
    //cout<<"st "<<st<<'\n';
    while (st!=-1) vs[st]=1, res++, st=p[st];
    //cout<<"vs ";
    //for (int i=1 ;i<=2*n; i++) cout<<vs[i]<<' ';
    //cout<<'\n';
    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); 
            //cout<<"here "<<i<<' '<<sz<<'\n';
        }
    }
    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...