제출 #566360

#제출 시각아이디문제언어결과실행 시간메모리
566360zaneyu벽 칠하기 (APIO20_paint)C++14
100 / 100
584 ms17080 KiB
/*input 8 3 5 3 3 1 3 4 4 2 2 3 0 1 2 2 2 3 2 3 4 */ #include "paint.h" #include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<n;i++) #define REP1(i,n) for(int i=1;i<=n;i++) #define ALL(x) x.begin(),x.end() #define pii pair<int,int> #define f first #define s second #define MXTO(a,b) a=max(a,b) #define MNTO(a,b) a=min(a,b) #define sz(x) (int)x.size() #define pb push_back const int maxn=1e5+5; int n,m,k; int dp[maxn]; vector<int> ok[maxn]; const int INF=0x3f3f3f3f; vector<int> v[maxn]; int lp[maxn],rp[maxn]; mt19937 rng(69); int cnt[maxn]; int md[maxn]; int minimumInstructions( int N, int M, int K, std::vector<int> C, std::vector<int> A, std::vector<std::vector<int>> B) { C.emplace(C.begin(),0); n=N,m=M,k=K; REP(i,m){ for(int x:B[i]) ok[x].pb(i); } REP1(i,n) md[i]=(i%m); deque<int> dq; dq.pb(0); REP1(i,n){ while(sz(dq) and dq.front()<i-m) dq.pop_front(); int mn=dp[dq.front()]; dp[i]=INF; if(i>m){ for(int a:ok[C[i-m]]){ int z=(a-md[i-m]+m); if(z>=m) z-=m; cnt[z]--; } } for(int a:ok[C[i]]){ int z=(a-md[i]+m); if(z>=m) z-=m; cnt[z]++; if(cnt[z]==m){ dp[i]=mn+1; } } while(sz(dq) and dp[dq.back()]>=dp[i]) dq.pop_back(); dq.pb(i); } if(dp[n]>=INF) dp[n]=-1; return dp[n]; }
#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...