Submission #1099955

#TimeUsernameProblemLanguageResultExecution timeMemory
1099955ttamxMosaic (IOI24_mosaic)C++17
100 / 100
278 ms23492 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

vector<ll> mosaic(vector<int> X,vector<int> Y,vector<int> T,vector<int> B,vector<int> L,vector<int> R){
    int n=X.size();
    int q=T.size();
    if(n<3){
        X.resize(3);
        Y.resize(3);
        n=3;
    }
    vector<ll> ans(q);
    vector<int> a(n),b(n),c(n),d(n);
    a[0]=Y[1];
    b[0]=X[1];
    for(int i=1;i<n;i++){
        if(a[i-1]+X[i]==0){
            a[i]=1;
        }
    }
    for(int i=1;i<n;i++){
        if(b[i-1]+Y[i]==0){
            b[i]=1;
        }
    }
    c[1]=b[2];
    d[1]=a[2];
    vector<ll> s;
    for(int i=2;i<n;i++){
        if(c[i-1]+a[i]==0){
            c[i]=1;
            s.emplace_back(2-i);
        }
    }
    for(int i=2;i<n;i++){
        if(d[i-1]+b[i]==0){
            d[i]=1;
            if(i>2){
                s.emplace_back(i-2);
            }
        }
    }
    sort(s.begin(),s.end());
    auto qs=s;
    for(int i=1;i<qs.size();i++){
        qs[i]+=qs[i-1];
    }
    for(int i=1;i<n;i++){
        X[i]+=X[i-1];
        Y[i]+=Y[i-1];
        a[i]+=a[i-1];
        b[i]+=b[i-1];
    }
    for(int i=0;i<q;i++){
        if(T[i]==0){
            ans[i]+=X[R[i]]-(L[i]>0?X[L[i]-1]:0);
            T[i]++;
        }
    }
    for(int i=0;i<q;i++){
        if(T[i]<=B[i]&&L[i]==0){
            ans[i]+=Y[B[i]]-Y[T[i]-1];
            L[i]++;
        }
    }
    for(int i=0;i<q;i++){
        if(T[i]<=B[i]&&L[i]<=R[i]&&T[i]==1){
            ans[i]+=a[R[i]]-a[L[i]-1];
            T[i]++;
        }
    }
    for(int i=0;i<q;i++){
        if(T[i]<=B[i]&&L[i]<=R[i]&&L[i]==1){
            ans[i]+=b[B[i]]-b[T[i]-1];
            L[i]++;
        }
    }
    for(int i=0;i<q;i++){
        if(T[i]>B[i]||L[i]>R[i]){
            continue;
        }
        {
            auto itl=lower_bound(s.begin(),s.end(),T[i]-R[i]);
            auto itr=upper_bound(s.begin(),s.end(),T[i]-L[i]);
            if(itl!=itr){
                auto it=lower_bound(itl,itr,B[i]-R[i]);
                int l=itl-s.begin();
                int r=itr-s.begin();
                int p=it-s.begin();
                ans[i]+=((p>0?qs[p-1]:0LL)-(l>0?qs[l-1]:0LL))+1LL*(R[i]-T[i])*(p-l);
                ans[i]+=1LL*(B[i]-T[i])*(r-p);
                ans[i]+=r-l;
            }
        }
        if(T[i]!=B[i]){
            auto itl=lower_bound(s.begin(),s.end(),T[i]-L[i]+1);
            auto itr=upper_bound(s.begin(),s.end(),B[i]-L[i]);
            if(itl!=itr){
                auto it=lower_bound(itl,itr,B[i]-R[i]);
                int l=itl-s.begin();
                int r=itr-s.begin();
                int p=it-s.begin();
                ans[i]+=-((r>0?qs[r-1]:0LL)-(p>0?qs[p-1]:0LL))+1LL*(B[i]-L[i])*(r-p);
                ans[i]+=1LL*(R[i]-L[i])*(p-l);
                ans[i]+=r-l;
            }
        }
    }
    return ans;
}

Compilation message (stderr)

mosaic.cpp: In function 'std::vector<long long int> mosaic(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
mosaic.cpp:48:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |     for(int i=1;i<qs.size();i++){
      |                 ~^~~~~~~~~~
#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...