Submission #547497

#TimeUsernameProblemLanguageResultExecution timeMemory
547497DeepessonPainting Walls (APIO20_paint)C++17
63 / 100
1607 ms513096 KiB
#include "paint.h" #include <bits/stdc++.h> #define MAX 100004 typedef std::pair<int,int> pii; pii pai[MAX][633]; int mod(int p,int M){ p%=M; if(p<0)p+=M; return p; } pii find(pii x){ auto&ref = pai[x.first][x.second]; if(ref==x) return x; return ref=find(ref); } void Union(pii a,pii b){ a=find(a); b=find(b); if(a!=b){ /// auto& ref1 = size[a],ref2=size[b]; /// if(ref1>ref2)std::swap(a,b); pai[a.first][a.second]=b; /// ref1+=ref2; } } bool pode[MAX]; std::vector<int> curte[MAX]; int get_num(int pos,int val){ int l=0,r=curte[pos].size()-1; if(r<l)return -1; int obj = val; while(l<r){ int m = (l+r+1)/2; if(curte[pos][m]>obj){ r=m-1; }else l=m; } if(l<0)return -1; /// std::cout<<pos<<" "<<l<<"\n"; if(curte[pos][l]==val)return l; return -1; } int minimumInstructions(int N, int M, int K, std::vector<int> C, std::vector<int> A, std::vector<std::vector<int>> B) { for(int i=0;i!=MAX;++i){ for(int j=0;j!=700;++j){ pai[i][j]={i,j}; } } for(int i=0;i!=M;++i){ for(auto& x:B[i]){ curte[x].push_back(i); } } for(int i=0;i!=N-1;++i){ int cor1 = C[i],cor2 = C[i+1]; for(int j=0;j!=curte[cor1].size();++j){ auto x=curte[cor1][j]; int tipo = x,prox = mod(x+1,M); bool ok=false; /// std::cout<<"Tentando "<<j<<" "<<i<<"\n"; int ans; { int l=0,r=curte[cor2].size()-1; if(r<l)break; int obj = prox; while(l<r){ int m = (l+r+1)/2; if(curte[cor2][m]>obj){ r=m-1; }else l=m; } if(curte[cor2][l]==obj)ok=true; ans=l; } /// std::cout<<"Tentou\n"; if(ok) { Union({i,j},{i+1,ans}); /// std::cout<<"Liga "<<i<<" "<<j<<" com: "<<i+1<<" "<<ans<<"\n"; } } } for(int i=0;i!=N;++i){ int fim = i+M-1; if(fim>=N)break; /// std::cout<<"Checa "<<i<<"\n"; for(int j=0;j!=curte[C[i]].size();++j){ auto x=curte[C[i]][j]; int ultimo_pintor = mod(x-1,M); int ind1 = j,ind2 = get_num(C[fim],ultimo_pintor); /// std::cout<<"Ind "<<ind2<<"\n"; if(ind2==-1)continue; pii alpha = find({i,ind1}); pii beta = find({fim,ind2}); /// std::cout<<"Busca "<<i<<" "<<ind1<<" "<<fim<<" "<<ind2<<"\n"; ///std::cout<<alpha.first<<" "<<alpha.second<<" "<<beta.first<<" "<<beta.second<<"!\n"; if(alpha==beta){ /// std::cout<<"Conexao "<<i<<" "<<fim<<"\n"; pode[i]=true; break; } } } std::priority_queue<pii,std::vector<pii>,std::greater<pii>> queue; int min = 1e9; int last=0; for(int i=0;i!=N+1;++i){ int ans=1e9; if(i){ while(queue.size()){ auto __ = queue.top(); ///Invalido if(__.second<i-M){ queue.pop(); continue; } ans=__.first; break; } }else ans=0; if(pode[i]) queue.push({ans+1,i}); /// std::cout<<"Custo "<<ans<<" ("<<i<<")\n"; last=ans; } if(last>=1e9)return -1; ///Sucesso return last; }

Compilation message (stderr)

paint.cpp: In function 'int minimumInstructions(int, int, int, std::vector<int>, std::vector<int>, std::vector<std::vector<int> >)':
paint.cpp:59:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |         for(int j=0;j!=curte[cor1].size();++j){
      |                     ~^~~~~~~~~~~~~~~~~~~~
paint.cpp:61:17: warning: unused variable 'tipo' [-Wunused-variable]
   61 |             int tipo = x,prox = mod(x+1,M);
      |                 ^~~~
paint.cpp:91:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |         for(int j=0;j!=curte[C[i]].size();++j){
      |                     ~^~~~~~~~~~~~~~~~~~~~
paint.cpp:111:9: warning: unused variable 'min' [-Wunused-variable]
  111 |     int min = 1e9;
      |         ^~~
#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...