제출 #1187051

#제출 시각아이디문제언어결과실행 시간메모리
1187051Zbyszek99모자이크 (IOI24_mosaic)C++20
12 / 100
96 ms43336 KiB
#include "mosaic.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long
#define ld long double
#define ull unsigned long long
#define ff first
#define ss second
#define pii pair<int,int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vl vector<long long>
#define pb push_back
#define rep(i, b) for(int i = 0; i < (b); ++i)
#define rep2(i,a,b) for(int i = a; i <= (b); ++i)
#define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c)
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define forall(it,x) for(auto& it:(x))
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set;
//mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());}
//ll los(ll a, ll b) {return a + (mt() % (b-a+1));}
const int INF = 1e9+50;
const ll INF_L = 1e18+40;
const ll MOD = 1e9+7;

ll arr1[4][200'001];
ll pref1[4][200'001];
ll arr2[200'001][4];
ll pref2[200'001][4];

ll deg_pref[500'001];
ll deg_pref_plus[500'001];
ll deg_pref_minus[500'001];
const int deg_add = 200'003;

vl mosaic(vi X, vi Y, vi T, vi B, vi L, vi R) 
{
    int n = siz(X);
    rep2(i,1,n) arr1[1][i] = X[i-1];
    rep2(i,1,n) arr2[i][1] = Y[i-1];
    rep2(i,1,min(3,n)) arr1[i][1] = Y[i-1];
    rep2(i,1,min(3,n)) arr2[1][i] = X[i-1];
    rep2(y,2,3) rep2(x,2,n)
    {
        if(arr1[y-1][x] == 0 && arr1[y][x-1] == 0)
        {
            arr1[y][x] = 1;
        }
        else
        {
            arr1[y][x] = 0;
        }
    }
    rep2(x,2,3) rep2(y,2,n) 
    {
        if(arr2[y-1][x] == 0 && arr2[y][x-1] == 0)
        {
            arr2[y][x] = 1;
        }
        else
        {
            arr2[y][x] = 0;
        }
    }
    rep2(y,1,3)
    {
        rep2(x,1,n)
        {
            pref1[y][x] = pref1[y][x-1] + arr1[y][x]; 
        }
    }
    rep2(x,1,3)
    {
        rep2(y,1,n)
        {
            pref2[y][x] = pref2[y][x-1] + arr2[y][x]; 
        }
    }
    rep2(y,3,200'000)
    {
        deg_pref[3-y+deg_add] = arr2[y][3];
        deg_pref_plus[3-y+deg_add] = arr2[y][3] * (3-y+deg_add);
        deg_pref_minus[3-y+deg_add] = arr2[y][3] * (500'000 - (3-y+deg_add));
    }
    rep2(x,3,200'000)
    {
        deg_pref[x-3+deg_add] = arr1[3][x];
        deg_pref_plus[x-3+deg_add] = arr1[3][x] * (x-3+deg_add);
        deg_pref_minus[x-3+deg_add] = arr1[3][x] * (500'000 - (x-3+deg_add));
    }
    rep2(i,1,500'000)
    {
        deg_pref[i] += deg_pref[i-1];
    }
    int q = siz(T);
    vl anses(q);
    rep(qq,q)
    {
        int y1 = T[qq]+1;
        int y2 = B[qq]+1;
        int x1 = L[qq]+1;
        int x2 = R[qq]+1;
        while(y1 <= 3 && y1 <= y2)
        {
            anses[qq] += pref1[y1][x2] - pref1[y1][x1-1];
            y1++;
        }
        if(y1 > y2) continue;
        while(x1 <= 3 && x1 <= x2)
        {
            anses[qq] += pref2[y2][x1] - pref2[y1-1][x1];
            x1++;
        } 
        if(x1 > x2) continue;
        int start_deg = x1-y2+deg_add;
        int end_deg = x2-y1+deg_add;
        if(x2-x1 >= y2-y1)
        {
            anses[qq] += (deg_pref_plus[start_deg + (y2-y1)-1] - deg_pref_plus[start_deg-1]) - (deg_pref[start_deg + (y2-y1)-1] - deg_pref[start_deg-1]) * (start_deg-1);
            start_deg += (y2-y1);
            anses[qq] += (deg_pref_minus[end_deg] - deg_pref_minus[end_deg - (y2-y1)]) - ((deg_pref[end_deg] - deg_pref[end_deg - (y2-y1)])) * (500'000-end_deg-1);
            end_deg -= (y2-y1);
            anses[qq] += (deg_pref[start_deg] - deg_pref[end_deg-1]) * (y2-y1+1);
        }
        else
        {
            anses[qq] += (deg_pref_plus[start_deg + (x2-x1)-1] - deg_pref_plus[start_deg-1]) - (deg_pref[start_deg + (x2-x1)-1] - deg_pref[start_deg-1]) * (start_deg-1);
            start_deg += (x2-x1);
            anses[qq] += (deg_pref_minus[end_deg] - deg_pref_minus[end_deg - (x2-x1)]) - ((deg_pref[end_deg] - deg_pref[end_deg - (x2-x1)])) * (500'000-end_deg-1);
            end_deg -= (x2-x1);
            anses[qq] += (deg_pref[start_deg] - deg_pref[end_deg-1]) * (x2-x1+1);
        }
    }
    return anses;
}  
#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...