Submission #1190197

#TimeUsernameProblemLanguageResultExecution timeMemory
1190197user736482Road Service 2 (JOI24_ho_t5)C++20
0 / 100
688 ms376040 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][22],bst2[1000007][22],bst3[1000007][22];//z[i] placac2^[j] lub 2^[j] -1 lub 2^[j] +1
bool odw[1000007];
ll naj[1000007][2];
pair<ll,ll>spoj[1000007];

void dfs(ll v,ll czyj){
    
    if(odw[v])return;
    //cout<<v<<" ";
    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<pair<ll,ll>,ll>pier(ll strt,ll pocz){//<koszt i koniec>,drugi koniec  - najtanszy koniec >=pocz i najalszy w kosztcie min+1
    ll akzap=0;
    ll p1=strt;
    ll p2=strt;
    if(strt==pocz){
        return {{0,strt},strt};
    }
    ll akpot=21;
    ll kszt=1;
    //cout<<pocz<<" "<<p1<<" "<<p2<<" "<<kszt<<" "<<akpot<<"\n";
    while(p2<pocz){
        while(max(bst2[p2][akpot],bst[p1][akpot])>=pocz)akpot--;
        if(akpot<0)break;
        ll np1=max(bst2[p2][akpot],bst[p1][akpot]);
        ll np2=max(bst3[p2][akpot],bst2[p1][akpot]);
        kszt+=(1<<akpot);
        if(kszt>=(1<<22))
            return {{-1,-1},-1};
        p1=np1;
        p2=np2;//cout<<p1<<" "<<p2<<" "<<kszt<<" "<<akpot<<"\n";
        
    }//return {{0,0},0};
    ll np1=max(bst2[p2][0],bst[p1][0]);
    ll np2=max(bst3[p2][0],bst2[p1][0]);
    p1=np1;
    p2=np2;
    //cout<<kszt<<" "<<p1<<" "<<p2;
    //cout<<"\n\n";
    return {{kszt,p1},p2};
}*/

void solve(){
    cin>>a;
    set<pair<pair<ll,ll>,ll>>s;
    vector<pair<ll,ll>>v;
    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++){
        if(v.size() && (*it).ff.ss<=v.back().ss)continue;
        v.pb((*it).ff);
        //cout<<v.back().ff<<" "<<v.back().ss<<"\n";
    } 
    //cout<<"\n\n";
    unordered_map<ll,pair<ll,ll>>mp;//koszt, <ostatni wziety,zasieg>
    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++){
        //cout<<i<<" "<<mp[i].ff<<" "<<mp[i].ss<<"\n";
        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;
        }
        ll kon=min(mp[i].ss,v[mp[i].ff+1].ss);
        mp[i+2]=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+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'){
            //    cout<<i*m+j<<" "<<i*m+j-1<<"\n";
                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'){
           //     cout<<i*m+j<<" "<<i*m+j-m<<"\n";
                g[i*m+j].pb(i*m+j-m);
                g[i*m+j-m].pb(i*m+j);
            }
        }
    }//cout<<"\n\n";
    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);
            //cout<<spoj[i].ff<<" "<<spoj[i].ss<<" ";
            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;
            //cout<<naj[i][0]<<"\n";
            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;
        if(i){
        bst[i][0]=bst[i-1][0];
        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++){
                if(kszt[j]==1)
                    bst[i][0]=j;
                bst3[i][0]=j;
                najdalej[i]=j;
            }
            akkon=prz.back().ss;
            bst2[i][0]=i;   
            prz.pop_back();
        }
    }
    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<22;j++){
        for(ll i=0;i<n;i++){
            bst[i][j]=min(bst[bst[i][j-1]][j-1],bst2[bst3[i][j-1]][j-1]);
            bst2[i][j]=min(bst[bst2[i][j-1]][j-1],bst2[bst[i][j-1]][j-1]);
            bst3[i][j]=min(bst[bst3[i][j-1]][j-1],bst3[bst[i][j-1]][j-1]);
        }
    }
    for(ll j=0;j<3;j++){
            for(ll i=0;i<n;i++){
        
            //cout<<bst[i][j]<<" "<<bst2[i][j]<<" "<<bst3[i][j]<<"\n";
        }
        //cout<<"\n";
    }
    //return 0;
    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...