제출 #419292

#제출 시각아이디문제언어결과실행 시간메모리
419292ryanseeEvent Hopping 2 (JOI21_event2)C++14
100 / 100
277 ms22876 KiB
#include "bits/stdc++.h" using namespace std; #define FAST ios_base::sync_with_stdio(false); cin.tie(0); #define pb push_back #define eb emplace_back #define ins insert #define f first #define s second #define cbr cerr<<"hi\n" #define mmst(x, v) memset((x), v, sizeof ((x))) #define siz(x) ll(x.size()) #define all(x) (x).begin(), (x).end() #define lbd(x,y) (lower_bound(all(x),y)-x.begin()) #define ubd(x,y) (upper_bound(all(x),y)-x.begin()) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); inline long long rand(long long x, long long y) { return rng() % (y+1-x) + x; } //inclusive string inline to_string(char c) {string s(1,c);return s;} template<typename T> inline T gcd(T a,T b){ return a==0?llabs(b):gcd(b%a,a); } using ll=long long; using ld=long double; #define FOR(i,s,e) for(ll i=s;i<=ll(e);++i) #define DEC(i,s,e) for(ll i=s;i>=ll(e);--i) using pi=pair<ll,ll>; using spi=pair<ll,pi>; using dpi=pair<pi,ll>; long long LLINF = 1e18; int INF = 1e9+1e6; #define MAXN (100006) int n,k,p[MAXN][17],co; pi A[MAXN]; vector<spi> v, u; set<dpi> events; ll solve(ll x,ll y) { // bsearch for last event that ends before y ll st=-1,en=siz(v); while(en-st>1) { ll mid=(st+en)>>1; if(v[mid].s.s <= y) st = mid; else en = mid; } if(st == -1 || v[st].s.f < x) return 0; ll ans = 1, i = v[st].f; // if(b==0) { DEC(j,16,0) if(p[i][j] != -1 && A[p[i][j]].f >= x) { i = p[i][j], ans += 1<<j; } // } else { // ll lol = v[st].s.f; // DEC(j,st-1,0) if(v[j].s.s <= lol) { // if(v[j].s.f < x) break; // ++ ans, lol = v[j].s.f; // } // } return ans; } int main() { FAST cin>>n>>k; FOR(i,1,n)cin>>A[i].f>>A[i].s, v.eb(i, A[i]); sort(all(v), [](spi x,spi y){return pi(x.s.f,-x.s.s)<pi(y.s.f,-y.s.s);}); DEC(i,n-1,0) if(u.empty() || u.back().s.s > v[i].s.s) { u.eb(v[i]); } v.clear(); while(u.size()) v.eb(u.back()), u.pop_back(); deque<int> dq; for(auto i:v) { if(dq.empty() || A[dq[0]].s > i.s.f) { p[i.f][0] = -1; } else { while(dq.size() > 1 && A[dq[1]].s <= i.s.f) dq.pop_front(); p[i.f][0] = dq[0]; } dq.eb(i.f); } FOR(j,1,16) FOR(i,1,n) if(p[i][j-1] != -1) p[i][j]=p[p[i][j-1]][j-1]; else p[i][j] = -1; events.ins(dpi(pi(0, 1), -1)), events.ins(dpi(pi(1e9, int(1e9) + 1), -1)); co = solve(1, 1e9); if(co < k) { cout<<"-1\n"; return 0; } FOR(i,1,n) { auto it = prev(events.upper_bound(dpi(pi(A[i].f, LLINF),LLINF))); if(it->f.s > A[i].f) continue; ++ it; if(it->f.f < A[i].s) continue; int tmp = solve(prev(it)->f.s, it->f.f); int wow = solve(prev(it)->f.s, A[i].f) + solve(A[i].s, it->f.f) + 1; if(co - tmp + wow < k) continue; co += wow - tmp; events.ins(dpi(A[i], i)); if(events.size() == k+2) break; } if(events.size() != k+2) { assert(0); } else { vector<int> ind; for(auto i:events) if(i.s != -1) ind.eb(i.s); sort(all(ind)); for(auto i:ind) cout<<i<<'\n'; } }

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

event2.cpp: In function 'int main()':
event2.cpp:92:20: warning: comparison of integer expressions of different signedness: 'std::set<std::pair<std::pair<long long int, long long int>, long long int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   92 |   if(events.size() == k+2) break;
      |      ~~~~~~~~~~~~~~^~~~~~
event2.cpp:94:19: warning: comparison of integer expressions of different signedness: 'std::set<std::pair<std::pair<long long int, long long int>, long long int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   94 |  if(events.size() != k+2) {
      |     ~~~~~~~~~~~~~~^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...