답안 #1108983

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1108983 2024-11-05T18:21:50 Z Kerim 모자이크 (IOI24_mosaic) C++17
48 / 100
722 ms 98616 KB
#include "bits/stdc++.h"
#define ll long long
#define pb push_back
#define pii pair<int, int>
using namespace std;
const int N = 4e5+5;
int cnt[N], arcalyk[4][N];
const int M = 5005;
int dp[M][M];
int wow(int a, int b){
    return (!(a|b)?1:0);
}

vector<ll> mosaic(vector<int> X, vector<int> Y, vector<int> T, vector<int> B, vector<int> L, vector<int> R){
    int n = (int)X.size();
    assert(X.front()==Y.front());
    if (n <= 5000){
        for (int i = 0; i < n; i++)
            dp[1][i+1] = X[i];
        for (int i = 0; i < n; i++)
            dp[i+1][1] = Y[i];
        for (int i = 2; i <= n; i++)
            for (int j = 2; j <= n; j++)
                dp[i][j] = wow(dp[i-1][j], dp[i][j-1]);
        for (int i = 2; i <= n; i++)
            for (int j = 2; j <= n; j++)
                dp[i][j] += dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1];
        vector<ll> ans;
        for(int i = 0; i < (int)L.size(); ++i){
            int x = T[i]+1, y = L[i]+1, yy = R[i]+1, xx = B[i]+1;
            ans.push_back(dp[xx][yy] - dp[x-1][yy] - dp[xx][y-1] + dp[x-1][y-1]);
        }
        return ans;
    }
    map<pii, int> mp;
    for(int i = 1; i <= n; ++i)
        mp[{1, i}] = X[i-1], mp[{i, 1}] = Y[i-1];
    for(int i = 2; i <= n; ++i)
        for(int j = 2; j <= 3; ++j)
            mp[{i, j}] = wow(mp[{i-1, j}], mp[{i, j-1}]);
    for(int i = 2; i <= 3; ++i)
        for(int j = 2; j <= n; ++j)
            mp[{i, j}] = wow(mp[{i-1, j}], mp[{i, j-1}]);
    // int ii = 3;
    // for(int jj = 3; jj <= n; ++jj)
    //     cnt[ii-jj+n] = mp[{ii, jj}];
    for (auto [key, value]: mp)
        cnt[key.first-key.second+n] = value;
    for (int i = 1; i <= 3; i++)
        for (int j = 1; j <= n; j++)
            arcalyk[i][j] = mp[{i,j}] + arcalyk[i][j-1];
    for (int i = 1; i < n+n; i++)
        cnt[i] += cnt[i-1];
    vector<ll> ans;
    for(int i = 0; i < (int)L.size(); ++i){
        int x = T[i]+1, y = L[i]+1, yy = R[i]+1;
        if (x <= 3){
            ans.pb(arcalyk[x][yy]-arcalyk[x][y-1]);
            continue;
        }
        int res = 0;
        while (y <= 3 and y <= yy)
            res += mp[{x, y}], y += 1;
        if (y <= yy){
            int a = x-y+n, b = x-yy+n;
            res += cnt[a] - cnt[b-1];
        }
        ans.pb(res);
    }
    return ans;
}

// int main(){
//     int n;
//     scanf("%d", &n);
//     vector<int> X, Y;
//     for(int i = 1; i <= n; ++i){
//         int x;
//         scanf("%d", &x);
//         X.pb(x);
//     }
//     for(int i = 1; i <= n; ++i){
//         int x;
//         scanf("%d", &x);
//         Y.pb(x);
//     }
//     int q;
//     scanf("%d", &q);
//     vector<int> T, B, L, R;
//     while(q--){
//         int a, b, c, d;
//         scanf("%d%d%d%d", &a, &b, &c, &d);
//         T.pb(a), B.pb(b), L.pb(c), R.pb(d);
//     }
//     vector<ll> ans = mosaic(X, Y, T, B, L, R);
//     for(ll i : ans)
//         printf("%lld ", i);
//     puts("");
//     return 0;
// }
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 336 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Incorrect 1 ms 336 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Incorrect 1 ms 336 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 685 ms 92812 KB Output is correct
2 Correct 671 ms 92860 KB Output is correct
3 Correct 714 ms 92860 KB Output is correct
4 Correct 662 ms 92860 KB Output is correct
5 Correct 336 ms 52048 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Incorrect 1 ms 336 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 11964 KB Output is correct
2 Incorrect 696 ms 98616 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 710 ms 92756 KB Output is correct
2 Correct 722 ms 92752 KB Output is correct
3 Correct 686 ms 92860 KB Output is correct
4 Correct 695 ms 92688 KB Output is correct
5 Correct 678 ms 92860 KB Output is correct
6 Correct 366 ms 52176 KB Output is correct
7 Correct 207 ms 34612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 685 ms 92812 KB Output is correct
2 Correct 671 ms 92860 KB Output is correct
3 Correct 714 ms 92860 KB Output is correct
4 Correct 662 ms 92860 KB Output is correct
5 Correct 336 ms 52048 KB Output is correct
6 Correct 710 ms 92756 KB Output is correct
7 Correct 722 ms 92752 KB Output is correct
8 Correct 686 ms 92860 KB Output is correct
9 Correct 695 ms 92688 KB Output is correct
10 Correct 678 ms 92860 KB Output is correct
11 Correct 366 ms 52176 KB Output is correct
12 Correct 207 ms 34612 KB Output is correct
13 Correct 690 ms 92896 KB Output is correct
14 Correct 675 ms 92720 KB Output is correct
15 Correct 681 ms 92860 KB Output is correct
16 Correct 687 ms 92860 KB Output is correct
17 Correct 696 ms 93092 KB Output is correct
18 Correct 654 ms 92804 KB Output is correct
19 Correct 282 ms 42968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 336 KB Output isn't correct
2 Halted 0 ms 0 KB -