Submission #1160074

#TimeUsernameProblemLanguageResultExecution timeMemory
1160074AndreyMosaic (IOI24_mosaic)C++20
100 / 100
97 ms34888 KiB
#include "mosaic.h"
#include<bits/stdc++.h>
#include <vector>
using namespace std;

vector<long long> wow(500001);
vector<long long> wut(500001);
long long pr1[4][200001];
long long pr2[200001][4];

long long calc(long long l, long long r, long long d) {
    long long ans = 0;
    ans+=wut[l+d-1]-wut[l-1];
    ans-=(wow[l+d-1]-wow[l-1])*(l-1);
    ans-=wut[r]-wut[r-d];
    ans+=(wow[r]-wow[r-d])*(r+1);
    ans+=(wow[r-d]-wow[l+d-1])*d;
    return ans;
}

std::vector<long long> mosaic(std::vector<int> x, std::vector<int> y,
                              std::vector<int> t, std::vector<int> B,
                              std::vector<int> l, std::vector<int> r) {
    long long n = x.size();
    long long q = t.size();
    for(long long i = 0; i < 4; i++) {
        for(long long j = 0; j < n+1; j++) {
            pr1[i][j] = 0;
            pr2[j][i] = 0;
        }
    }
    for(long long i = 1; i <= n; i++) {
        pr1[1][i] = x[i-1];
        if(i <= 3) {
            pr2[1][i] = x[i-1];
        }
        pr2[i][1] = y[i-1];
        if(i <= 3) {
            pr1[i][1] = y[i-1];
        }
    }
    for(long long i = 2; i <= 3; i++) {
        for(long long j = 2; j <= n; j++) {
            if(pr1[i][j-1] == 0 && pr1[i-1][j] == 0) {
                pr1[i][j] = 1;
            }
            if(pr2[j-1][i] == 0 && pr2[j][i-1] == 0) {
                pr2[j][i] = 1;
            }
        }
    }
    vector<long long> troll(2*n+1);
    for(long long i = 3; i <= n; i++) {
        troll[3-i+n] = pr1[3][i];
        troll[i-3+n] = pr2[i][3];
    }
    for(long long i = 1; i <= 2*n; i++) {
        wow[i] = wow[i-1]+troll[i];
        wut[i]+=wut[i-1]+troll[i]*i;
    }
    for(long long i = 1; i <= 3; i++) {
        for(long long j = 1; j <= n; j++) {
            pr1[i][j]+=pr1[i-1][j]+pr1[i][j-1]-pr1[i-1][j-1];
            pr2[j][i]+=pr2[j-1][i]+pr2[j][i-1]-pr2[j-1][i-1];
        }
    }
    vector<long long> answer(q);
    for(long long i = 0; i < q; i++) {
        long long a = t[i]+1,b = B[i]+1,c = l[i]+1,d = r[i]+1;
        long long ans = 0;
        if(a <= 2) {
            long long x = min(2LL,b);
            ans+=pr1[x][d]-pr1[a-1][d]-pr1[x][c-1]+pr1[a-1][c-1];
            a = x+1;
        }
        if(c <= 2 && a <= b) {
            long long x = min(2LL,d);
            ans+=pr2[b][x]-pr2[a-1][x]-pr2[b][c-1]+pr2[a-1][c-1];
            c = x+1;
        }
        if(a <= b && c <= d) {
            ans+=calc(a-d+n,b-c+n,min(b-a+1,d-c+1));
        }
        answer[i] = ans;
    }
    return answer;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...