Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <chrono>
- #include <random>
- #include <set>
- #include <algorithm>
- std::mt19937 rng((int) std::chrono::steady_clock::now().time_since_epoch().count());
- long long solve() {
- std::set<int> wtf[2];
- std::set<int> haha[2];
- std::set<int> lul[2];
- int n, k;
- std::cin >> n >> k;
- wtf[0].insert(-1);
- wtf[0].insert(n);
- wtf[1] = wtf[0];
- haha[0] = haha[1] = wtf[0];
- lul[0] = lul[1] = wtf[0];
- std::vector< std::pair<int, int> > events(2 * n);
- for(int i = 0; i < 2 * n; i++) {
- std::cin >> events[i].first;
- events[i].second = i;
- }
- std::sort(events.begin(), events.end());
- std::reverse(events.begin(), events.end());
- long long ans = 0;
- int pt = 0;
- for(auto e : events) {
- int l, m, r;
- m = e.second % n;
- int id = e.second / n;
- {
- auto it = wtf[id].lower_bound(m);
- r = *it;
- it--;
- l = *it + 1;
- }
- while(abs(e.first - events[pt].first) > k) {
- auto ee = events[pt++];
- haha[ee.second / n].erase(ee.second % n);
- lul[ee.second / n].insert(ee.second % n);
- }
- {
- // fixing l
- auto it = lul[id^1].lower_bound(m + 1);
- it--;
- l = std::max(l, *it + 1);
- }
- {
- // fixing r
- auto it = lul[id^1].lower_bound(m);
- r = std::min(r, *it);
- }
- int pl = l - 1;
- {
- // finding pl
- auto it = haha[id^1].lower_bound(m + 1);
- it--;
- pl = std::max(pl, *it);
- }
- int pr = r;
- {
- // finding pr
- auto it = haha[id^1].lower_bound(m);
- pr = std::min(pr, *it);
- }
- ans += (long long) (m - l + 1) * (r - pr) + (long long) (pl - l + 1) * (r - m) - (long long) (pl - l + 1) * (r - pr);
- // inserts
- wtf[id].insert(e.second % n);
- haha[id].insert(m);
- }
- return ans;
- }
- int main() {
- std::ios_base::sync_with_stdio(false); std::cin.tie(NULL);
- int t;
- std::cin >> t;
- for(int tt = 1; tt <= t; tt++) {
- std::cout << "Case #" << tt << ": " << solve() << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement