Submission #376793

#TimeUsernameProblemLanguageResultExecution timeMemory
376793couplefiretrapezoid (balkan11_trapezoid)C++17
100 / 100
395 ms57260 KiB
#include <bits/stdc++.h> using namespace std; #define MAXN 100005 #define INF 524288 #define MOD 30013 inline int add(int a, int b){return (a+b>=MOD)?a+b-MOD:a+b;} inline void inc(int& a, int b){a = add(a, b);} inline int sub(int a, int b){return (a-b<0)?a-b+MOD:a-b;} inline void dec(int &a, int b){a = sub(a, b);} inline int mul(int a, int b){return 1ll*a*b%MOD;} inline void grow(int &a, int b){a = mul(a, b);} pair<int, int> tree[2*INF]; pair<int, int> merge(pair<int, int> a, pair<int, int> b){ if(a.first != b.first) return max(a, b); return {a.first, add(a.second,b.second)}; } void upd(int pos, int val, int cnt, int tl = 0, int tr = INF-1, int v = 1){ if(tl > pos || tr < pos) return; if(tl == tr){ tree[v] = {val, cnt}; return; } int tm = (tl+tr)/2; upd(pos, val, cnt, tl, tm, v*2); upd(pos, val, cnt, tm+1, tr, v*2+1); tree[v] = merge(tree[v*2], tree[v*2+1]); } pair<int, int> query(int l, int r, int tl = 0, int tr = INF-1, int v = 1){ if(tl > r || tr < l) return {0, 0}; if(l <= tl && tr <= r) return tree[v]; int tm = (tl+tr)/2; return merge(query(l, r, tl, tm, v*2), query(l, r, tm+1, tr, v*2+1)); } int n; vector<int> coords; map<int, int> mp; pair<pair<int, int>, pair<int, int>> stuff[MAXN]; vector<pair<int, int>> ask[INF]; // y-coord, id vector<pair<pair<int, int>, int>> todo[INF]; // val, y-coord pair<int, int> ans = {0, 1}; int main(){ // freopen("a.in", "r", stdin); ios_base::sync_with_stdio(false); cin.tie(0); cin >> n; for(int i = 1; i<=n; i++){ int a, b, c, d; cin >> a >> b >> c >> d; coords.push_back(a); coords.push_back(b); coords.push_back(c); coords.push_back(d); stuff[i] = {{a, c}, {b, d}}; } sort(coords.begin(), coords.end()); coords.erase(unique(coords.begin(), coords.end()), coords.end()); // for(auto x : coords) cout << x << endl; for(int i = 0; i<coords.size(); i++) mp[coords[i]] = i+1; for(int i = 1; i<=n; i++) stuff[i] = {{mp[stuff[i].first.first], mp[stuff[i].first.second]}, {mp[stuff[i].second.first], mp[stuff[i].second.second]}}; for(int i = 1; i<=n; i++) ask[stuff[i].first.first].push_back({stuff[i].first.second, i}); for(int i = 1; i<INF; i++){ for(auto x : ask[i]){ pair<int, int> tmp = query(0, x.first-1); tmp.first += 1; if(tmp.first == 1) tmp.second = 1; ans = merge(ans, tmp); todo[stuff[x.second].second.first].push_back({tmp, stuff[x.second].second.second}); } for(auto x : todo[i]){ upd(x.second, x.first.first, x.first.second); } } cout << ans.first << endl; cout << ans.second << endl; }

Compilation message (stderr)

trapezoid.cpp: In function 'int main()':
trapezoid.cpp:61:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   61 |     for(int i = 0; i<coords.size(); i++) mp[coords[i]] = i+1;
      |                    ~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...