Submission #1208264

#TimeUsernameProblemLanguageResultExecution timeMemory
1208264urejgiPlahte (COCI17_plahte)C++17
160 / 160
276 ms26976 KiB
#pragma GCC optimize("O3,unroll-loops,fast-math") #pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt,tune=native,fma") #include <bits/stdc++.h> #define f first #define s second using namespace std; typedef long long ll; struct S{ int a,b,c,d,i; }; signed main(){ cin.tie(0)->sync_with_stdio(0); int n,m; cin >> n >> m; vector<S> a; a.reserve(n); for(int i = 0; i < n; i++){ S s; cin >> s.a >> s.b >> s.c >> s.d; s.i = i; a.push_back(s); } vector<int> p(n,-1); { vector<pair<int,int>> evs; evs.reserve(2*n); for(int i = 0; i < n; i++){ evs.emplace_back(i, +1); evs.emplace_back(i, -1); } sort(evs.begin(),evs.end(),[&](auto l,auto r)->bool{ if(l.f == r.f) return l.s > r.s; if(l.s == 1 && r.s == 1) return (a[l.f].a == a[r.f].a ? a[l.f].b < a[r.f].b : a[l.f].a < a[r.f].a); if(l.s == 1 && r.s == -1) return (a[l.f].a == a[r.f].c ? 1 : a[l.f].a < a[r.f].c); if(l.s == -1 && r.s == 1) return (a[l.f].c == a[r.f].a ? 0 : a[l.f].c < a[r.f].a); if(l.s == -1 && r.s == -1) return (a[l.f].c == a[r.f].c ? a[l.f].d > a[r.f].d : a[l.f].c < a[r.f].c); }); set<array<int, 3>> s; for(auto[i,t]:evs){ if(t < 0){ s.erase(s.find({a[i].b, i, -1})); s.erase(s.find({a[i].d, i, +1})); }else{ s.insert({a[i].b, i, -1}); s.insert({a[i].d, i, +1}); auto it = s.find({{a[i].b,i,-1}}); if(it != s.begin()){ --it; if((*it)[2] < 0) p[i] = (*it)[1]; else p[i] = p[(*it)[1]]; } } } } vector<int> x(m), y(m), k(m); for(int i = 0; i < m; i++) cin >> x[i] >> y[i] >> k[i]; vector<set<int>> have(n); { vector<pair<int,int>> evs; evs.reserve(2*n); for(int i = 0; i < n; i++){ evs.emplace_back(i, +1); evs.emplace_back(i, -1); } for(int i = 0; i < m; i++){ evs.emplace_back(i, 0); } sort(evs.begin(), evs.end(), [&](auto l, auto r) -> bool{ if(l.s != 0 && r.s != 0){ if(l.f == r.f) return l.s > r.s; if(l.s == 1 && r.s == 1) return (a[l.f].a == a[r.f].a ? a[l.f].b < a[r.f].b : a[l.f].a < a[r.f].a); if(l.s == 1 && r.s == -1) return (a[l.f].a == a[r.f].c ? 1 : a[l.f].a < a[r.f].c); if(l.s == -1 && r.s == 1) return (a[l.f].c == a[r.f].a ? 0 : a[l.f].c < a[r.f].a); if(l.s == -1 && r.s == -1) return (a[l.f].c == a[r.f].c ? a[l.f].d > a[r.f].d : a[l.f].c < a[r.f].c); }else{ if(l.s != 0) return (l.s > 0 ? a[l.f].a <= x[r.f] : a[l.f].c < x[r.f]); if(r.s != 0) return (r.s > 0 ? x[l.f] < a[r.f].a : x[l.f] <= a[r.f].c); return x[l.f] < x[r.f]; } }); set<array<int, 3>> s; for(auto[i,t]:evs){ if(t < 0){ s.erase(s.find({a[i].b, i, -1})); s.erase(s.find({a[i].d, i, +1})); }else if(t == 0){ auto it = s.lower_bound({y[i], -1, -1}); if(it != s.end()){ if((*it)[2] > 0 || y[i] == a[(*it)[1]].b){ have[(*it)[1]].insert(k[i]); }else{ if(p[(*it)[1]] >= 0){ have[p[(*it)[1]]].insert(k[i]); } } } }else{ s.insert({a[i].b, i, -1}); s.insert({a[i].d, i, +1}); } } } vector<int> g[n]; for(int i = 0; i < n; i++) if(p[i] >= 0) g[p[i]].push_back(i); vector<int> ans(n); function<void(int)> dfs = [&](int i) -> void{ for(auto&j:g[i]){ dfs(j); if(have[i].size() < have[j].size()) have[i].swap(have[j]); for(auto&x:have[j]) have[i].insert(x); have[j].clear(); } ans[i] = have[i].size(); }; for(int i = 0; i < n; i++) if(p[i] < 0) dfs(i); for(auto&x:ans)cout<<x<<'\n'; return 0; }

Compilation message (stderr)

plahte.cpp: In lambda function:
plahte.cpp:42:9: warning: control reaches end of non-void function [-Wreturn-type]
   42 |         });
      |         ^
plahte.cpp: In lambda function:
plahte.cpp:90:9: warning: control reaches end of non-void function [-Wreturn-type]
   90 |         });
      |         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...