Submission #495005

# Submission time Handle Problem Language Result Execution time Memory
495005 2021-12-17T20:21:13 Z gozonite Sails (IOI07_sails) C++17
90 / 100
1000 ms 3648 KB
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>
#include <climits>
#include <cstdlib>
#include <cstdio>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <bitset>
#include <deque>
#include <queue>
#include <tuple>
#include <cmath>
#include <cctype>
#include <stack>
#include <cassert>
using namespace std;
using ll = long long;

int N;
pair<int, int> inp[100001];
int bit[100002]={};
set<int> pos; // where all the jumps in flags are located

void add(int k, int x) {
    while (k <= 1e5) {
        bit[k] += x;
        k += k&-k;
    }
}

void inc(int a, int b, int amt) {
    add(a, amt); add(b+1, -amt);
}

int sum(int k) {
    int s = 0;
    while (k >= 1) {
        s += bit[k];
        k -= k&-k;
    }
    return s;
}

int get(int k) {
    return sum(k);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N;
    pos.insert(1);
    for (int i = 1; i <= N; i++) cin >> inp[i].first >> inp[i].second;
    sort(inp+1, inp+1+N);
    // idx = 1
    inc(1, inp[1].second, 1);
    pos.insert(inp[1].second+1);
    //cout << "pos, bit" << endl;
    //for (auto pp : pos) cout << pp << " "; cout << endl;
    //for (int i = 1; i <= 20; i++) cout << get(i) << " "; cout << endl;
    for (int i = 2; i <= N; i++) {
        int h = inp[i].first, k = inp[i].second;
        int b = h-k+1;
        inc(b, h, 1);
        if (get(h) == 1) pos.insert(h+1);
        if (h-k+1 > 1) {
            if (pos.find(b) != pos.end()) {
                if (get(b)==get(h-k)) pos.erase(b);
            } else {
                auto it = pos.upper_bound(b);
                int ed = *it;
                --it;
                int fp = *it;
                int size = ed-b;
                inc(b, ed-1, -1); inc(fp, fp+size-1, 1);
                if (get(ed) == get(ed-1)) pos.erase(ed);
                if (fp != 1 && get(fp) == get(fp-1)) pos.erase(fp);
                pos.insert(fp+size); // only if new position
            }
        }

        //cout << "debugging pos,bit" << endl;
        //for (auto pp : pos) cout << pp << " "; cout << endl;
        //for (int i = 1; i <= 20; i++) cout << get(i) << " "; cout << endl;
    }

    ll ans = 0;
    for (int i = 1; i <= 1e5; i++) {
        ll s = get(i);
        ans += s*(s-1LL)/2LL;
    }
    cout << ans << endl;

    return 0;
}

/*

11
3 2
5 3
4 1
2 1
4 3
3 2
6 6
6 6
7 1
7 2
8 2

*/
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 2 ms 332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 2 ms 332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 332 KB Output is correct
2 Correct 2 ms 588 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 8 ms 608 KB Output is correct
2 Correct 16 ms 564 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 20 ms 1996 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 41 ms 1356 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 39 ms 1476 KB Output is correct
2 Execution timed out 1086 ms 1924 KB Time limit exceeded
# Verdict Execution time Memory Grader output
1 Correct 52 ms 3648 KB Output is correct
2 Correct 36 ms 1348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 73 ms 2284 KB Output is correct
2 Correct 37 ms 1204 KB Output is correct