답안 #777099

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
777099 2023-07-08T16:31:24 Z tvladm2009 Examination (JOI19_examination) C++17
0 / 100
3000 ms 40468 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], 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) {
  for (auto &it : inds[where][a]) {
    if (inside[it] == true) {
      continue;
    }
    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);
    }
    while (b > qb) {
      b--;
      expand(b, 1);
    }
    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);
  { /// 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++) {
      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();
  for (int i = 1; i <= q; i++) {
    cout << sol[i] << "\n";
  }
  return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 15 ms 23892 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3074 ms 40468 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3074 ms 40468 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 15 ms 23892 KB Output isn't correct
2 Halted 0 ms 0 KB -