답안 #777180

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
777180 2023-07-08T18:46:55 Z tvladm2009 Examination (JOI19_examination) C++17
2 / 100
3000 ms 41912 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = (int) 5e5 + 7;
const int B = 317;
int x[N], y[N], oldx[N], oldy[N], sum[N];
int n, q;

struct Query {
  int a;
  int b;
  int c;
  int id;
};

bool operator < (const Query &a, const Query &b) {
  return a.a / B < b.a / B || (a.a / B == b.a / B && a.b < b.b);
}

Query queries[N];
int sol[N];

vector<int> inds[2][N];
bool inside[N];
int aib[N], total = 0;

void update(int x, int val) {
  for (int i = x; i < N; i += i & -i) {
    aib[i] += val;
  }
}

int query(int x) {
  int ret = 0;
  for (int i = x; i >= 1; i -= i & -i) {
    ret += aib[i];
  }
  return ret;
}

void contract(int a, bool where) {
  for (auto &it : inds[where][a]) {
    if (inside[it] == false) {
      continue;
    }
    update(sum[it], -1);
    inside[it] = false;
    total--;
  }
}

void expand(int a, bool where, int least) {
  for (auto &it : inds[where][a]) {
    if (inside[it] == true) {
      continue;
    }
    int cur = (where == 0 ? y[it] : x[it]);
    if (cur >= least) {
      update(sum[it], +1);
      inside[it] = true;
      total++;
    }
  }
}

void Mo() {
  int a = N - 1, b = N - 1;
  for (int i = 1; i <= q; i++) {
    int qa = queries[i].a;
    int qb = queries[i].b;
    while (a > qa) {
      a--;
      expand(a, 0, b);
    }
    while (b > qb) {
      b--;
      expand(b, 1, a);
    }
    while (a < qa) {
      contract(a, 0);
      a++;
    }
    while (b < qb) {
      contract(b, 1);
      b++;
    }
    sol[queries[i].id] = total - query(queries[i].c - 1);
  }
}

signed main() {
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

  // freopen("input", "r", stdin);

  cin >> n >> q;
  for (int i = 1; i <= n; i++) {
    cin >> x[i] >> y[i];
  }
  for (int i = 1; i <= q; i++) {
    cin >> queries[i].a >> queries[i].b >> queries[i].c;
    queries[i].id = i;
  }
  sort(queries + 1, queries + q + 1);
  Query bef = queries[1];
  { /// normalizare
    vector<int> vals;
    map<int, int> mp;
    for (int i = 1; i <= n; i++) {
      vals.push_back(x[i] + y[i]);
    }
    for (int i = 1; i <= q; i++) {
      vals.push_back(queries[i].c);
    }
    sort(vals.begin(), vals.end());
    int cnt = 0;
    for (auto &i : vals) {
      if (mp[i] == 0) {
        mp[i] = ++cnt;
      }
    }
    for (int i = 1; i <= n; i++) {
      sum[i] = mp[x[i] + y[i]];
    }
    for (int i = 1; i <= q; i++) {
      queries[i].c = mp[queries[i].c];
    }

    vals.clear();
    mp.clear();
    for (int i = 1; i <= n; i++) {
      vals.push_back(x[i]);
      vals.push_back(y[i]);
    }
    for (int i = 1; i <= q; i++) {
      vals.push_back(queries[i].a);
      vals.push_back(queries[i].b);
    }
    sort(vals.begin(), vals.end());
    cnt = 0;
    for (auto &i : vals) {
      if (mp[i] == 0) {
        mp[i] = ++cnt;
      }
    }
    for (int i = 1; i <= n; i++) {
      oldx[i] = x[i];
      oldy[i] = y[i];
      x[i] = mp[x[i]];
      y[i] = mp[y[i]];
    }
    for (int i = 1; i <= q; i++) {
      queries[i].a = mp[queries[i].a];
      queries[i].b = mp[queries[i].b];
    }
    for (int i = 1; i <= n; i++) {
      inds[0][x[i]].push_back(i);
      inds[1][y[i]].push_back(i);
    }
  }
  Mo();
  sol[queries[1].id] = 0;
  for (int i = 1; i <= n; i++) {
    if (oldx[i] >= bef.a && oldy[i] >= bef.b && oldx[i] + oldy[i] >= bef.c) {
      sol[queries[1].id]++;
    }
  }
  for (int i = 1; i <= q; i++) {
    cout << sol[i] << "\n";
  }
  return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 23896 KB Output is correct
2 Correct 16 ms 23892 KB Output is correct
3 Correct 15 ms 23816 KB Output is correct
4 Correct 16 ms 23816 KB Output is correct
5 Correct 16 ms 23820 KB Output is correct
6 Correct 15 ms 23892 KB Output is correct
7 Correct 131 ms 25000 KB Output is correct
8 Correct 124 ms 24992 KB Output is correct
9 Correct 127 ms 24996 KB Output is correct
10 Correct 57 ms 24620 KB Output is correct
11 Correct 60 ms 24612 KB Output is correct
12 Correct 74 ms 24148 KB Output is correct
13 Correct 127 ms 24916 KB Output is correct
14 Correct 127 ms 24964 KB Output is correct
15 Correct 128 ms 24904 KB Output is correct
16 Correct 83 ms 24468 KB Output is correct
17 Correct 79 ms 24480 KB Output is correct
18 Correct 53 ms 24176 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2657 ms 40332 KB Output is correct
2 Correct 2615 ms 41912 KB Output is correct
3 Correct 2623 ms 41824 KB Output is correct
4 Correct 1136 ms 39048 KB Output is correct
5 Execution timed out 3076 ms 38568 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2657 ms 40332 KB Output is correct
2 Correct 2615 ms 41912 KB Output is correct
3 Correct 2623 ms 41824 KB Output is correct
4 Correct 1136 ms 39048 KB Output is correct
5 Execution timed out 3076 ms 38568 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 23896 KB Output is correct
2 Correct 16 ms 23892 KB Output is correct
3 Correct 15 ms 23816 KB Output is correct
4 Correct 16 ms 23816 KB Output is correct
5 Correct 16 ms 23820 KB Output is correct
6 Correct 15 ms 23892 KB Output is correct
7 Correct 131 ms 25000 KB Output is correct
8 Correct 124 ms 24992 KB Output is correct
9 Correct 127 ms 24996 KB Output is correct
10 Correct 57 ms 24620 KB Output is correct
11 Correct 60 ms 24612 KB Output is correct
12 Correct 74 ms 24148 KB Output is correct
13 Correct 127 ms 24916 KB Output is correct
14 Correct 127 ms 24964 KB Output is correct
15 Correct 128 ms 24904 KB Output is correct
16 Correct 83 ms 24468 KB Output is correct
17 Correct 79 ms 24480 KB Output is correct
18 Correct 53 ms 24176 KB Output is correct
19 Correct 2657 ms 40332 KB Output is correct
20 Correct 2615 ms 41912 KB Output is correct
21 Correct 2623 ms 41824 KB Output is correct
22 Correct 1136 ms 39048 KB Output is correct
23 Execution timed out 3076 ms 38568 KB Time limit exceeded
24 Halted 0 ms 0 KB -