Submission #1201509

#TimeUsernameProblemLanguageResultExecution timeMemory
1201509adiyerPairs (IOI07_pairs)C++20
100 / 100
3167 ms3092 KiB
#pragma optimize ("g",on) #pragma GCC optimize("inline") #pragma GCC optimize ("Ofast") #pragma GCC optimize ("unroll-loops") #pragma GCC optimize ("03") #include <bits/stdc++.h> using namespace std; typedef int ll; const int N = 2e5 + 11; ll B, n, k, m; ll a[N], b[N], c[N], t[N]; long long res; vector < pair < ll, ll > > scan; vector < pair < ll, ll > > v[100]; void add(ll i, ll x){ for(; i < N; i += (i & (-i))) t[i] += x; } ll get(ll r){ ll ret = 0; for(; r > 0; r -= (r & (-r))) ret += t[r]; return ret; } ll get(ll l, ll r){ return get(r) - get(l - 1); } ll count(ll d){ sort(scan.begin(), scan.end()); ll j = 0, cur = 0; for(auto x : scan){ while(x.first - scan[j].first > d) add(scan[j].second, -1), j++; cur += get(x.second - d, x.second + d), add(x.second, 1); } while(j < scan.size()) add(scan[j].second, -1), j++; return cur; } ll calc(ll i1, ll i2){ ll d = k - abs(i1 - i2), cur = 0; if(v[i1].empty() || v[i2].empty() || d < 0) return 0; scan.clear(); for(auto x : v[i1]) scan.push_back({x.first - x.second, x.first + x.second}); for(auto x : v[i2]) scan.push_back({x.first - x.second, x.first + x.second}); cur += count(d); scan.clear(); for(auto x : v[i1]) scan.push_back({x.first - x.second, x.first + x.second}); cur -= count(d); scan.clear(); for(auto x : v[i2]) scan.push_back({x.first - x.second, x.first + x.second}); cur -= count(d); return cur; } void solve(){ cin >> B >> n >> k >> m; if(B == 3){ for(ll i = 1; i <= n; i++) cin >> a[i] >> b[i] >> c[i], v[a[i]].push_back({b[i], c[i]}); for(ll i = 1; i <= m; i++) sort(v[i].begin(), v[i].end()); for(ll i1 = 1; i1 <= m; i1++){ for(ll i2 = 1; i2 <= m; i2++){ res += calc(i1, i2); } } cout << (res - n) / 2; } else if(B == 1){ for(ll i = 1; i <= n; i++) cin >> a[i]; sort(a + 1, a + n + 1); for(ll i = 1; i <= n; i++){ ll L, R, l, r; l = 0, r = n; while(r - l > 1){ ll md = (l + r) / 2; if(a[md] + k >= a[i]) r = md; else l = md; } L = r; l = 0, r = n + 1; while(r - l > 1){ ll md = (l + r) / 2; if(a[md] - k <= a[i]) l = md; else r = md; } R = l; res += (R - L + 1); // cout << i << ' ' << L << ' ' << R << '\n'; } cout << (res - n) / 2; } else{ vector < pair < ll, ll > > scan; for(ll i = 1; i <= n; i++) cin >> a[i] >> b[i]; for(ll i = 1; i <= n; i++) scan.push_back({a[i] - b[i], a[i] + b[i]}); sort(scan.begin(), scan.end()); ll j = 0; for(auto x : scan){ while(x.first - scan[j].first > k) add(scan[j].second, -1), j++; res += get(x.second - k, x.second + k), add(x.second, 1); } cout << res; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); int tt = 1; // cin >> tt; while(tt--) solve(); }
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...