Submission #1164865

#TimeUsernameProblemLanguageResultExecution timeMemory
1164865mychecksedadCard Collection (JOI24_collection)C++20
0 / 100
0 ms328 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 n, m; array<int, 2> a[N]; array<int, 3> b[N]; vi val; void solve(){ cin >> n >> m; for(int i = 1; i <= n; ++i){ cin >> a[i][0] >> a[i][1]; val.pb(a[i][0]); val.pb(a[i][1]); } for(int i = 1; i <= m; ++i){ cin >> b[i][0] >> b[i][1]; val.pb(b[i][0]); val.pb(b[i][1]); b[i][2] = i; } 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; } for(int i = 1; i <= m; ++i){ b[i][0] = lower_bound(all(val), b[i][0]) - val.begin() + 1; b[i][1] = lower_bound(all(val), b[i][1]) - val.begin() + 1; } vector<array<int, 4>> A; // X, Y, idx, TP A.pb({-31, -31}); for(int i = 1; i <= n; ++i){ A.pb({a[i][0], a[i][1], i, 0}); } for(int i = 1; i <= m; ++i){ A.pb({b[i][0], b[i][1], i, 1}); } sort(all(A)); int sz = val.size(); vector<vi> CX(sz + 1); vector<vi> CY(sz + 1); vi ans(m + 1); map<pii, bool> is; for(int i = 1; i <= n; ++i){ CX[a[i][0]].pb(a[i][1]); CY[a[i][1]].pb(a[i][0]); is[{a[i][0], a[i][1]}] = 1; } for(int i = 1; i <= sz; ++i){ sort(all(CX[i])); sort(all(CY[i])); } n = n + m; vector<int> pref_min_x(n + 2); vector<int> pref_max_x(n + 2); vector<int> suf_min_x(n + 2); vector<int> suf_max_x(n + 2); vector<int> pref_min_y(n + 2); vector<int> pref_max_y(n + 2); vector<int> suf_min_y(n + 2); vector<int> suf_max_y(n + 2); pref_max_x[0] = -MOD; pref_max_y[0] = -MOD; suf_max_y[n + 1] = -MOD; suf_max_x[n + 1] = -MOD; pref_min_x[0] = MOD; pref_min_y[0] = MOD; suf_min_y[n + 1] = MOD; suf_min_x[n + 1] = MOD; for(int i = 1; i <= n; ++i){ if(A[i][3] == 0){ pref_max_x[i] = max(pref_max_x[i - 1], A[i][0]); pref_min_x[i] = min(pref_min_x[i - 1], A[i][0]); pref_min_y[i] = min(pref_min_y[i - 1], A[i][1]); pref_max_y[i] = max(pref_max_y[i - 1], A[i][1]); }else{ pref_max_x[i] = pref_max_x[i - 1]; pref_max_y[i] = pref_max_y[i - 1]; pref_min_x[i] = pref_min_x[i - 1]; pref_min_y[i] = pref_min_y[i - 1]; } } for(int i = n; i >= 1; --i){ if(A[i][3] == 0){ suf_max_x[i] = max(suf_max_x[i + 1], A[i][0]); suf_min_x[i] = min(suf_min_x[i + 1], A[i][0]); suf_min_y[i] = min(suf_min_y[i + 1], A[i][1]); suf_max_y[i] = max(suf_max_y[i + 1], A[i][1]); }else{ suf_max_x[i] = suf_max_x[i + 1]; suf_min_x[i] = suf_min_x[i + 1]; suf_max_y[i] = suf_max_y[i + 1]; suf_min_y[i] = suf_min_y[i + 1]; } } int cur = 0; for(int i = 1; i <= n; ++i){ if(A[i][3] == 0) continue; if(!CX[A[i][0]].empty() && !CY[A[i][1]].empty()){ if(is[{A[i][0], A[i][1]}]){ if(pref_min_y[i - 1] <= A[i][1] || suf_max_y[i + 1] >= A[i][1]){ ans[A[i][2]] = 1; }else{ ans[A[i][2]] = 0; } }else{ int X = A[i][0], Y = A[i][1]; int pos = CX[X][0]; if(pos < Y){ if(CY[Y][0] <= X){ ans[A[i][2]] = 1; }else if(pref_max_y[i - 1] >= Y){ ans[A[i][2]] = 1; }else{ ans[A[i][2]] = 0; } }else{ if(CY[Y].back() >= X){ ans[A[i][2]] = 1; }else if(suf_min_y[i + 1] <= Y){ ans[A[i][2]] = 1; }else{ ans[A[i][2]] = 0; } } } } } vi res; for(int i = 1; i <= m; ++i){ if(ans[i]) res.pb(i); } sort(all(res)); for(int x: res) cout << x << ' '; } 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(); en; } cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n"; 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...