#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |