Submission #1190401

#TimeUsernameProblemLanguageResultExecution timeMemory
1190401user736482Road Service 2 (JOI24_ho_t5)C++20
48 / 100
1141 ms404536 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define ff first
#define ss second
#define MOD 1000000009
#define INF 1000000019
#define POT (1<<20)
#define INFL 1000000000000000099
ll n,q,s,t,a,b,c,ans,k,e,m,h,w,u;
vector<ll>g[1000007];
vector<pair<ll,ll>>prz;
char ch;
ll moj[1000007],kszt[1000007],pop1[1000007],najdalej[1000007];
ll bst[1000007][24],bst2[1000007][24],bst3[1000007][24];
bool odw[1000007];
ll naj[1000007][2];
pair<ll,ll>spoj[1000007];
void dfs(ll v,ll czyj){
    if(odw[v])return;
    moj[v]=czyj;
    odw[v]=1;
    spoj[czyj].ff=min(spoj[czyj].ff,v/m);
    spoj[czyj].ss=max(spoj[czyj].ss,v/m);
    for(ll i : g[v])dfs(i,czyj);
}
pair<ll,ll>skok(pair<ll,ll>ak,ll ile){
    return {max(bst2[ak.ss][ile],bst[ak.ff][ile]),max(bst[ak.ss][ile],bst3[ak.ff][ile])};
}
void solve(){
    cin>>a;
    set<pair<pair<ll,ll>,ll>>s;
    vector<pair<ll,ll>>v,v2;
    for(ll i=0;i<a;i++){
        cin>>b>>c;
        b--;
        c--;
        b=b*m+c;
        s.insert({spoj[moj[b]],moj[b]});
    }
    if(s.size()==1){
        cout<<0<<"\n";
        return;
    }
    for(auto it=s.begin();it!=s.end();it++){
        v2.pb((*it).ff);
    }
    for(ll i=v2.size()-1;i>=0;i--){
        if(v.size() && v.back().ss<=v2[i].ss)continue;
        v.pb(v2[i]);
    }
    sort(v.begin(),v.end());
    ll ile=23;
    unordered_map<ll,pair<ll,ll>>mp;
    mp[2]={lower_bound(v.begin(),v.end(),(pair<ll,ll>){v[0].ss+1,-INFL})-v.begin()-1,najdalej[v[0].ss]};
    if(pop1[v[0].ss]>=v[0].ff)
    mp[1]={lower_bound(v.begin(),v.end(),(pair<ll,ll>){pop1[v[0].ss]+1,-INFL})-v.begin()-1,najdalej[pop1[v[0].ss]]};
    for(ll i=1+(pop1[v[0].ss]<v[0].ff);1;i++){
        pair<ll,ll>pr={mp[i].ss,mp[i+1].ss};
        if(mp[i].ff==v.size()-1){
            cout<<i<<"\n";
            return;
        }
        if(bst3[mp[i].ss][0]==mp[i].ss && v[mp[i].ff+1].ff>mp[i].ss){
            cout<<-1<<"\n";
            return;
        }
        while(skok(pr,ile).ss>=v[mp[i].ff+1].ff){
            ile--;
            if(ile<0){
                ile=23;
                break;
            }
        }
        if(ile!=23){
            pr=skok(pr,ile);
            mp[i+(1<<ile)]={mp[i].ff,pr.ff};
            mp[i+1+(1<<ile)]={mp[i].ff,pr.ss};
            i=i-1+(1<<ile);
            continue;
        }

        ll kon=min(mp[i].ss,v[mp[i].ff+1].ss);
        mp[i+2]=max(mp[i],max(mp[i+2],{lower_bound(v.begin(),v.end(),(pair<ll,ll>){kon+1,-INFL})-v.begin()-1,najdalej[kon]}));
        mp[i+1]=max(mp[i],max(mp[i+1],{lower_bound(v.begin(),v.end(),(pair<ll,ll>){pop1[kon]+1,-INFL})-v.begin()-1,najdalej[pop1[kon]]}));
    }
}
int main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>m>>q;
    for(ll i=0;i<n;i++){
        for(ll j=1;j<m;j++){
            cin>>ch;
            if(ch=='1'){
                g[i*m+j].pb(i*m+j-1);
                g[i*m+j-1].pb(i*m+j);
            }
        }
    }
    for(ll i=1;i<n;i++){
        for(ll j=0;j<m;j++){
            cin>>ch;
            if(ch=='1'){
                g[i*m+j].pb(i*m+j-m);
                g[i*m+j-m].pb(i*m+j);
            }
        }
    }
    for(ll i=0;i<n;i++)cin>>kszt[i];
    for(ll i=0;i<m*n;i++){
        if(!odw[i]){
            spoj[i]={INF,0};
            dfs(i,i);
            naj[i][0]=-1;
            for(ll j=spoj[i].ff;j<=spoj[i].ss;j++){
                if(kszt[i]==1)
                    naj[i][0]=j;
            }
            naj[i][1]=spoj[i].ss;
            prz.pb({spoj[i]});
        }
    }
    sort(prz.begin(),prz.end());
    reverse(prz.begin(),prz.end());
    ll akkon=-1;
    for(ll i=0;i<n;i++){
        najdalej[i]=i;
        bst2[i][0]=i;
        bst[i][0]=i;
        bst3[i][0]=i;
        if(i){
        bst[i][0]=max(bst[i][0],bst[i-1][0]);
        bst3[i][0]=max(bst3[i][0],bst3[i-1][0]);
        najdalej[i]=max(najdalej[i],najdalej[i-1]);
        }
        while(prz.back().ff==i){
            for(ll j=akkon+1;j<=prz.back().ss;j++){

                bst3[i][0]=j;
                najdalej[i]=j;
            }
            if(kszt[i]==1)
                bst[i][0]=bst3[i][0];
            akkon=max(akkon,prz.back().ss);
            prz.pop_back();
        }
    }
//for(ll i=0;i<n;i++)cout<<bst2[i][0]<<" ";
    for(ll i=0;i<n;i++){
        pop1[i]=-1;
        if(i)pop1[i]=pop1[i-1];
        if(kszt[i]==1)pop1[i]=i;
        bst3[i][0]=max(bst3[i][0],bst[bst[i][0]][0]);
    }
    for(ll j=1;j<24;j++){
        for(ll i=0;i<n;i++){
            bst[i][j]=max(bst[bst[i][j-1]][j-1],bst2[bst3[i][j-1]][j-1]);
            bst2[i][j]=max(bst[bst2[i][j-1]][j-1],bst2[bst[i][j-1]][j-1]);
            bst3[i][j]=max(bst[bst3[i][j-1]][j-1],bst3[bst[i][j-1]][j-1]);
        }
    }//for(ll i=n-100;i<n;i++)cout<<bst2[i][0]<<" ";
        for(ll j=0;j<3;j++){
            for(ll i=n-100;i<n;i++){

  //          cout<<bst[i][j]<<" "<<bst2[i][j]<<" "<<bst3[i][j]<<"\n";
        }
//cout<<"\n";
    }
    for(ll i=0;i<q;i++)solve();
}
#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...