Submission #1361434

#TimeUsernameProblemLanguageResultExecution timeMemory
1361434coderg300711Mosaic (IOI24_mosaic)C++20
78 / 100
209 ms302272 KiB
#include "bits/stdc++.h"
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
#define pll pair<long long,long long>
#define yes cout<<"Yes\n"
#define no cout<<"No\n"
#define pb push_back
#define sz(x) (int)(x).size()
#define rsz resize
#define ass assign
#define F(i,l,r) for(int i=(l);i<(r);++i)
typedef long long ll;
typedef unsigned long long ull;
typedef long double lld;
template<typename T> using pqg = priority_queue<T, vector<T>, greater<T>>;
#define each(a,x) for(auto a:x)
#define FOR(i,a) for(int i=0;i<(a);i++)
#define ROF(i,a,b) for(int i=(b)-1;i>=(a);i--)
#define eb emplace_back
#define ft front()
#define V vector

#include "mosaic.h"

struct PrefSum{
    V<ll> p;
    PrefSum(){}
    PrefSum(const V<int>& a){
        int n=sz(a);
        p.ass(n+1,0);
        FOR(i,n)p[i+1]=p[i]+a[i];
    }
    ll query(int l,int r){
        if(l>r)return 0;
        return p[r+1]-p[l];
    }
};

V<ll> mosaic(V<int> X,V<int> Y,V<int> T,V<int> B,V<int> L,V<int> R){
int n=sz(X),q=sz(T);
V<ll> res(q);
if(n<=5000){
    V<V<int>> grid(n,V<int>(n));
    FOR(i,n)grid[0][i]=X[i];
    FOR(i,n)grid[i][0]=Y[i];
    F(i,1,n){
        F(j,1,n)grid[i][j]=(!grid[i-1][j] && !grid[i][j-1]);
    }
    V<V<ll>> ps(n+1,V<ll>(n+1,0));
    F(i,1,n+1){
        F(j,1,n+1)ps[i][j]=grid[i-1][j-1]+ps[i-1][j]+ps[i][j-1]-ps[i-1][j-1];
    }
    FOR(k,q)res[k]=ps[B[k]+1][R[k]+1]-ps[T[k]][R[k]+1]-ps[B[k]+1][L[k]]+ps[T[k]][L[k]];
    return res;
}
bool sub5=1;
FOR(i,n){
    if(X[i]!=0 || Y[i]!=0){
        sub5=0;
        break;
    }
}
if(sub5){
    FOR(k,q){
        ll t=max(1,T[k]),b=B[k],l=max(1,L[k]),r=R[k];
        if(t>b || l>r){
            res[k]=0;
            continue;
        }
        ll h=b-t+1,w=r-l+1;
        res[k]=(h*w)/2;
        if((h*w)&1 && (t+l)%2==0)res[k]++;
    }
    return res;
}
V<int> r1(n),r2(n),c1(n),c2(n);
r1[0]=Y[1];
F(j,1,n)r1[j]=(!X[j] && !r1[j-1]);
r2[0]=Y[2];
F(j,1,n)r2[j]=(!r1[j] && !r2[j-1]);
c1[0]=X[1];
F(i,1,n)c1[i]=(!Y[i] && !c1[i-1]);
c2[0]=X[2];
F(i,1,n)c2[i]=(!c1[i] && !c2[i-1]);
PrefSum psr0(X),psr1(r1),psr2(r2),psc1(c1),psc2(c2);
FOR(k,q){
        if(T[k]==B[k]){
        int r=T[k],l=L[k],rr=R[k];
        if(!r)res[k]=psr0.query(l,rr);
        else if(r==1)res[k]=psr1.query(l,rr);
        else{
            ll tot=0;
            if(!l){
                tot+=Y[r];
                l++;
            }
            if(l==1 && l<=rr){
                tot+=c1[r];
                l++;
            }
            if(l<=rr){
                int hi=min(rr,r-1);
                if(l<=hi)tot+=psc2.query(r-hi+2,r-l+2);
                int lo=max(l,r);
                if(lo<=rr)tot+=psr2.query(lo-r+2,rr-r+2);
            }
            res[k]=tot;
        }
    }else res[k]=0;
}
return res;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...