답안 #998637

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
998637 2024-06-14T11:54:36 Z VMaksimoski008 Examination (JOI19_examination) C++17
41 / 100
402 ms 31692 KB
#include <bits/stdc++.h>

#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
//#define int long long

using namespace std;

using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

const int mod = 1e9 + 7;
const int LOG = 20;
const int maxn = 1e5 + 5;
const double eps = 1e-9;

// Query/Update: O(Nlog^2N)
// Memory: O(NlogN)
struct BIT_2D_Offline {
	int n;
	vector<vector<int> > tree, vals;

	BIT_2D_Offline(int n, vector<pii> &U) : n(n), vals(n+1), tree(n+1) {
		sort(U.begin(), U.end(), [&](pii &a, pii &b) { return a.second < b.second; });
		for(int i=1; i<=n; i++) vals[i].push_back( -1 );

		for(auto &[x, y]: U)
			for(; x<=n; x+=x&-x)
				if(vals[x].back() != y) vals[x].push_back(y);

		for(int i=1; i<=n; i++) tree[i].resize( vals[i].size() );
	}

	int getId(int i, int v) {
		return upper_bound( vals[i].begin(), vals[i].end(), v ) - vals[i].begin() - 1;
	}

	void update(int x, int y, int v) {
		for(; x<=n; x+=x&-x)
			for(int p=getId(x, y); p<tree[x].size(); p+=p&-p) tree[x][p] += v;
	}

	int Q(int x, int y) {
		if(x <= 0 || y <= 0) return 0;
		int ans = 0;
		for(; x; x-=x&-x)
			for(int p=getId(x, y); p; p-=p&-p) ans += tree[x][p];
		return ans;
	}

	int query(int x1, int y1, int x2, int y2) {
		if(x1 > x2 || y1 > y2) return 0;
		return Q(x2, y2) - Q(x1-1, y2) - Q(x2, y1-1) + Q(x1-1, y1-1);
	}
};

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

    int n, q;
    cin >> n >> q;

    vector<pii> v(n);
    set<int> s; s.insert(0);

    for(pii &x : v) {
        cin >> x.first >> x.second;
        x.first++, x.second++;
        s.insert(x.first);
        s.insert(x.second);
    }

    vector<array<int, 4> > qus(q);
    for(int i=0; i<q; i++) {
        cin >> qus[i][0] >> qus[i][1] >> qus[i][2];
        qus[i][0]++; qus[i][1]++; qus[i][2] += 2;
        qus[i][3] = i;
        s.insert(qus[i][0]);
        s.insert(qus[i][1]);
        s.insert(qus[i][2]);
    }

    vector<int> comp(all(s));
    vector<pii> U;
    for(auto &x : v) U.push_back(x);

    BIT_2D_Offline bit(maxn, U);

    sort(qus.begin(), qus.end(), [&](array<int, 4> &a, array<int, 4> &b) {
        return a[2] > b[2];
    });

    sort(v.begin(), v.end(), [&](pii &a, pii &b) {
        return a.first + a.second > b.first + b.second;
    });

    vector<int> ans(q);

    int j=-1;
    for(auto &qu : qus) {
        while(j+1 < n && v[j+1].first + v[j+1].second >= qu[2]) {
            j++;
            bit.update(v[j].first, v[j].second, 1);
        }

        ans[qu[3]] = bit.query(qu[0], qu[1], maxn-1, maxn-1);
    }

    for(int &x : ans) cout << x << '\n';
    return 0;
}

Compilation message

examination.cpp: In constructor 'BIT_2D_Offline::BIT_2D_Offline(int, std::vector<std::pair<int, int> >&)':
examination.cpp:25:29: warning: 'BIT_2D_Offline::vals' will be initialized after [-Wreorder]
   25 |  vector<vector<int> > tree, vals;
      |                             ^~~~
examination.cpp:25:23: warning:   'std::vector<std::vector<int> > BIT_2D_Offline::tree' [-Wreorder]
   25 |  vector<vector<int> > tree, vals;
      |                       ^~~~
examination.cpp:27:2: warning:   when initialized here [-Wreorder]
   27 |  BIT_2D_Offline(int n, vector<pii> &U) : n(n), vals(n+1), tree(n+1) {
      |  ^~~~~~~~~~~~~~
examination.cpp: In member function 'void BIT_2D_Offline::update(int, int, int)':
examination.cpp:44:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |    for(int p=getId(x, y); p<tree[x].size(); p+=p&-p) tree[x][p] += v;
      |                           ~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 11356 KB Output is correct
2 Correct 12 ms 11264 KB Output is correct
3 Correct 9 ms 11356 KB Output is correct
4 Incorrect 10 ms 11424 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 336 ms 26696 KB Output is correct
2 Correct 343 ms 26700 KB Output is correct
3 Correct 333 ms 26572 KB Output is correct
4 Correct 160 ms 20676 KB Output is correct
5 Correct 224 ms 28136 KB Output is correct
6 Correct 71 ms 15308 KB Output is correct
7 Correct 332 ms 26564 KB Output is correct
8 Correct 315 ms 26568 KB Output is correct
9 Correct 278 ms 26056 KB Output is correct
10 Correct 195 ms 28104 KB Output is correct
11 Correct 125 ms 19652 KB Output is correct
12 Correct 54 ms 15056 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 336 ms 26696 KB Output is correct
2 Correct 343 ms 26700 KB Output is correct
3 Correct 333 ms 26572 KB Output is correct
4 Correct 160 ms 20676 KB Output is correct
5 Correct 224 ms 28136 KB Output is correct
6 Correct 71 ms 15308 KB Output is correct
7 Correct 332 ms 26564 KB Output is correct
8 Correct 315 ms 26568 KB Output is correct
9 Correct 278 ms 26056 KB Output is correct
10 Correct 195 ms 28104 KB Output is correct
11 Correct 125 ms 19652 KB Output is correct
12 Correct 54 ms 15056 KB Output is correct
13 Correct 402 ms 28620 KB Output is correct
14 Correct 366 ms 29636 KB Output is correct
15 Correct 358 ms 29128 KB Output is correct
16 Correct 182 ms 23236 KB Output is correct
17 Correct 229 ms 30868 KB Output is correct
18 Correct 73 ms 16336 KB Output is correct
19 Correct 376 ms 31692 KB Output is correct
20 Correct 378 ms 30664 KB Output is correct
21 Correct 363 ms 31460 KB Output is correct
22 Correct 196 ms 29892 KB Output is correct
23 Correct 135 ms 21448 KB Output is correct
24 Correct 54 ms 15948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 11356 KB Output is correct
2 Correct 12 ms 11264 KB Output is correct
3 Correct 9 ms 11356 KB Output is correct
4 Incorrect 10 ms 11424 KB Output isn't correct
5 Halted 0 ms 0 KB -