제출 #1283431

#제출 시각아이디문제언어결과실행 시간메모리
1283431MMihalev모자이크 (IOI24_mosaic)C++20
100 / 100
102 ms36408 KiB
#include<iostream>
#include<algorithm>
#include<vector>
#include "mosaic.h"
using namespace std;
const int MAX_N=2e5+5;
int n,q;
vector<long long>ans;
int a1[3][MAX_N];
int a2[MAX_N][3];
int p0[MAX_N];
int p1[MAX_N];
int pc0[MAX_N];
int pc1[MAX_N];
int id(int x,int y)//min(x,y)>=2
{
    int raz=min(x-2,y-2);
    x-=raz;y-=raz;
    if(x==2)
    {
        return n-2+y-2;
    }
    return n-x;
}
int a[2*MAX_N];
int reva[2*MAX_N];
long long p[2*MAX_N];
long long posp[2*MAX_N];
long long revp[2*MAX_N];
long long revposp[2*MAX_N];
long long query(long long l,long long r)
{
    if(l>r)return 0;

    long long sum=posp[r]-posp[l-1]-(l-1)*(p[r]-p[l-1]);
    return sum;
}
long long revquery(long long l,long long r)
{
    if(l>r)return 0;
    long long ll=2*n-5-(r-1);
    long long rr=2*n-5-(l-1);
    l=ll;
    r=rr;
    long long sum=revposp[r]-revposp[l-1]-(l-1)*(revp[r]-revp[l-1]);
    return sum;
}
std::vector<long long> mosaic(std::vector<int> X, std::vector<int> Y,std::vector<int> T, std::vector<int> D,std::vector<int> L, std::vector<int> R)
{
    n=X.size();
    q=T.size();
    ans.clear();
    ans.resize(q);

    for(int i=0;i<n;i++)
    {
        a1[0][i]=X[i];
    }
    for(int i=0;i<n;i++)
    {
        a2[i][0]=Y[i];
    }

    a1[1][0]=a2[1][0];
    for(int i=1;i<n;i++)
    {
        a1[1][i]=(a1[1][i-1]+a1[0][i]==0 ? 1 : 0);
    }
    a2[0][1]=a1[0][1];
    for(int i=1;i<n;i++)
    {
        a2[i][1]=(a2[i-1][1]+a2[i][0]==0 ? 1 : 0);
    }

    a1[2][0]=a2[2][0];a1[2][1]=a2[2][1];
    for(int i=2;i<n;i++)
    {
        a1[2][i]=(a1[2][i-1]+a1[1][i]==0 ? 1 : 0);
    }
    a2[0][2]=a1[0][2];a2[1][2]=a1[1][2];
    for(int i=2;i<n;i++)
    {
        a2[i][2]=(a2[i-1][2]+a2[i][1]==0 ? 1 : 0);
    }

    for(int i=2;i<n;i++)
    {
        a[id(2,i)]=a1[2][i];
        a[id(i,2)]=a2[i][2];
    }

    for(long long i=1;i<=2*n-5;i++)
    {
        reva[i]=a[2*n-5-(i-1)];

        p[i]=p[i-1]+a[i];
        posp[i]=posp[i-1]+i*a[i];
    }
    for(long long i=1;i<=2*n-5;i++)
    {
        revp[i]=revp[i-1]+reva[i];
        revposp[i]=revposp[i-1]+i*reva[i];
    }

    for(int i=1;i<=n;i++)
    {
        p0[i]=p0[i-1]+a1[0][i-1];
        p1[i]=p1[i-1]+a1[1][i-1];

        pc0[i]=pc0[i-1]+a2[i-1][0];
        pc1[i]=pc1[i-1]+a2[i-1][1];
    }

    for(int i=1;i<=q;i++)
    {
        if(D[i-1]<2)
        {
            if(T[i-1]==0 && D[i-1]==1)
            {
                ans[i-1]=p0[R[i-1]+1]-p0[L[i-1]]+
                         p1[R[i-1]+1]-p1[L[i-1]];
            }
            else if(T[i-1]==0 && D[i-1]==0)
            {
                ans[i-1]=p0[R[i-1]+1]-p0[L[i-1]];
            }
            else
            {
                ans[i-1]=p1[R[i-1]+1]-p1[L[i-1]];
            }
            continue;
        }
        if(R[i-1]<2)
        {
            if(L[i-1]==0 && R[i-1]==1)
            {
                ans[i-1]=pc0[D[i-1]+1]-pc0[T[i-1]]+
                         pc1[D[i-1]+1]-pc1[T[i-1]];
            }
            else if(L[i-1]==0 && R[i-1]==0)
            {
                ans[i-1]=pc0[D[i-1]+1]-pc0[T[i-1]];
            }
            else ans[i-1]=pc1[D[i-1]+1]-pc1[T[i-1]];
            continue;
        }

        while(T[i-1]<2)
        {
            if(T[i-1]==0)
            {
                ans[i-1]+=p0[R[i-1]+1]-p0[L[i-1]];
            }
            else ans[i-1]+=p1[R[i-1]+1]-p1[L[i-1]];
            T[i-1]++;
        }

        while(L[i-1]<2)
        {
            if(L[i-1]==0)
            {
                ans[i-1]+=pc0[D[i-1]+1]-pc0[T[i-1]];
            }
            else ans[i-1]+=pc1[D[i-1]+1]-pc1[T[i-1]];
            L[i-1]++;
        }

        int l2=id(T[i-1],L[i-1]),r2=id(T[i-1],R[i-1]);
        int l1=id(D[i-1],L[i-1]),r1=id(D[i-1],R[i-1]);

        int intervals=r2-r1+1;
        int len=r2-l2+1;
        long long mid;
        if(intervals>=len)
        {
            mid=len;
        }
        else mid=intervals;

        ans[i-1]+=query(l1,l1+mid-2)+revquery(r2-mid+2,r2)+mid*(p[r2-mid+1]-p[l1+mid-2]);
    }

    return ans;
}
#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...