Submission #1294958

#TimeUsernameProblemLanguageResultExecution timeMemory
1294958simona1230Event Hopping 2 (JOI21_event2)C++20
32 / 100
3094 ms14960 KiB
#include <bits/stdc++.h>

using namespace std;

void speed()
{
    ios_base::sync_with_stdio(NULL);
    cin.tie(nullptr);
    cout.tie(nullptr);
}

struct segm
{
    int first,second,i;
    segm(){}
    segm(int f,int s,int id)
    {
        first=f;
        second=s;
        i=id;
    }
};

int intersect(segm s,pair<int,int> p)
{
    return s.first==p.first&&s.second==p.second||s.first>p.first&&s.first<p.second||s.second>p.first&&s.second<p.second||
            p.first>s.first&&p.first<s.second||p.second>s.first&&p.second<s.second;
}

int n,k;
segm p[200001];
pair<int,int> a[200001];

vector<int> h;
map<int,int> mp;

bool cmp(segm s1,segm s2)
{
    return s1.first<s2.first;
}

void read()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>p[i].first>>p[i].second;
        h.push_back(p[i].first);
        h.push_back(p[i].second);
    }

    sort(h.begin(),h.end());
    int num=0;
    for(int i=0;i<2*n;i++)
    {
        if(i==1||h[i]!=h[i-1])num++;
        mp[h[i]]=num;
    }

    for(int i=1;i<=n;i++)
    {
        p[i].first=mp[p[i].first];
        p[i].second=mp[p[i].second];
        p[i].i=i;

        a[i].first=p[i].first;
        a[i].second=p[i].second;
    }

    sort(p+1,p+n+1,cmp);
}

int dp[200001];
vector<int> ans;
int u[200001],u1[200001];

void solve()
{

    /*for(int i=1;i<=n;i++)
        cout<<a[i].first<<" "<<a[i].second<<endl;

    cout<<"---"<<endl;
    for(int i=1;i<=n;i++)
        cout<<p[i].first<<" "<<p[i].second<<endl;
    cout<<"---"<<endl;*/
    for(int i=1;i<=n;i++)
    {
        if(ans.size()==k)break;
        if(u[i])continue;

        for(int j=1;j<=2*n;j++)
            u1[j]=dp[j]=0;

        for(int j=1;j<=n;j++)
        {
            if(intersect(p[j],a[i]))
                u1[p[j].i]=1;
        }

        int maxx=1,pt=0;
        for(int j=1;j<=n;j++)
        {
            int id=p[j].i;
            if(u[id]||u1[id])continue;

            while(pt<=p[j].first)
            {
                maxx=max(maxx,dp[pt]);
                pt++;
            }

            dp[p[j].second]=max(dp[p[j].second],maxx+1);
        }

        while(pt<=2*n)
        {
            maxx=max(maxx,dp[pt]);
            pt++;
        }

        /*for(int j=1;j<=n;j++)
            cout<<max(u[j],u1[j])<<" ";
        cout<<endl;

        cout<<i<<" "<<maxx<<endl;*/

        if(maxx>=k-ans.size())
        {
            ans.push_back(i);
            for(int j=1;j<=2*n;j++)
                u[j]=max(u[j],u1[j]);
        }
    }

    if(ans.size()<k)cout<<-1<<endl;
    else

    for(int i=0;i<ans.size();i++)
    {
        cout<<ans[i]<<endl;
    }
}

int main()
{
    speed();
    read();
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...