제출 #1074720

#제출 시각아이디문제언어결과실행 시간메모리
1074720MOUF_MAHMALATEvent Hopping 2 (JOI21_event2)C++14
100 / 100
152 ms24100 KiB
#include <bits/stdc++.h>
#define all(v) v.begin(),v.end()
#define F first
#define S second
using namespace std;
typedef int ll;
typedef pair<ll,ll>pll;
const ll oo= 1e5+9;
ll n,k,dp[18][2*oo],sz;
pll a[oo],b[oo];
vector<ll>comp,ans;
ll go(ll l,ll r)
{
    ll mask=0;
    for(ll i=17; i>=0; i--)
        if(dp[i][l]<=r)
        {
            mask|=(1<<i);
            l=dp[i][l];
        }
    return mask;
}
void solve()
{
    cin>>n>>k;
    for(ll i=1; i<=n; i++)
    {
        cin>>a[i].F>>a[i].S;
        comp.push_back(a[i].F);
        comp.push_back(a[i].S);
    }
    sort(all(comp));
    comp.resize(unique(all(comp))-comp.begin());
    for(ll i=1; i<=n; i++)
    {
        a[i].F=lower_bound(all(comp),a[i].F)-comp.begin();
        a[i].S=lower_bound(all(comp),a[i].S)-comp.begin();
        b[i]=a[i];
    }
    sz=comp.size();
    sort(b+1,b+n+1);
    dp[0][sz]=sz;
    ll id=n;
    for(ll i=sz-1; i>=0; i--)
    {
        dp[0][i]=dp[0][i+1];
        while(id&&b[id].F>=i)
            dp[0][i]=min(dp[0][i],b[id].S),id--;
    }
    for(ll j=1; j<18; j++)
        for(ll i=0; i<=sz; i++)
            dp[j][i]=dp[j-1][dp[j-1][i]];
    set<pll>s;
    s.insert({0,0});
    s.insert({sz-1,sz-1});
    ll kk =go(0,sz-1);
    if(kk < k)
        return void(cout<<-1);
    for(ll i=1;i<=n;i++)
    {
        if(s.find(a[i])!=s.end())
            continue;
        s.insert(a[i]);
        auto it = s.find(a[i]);
        auto prev = it;prev--;
        auto next = it;next++;
        if(prev->S > it->F || it->S > next->F)
        {
            s.erase(a[i]);
            continue;
        }
        kk += go(prev->S,it->F) + go(it->S,next->F) - go(prev->S,next->F) +1;
        if(kk < k)
        {
            kk -= go(prev->S,it->F) + go(it->S,next->F) - go(prev->S,next->F) +1;
            s.erase(a[i]);
        }
        else
            ans.push_back(i);
        if(ans.size()==k)
            break;
    }
    for(auto&z:ans)
        cout<<z<<"\n";
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    ll tt=1;
//    cin>>tt;
    while(tt--)
        solve();
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

event2.cpp: In function 'void solve()':
event2.cpp:80:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'int'} [-Wsign-compare]
   80 |         if(ans.size()==k)
      |            ~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...