답안 #803740

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
803740 2023-08-03T05:45:01 Z 이동현(#10103) Vera and Modern Art (CCO17_art) C++17
0 / 25
4000 ms 6072 KB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
using namespace std;

struct Data{
    long long x, y;
    int sum;
    Data(long long x, long long y, int sum):x(x), y(y), sum(sum){}
    bool operator<(const Data&r)const{
        return x < r.x || (x == r.x && y < r.y);
    }
};
vector<Data> srt[70][70];

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

    auto len = [&](long long x){
        return 64 - __builtin_clzll(x);
    };

    register int i, j;

    mt19937 gen(23523);
    uniform_int_distribution<long long> uid(1, (long long)1e18);

    int n, q;
    cin >> n >> q;
    // n = q = 200000;
    for(i = 0; i < n; ++i){
        long long x, y;
        int v;
        cin >> x >> y >> v;
        // x = uid(gen), y = uid(gen), v = uid(gen);
        srt[len(x) - 1][len(y) - 1].push_back({x, y, v});
    }

    for(i = 0; i < 70; ++i){
        for(j = 0; j < 70; ++j){
            sort(srt[i][j].begin(), srt[i][j].end());
            for(int k = 1; k < (int)srt[i][j].size(); ++k){
                srt[i][j][k].sum += srt[i][j][k - 1].sum;
            }
        }
    }

    register long long px, py;
    register int p1, p2;
    long long x, y;
    int ans;
    int lx, ly, yv;

    for(int rep = 0; rep < q; ++rep){
        cin >> x >> y;
        yv = y;
        lx = len(x) - 1, ly = len(y) - 1;
        ans = 0;
        for(i = lx; i >= 0; --i){
            y = yv;
            for(j = ly; j >= 0; --j){
                if(y >= (1 << (j + 1))) y -= 1 << j;
                if(y >= (1 << (j + 1))) y -= 1 << j;
                if(y >= (1 << (j + 1))) y -= 1 << j;

                if(!(int)srt[i][j].size()) continue;
                px = x % (1ll << i) + (1ll << i);
                py = y % (1ll << j) + (1ll << j);

                p1 = lower_bound(srt[i][j].begin(), srt[i][j].end(), Data(px, py, -1)) - srt[i][j].begin();
                p2 = lower_bound(srt[i][j].begin(), srt[i][j].end(), Data(px, py + 1, -1)) - srt[i][j].begin() - 1;
                if(p1 <= p2){
                    ans += srt[i][j][p2].sum;
                    if(p1) ans -= srt[i][j][p1 - 1].sum;
                }
            }

            if(x >= (1 << (i + 1))) x -= 1 << i;
            if(x >= (1 << (i + 1))) x -= 1 << i;
            if(x >= (1 << (i + 1))) x -= 1 << i;
        }

        cout << ans << '\n';
    }
    
    return 0;
}

Compilation message

Main.cpp: In function 'int main()':
Main.cpp:25:18: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
   25 |     register int i, j;
      |                  ^
Main.cpp:25:21: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
   25 |     register int i, j;
      |                     ^
Main.cpp:50:24: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
   50 |     register long long px, py;
      |                        ^~
Main.cpp:50:28: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
   50 |     register long long px, py;
      |                            ^~
Main.cpp:51:18: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
   51 |     register int p1, p2;
      |                  ^~
Main.cpp:51:22: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
   51 |     register int p1, p2;
      |                      ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Incorrect 19 ms 468 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2087 ms 6072 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 441 ms 3616 KB Output is correct
3 Correct 423 ms 3664 KB Output is correct
4 Execution timed out 4074 ms 3916 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Incorrect 19 ms 468 KB Output isn't correct
3 Halted 0 ms 0 KB -