Submission #1199318

#TimeUsernameProblemLanguageResultExecution timeMemory
1199318mychecksedadEvent Hopping 2 (JOI21_event2)C++20
0 / 100
96 ms26044 KiB
/* Author : Mychecksdead */ #include<bits/stdc++.h> using namespace std; #define ll long long int #define MOD (1000000000+7) #define MOD1 (998244353) #define pb push_back #define all(x) x.begin(), x.end() #define en cout << '\n' #define ff first #define ss second #define pii pair<int,int> #define vi vector<int> const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30; int sz, T[N]; void build(){ for(int i = 0; i <= 2*sz + 1; ++i) T[i] = 0; } void upd(int v, int val){ v += sz; T[v] = max(T[v], val); for(v >>= 1; v > 0; v >>= 1) T[v] = max(T[v<<1], T[v<<1|1]); } int get(int l, int r){ l += sz; r += sz + 1; int res = 0; for(; l < r; l >>= 1, r >>= 1){ if(l&1) res = max(res, T[l++]); if(r&1) res = max(res, T[--r]); } return res; } int n, k, go[N][20]; array<int, 3> a[N]; int gett(int l, int r){ int ans = 0; int v = l; if(go[v][0] > r) return 0; for(int j = 19; j >= 0; --j){ if(go[v][j] <= r){ ans += (1<<j); v = go[v][j]; } } return ans; } void solve(){ cin >> n >> k; vi val; for(int i = 1; i <= n; ++i){ cin >> a[i][0] >> a[i][1]; a[i][2] = i; val.pb(a[i][0]); val.pb(a[i][1]); } sort(all(val)); val.erase(unique(all(val)), val.end()); for(int i = 1; i <= n; ++i){ a[i][0] = lower_bound(all(val), a[i][0]) - val.begin() + 1; a[i][1] = lower_bound(all(val), a[i][1]) - val.begin() + 1; } int m = val.size(); sort(a+1, a+1+n); sz = m; build(); vector<int> dp(m + 37); for(int i = 1; i <= n; ++i){ int L = a[i][0]; int R = a[i][1]; dp[R] = max(dp[R], get(1, L) + 1); upd(R, dp[R]); } for(int i = 1; i <= m; ++i) dp[i] = max(dp[i], dp[i - 1]); int max_sum = dp[m]; int last = m + 1, cnt = n; for(int i = m; i >= 1; --i){ while(cnt >= 1 && a[cnt][0] >= i){ last = min(a[cnt][1], last); --cnt; } go[i][0] = last; } go[m + 1][0] = m + 1; for(int j = 1; j < 20; ++j){ for(int i = 1; i <= m + 1; ++i){ go[i][j] = go[go[i][j - 1]][j - 1]; } } vi pos(n + 1); for(int i = 1; i <= n; ++i){ pos[a[i][2]] = i; } vi res; set<array<int, 2>> S; S.insert({1, m}); int num = k; for(int i = 1; i <= n; ++i){ if(num == 0) break; int L = a[pos[i]][0]; int R = a[pos[i]][1]; auto it = S.upper_bound(array<int, 2>{R, -1}); if(it != S.begin() && (*prev(it))[0] <= L){ auto [l, r] = (*prev(it)); int bef = gett(l, r); int aft = gett(l, L) + 1 + gett(R, r); // cout << L << ' ' << R << ' ' << l << ' ' << r << '\n'; if(max_sum - bef + aft >= k){ max_sum = max_sum - bef + aft; S.erase(prev(it)); if(l < L) S.insert({l, L}); if(R < r) S.insert({R, r}); --num; res.pb(i); } } } // for(auto [l, r, ldp, rdp, i]: S) cout << val[l] << ' ' << val[r] << ' ' << l << ' ' << r << ' ' << i << '\n'; if(res.size() < k){ cout << -1; en; return; } sort(all(res)); for(int x: res) cout << x << '\n'; } int main(){ cin.tie(0); ios::sync_with_stdio(0); int tt = 1, aa; // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while(tt--){ 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...