Submission #1008890

#TimeUsernameProblemLanguageResultExecution timeMemory
1008890Cookie벽 칠하기 (APIO20_paint)C++14
100 / 100
206 ms18260 KiB
#include<bits/stdc++.h> #include<fstream> #pragma GCC optimize("O3") #pragma GCC target("avx2") using namespace std; #define sz(a) (int)a.size() #define ALL(v) v.begin(), v.end() #define ALLR(v) v.rbegin(), v.rend() #define ll long long #define pb push_back #define forr(i, a, b) for(int i = a; i < b; i++) #define dorr(i, a, b) for(int i = a; i >= b; i--) #define ld long double #define vt vector #include<fstream> #define fi first #define se second #define pll pair<ll, ll> #define pii pair<int, int> #define mpp make_pair const ld PI = 3.14159265359, prec = 1e-9;; //using u128 = __uint128_t; const int dx[4] = {1, 0, -1, 0}; const int dy[4] = {0, -1, 0, 1}; const ll mod = 1e9 + 7, pr = 31; const int mxn = 2e5 + 5, mxd = 250 * 250, sq = 100, mxv = 5e4 + 1, mxq = 2e6 + 5, T = 1000; //const int base = (1 <<18); const ll inf = 2e9 + 5, neg = -69420, inf2 = 1e14; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); #include "paint.h" #include <vector> int n, m, k; bool ok[mxn + 1]; int cnt[50005], last[50005], c[mxn + 1], dp[mxn + 1]; vt<int>comp[mxn + 1]; int minimumInstructions(int N, int M, int K, std::vector<int> C, std::vector<int> A, std::vector<std::vector<int>> B) { n = N; m = M; k = K; for(int i = 1; i <= n; i++){ c[i] = C[i - 1]; } for(int i = 0; i < m; i++){ for(auto j: B[i]){ comp[j].pb(i); } } for(int i = 1; i <= n; i++)dp[i] = inf; deque<int>dq; dq.pb(0); for(int i = 1; i <= n; i++){ while(sz(dq) && dq.front() + m < i)dq.pop_front(); for(auto j: comp[c[i]]){ int coef = (i - j + m) % m; if(last[coef] == i - 1){ last[coef] = i; cnt[coef]++; }else{ last[coef] = i; cnt[coef] = 1; } if(cnt[coef] >= m){ dp[i] = min(dp[i], dp[dq.front()] + 1); } } while(sz(dq) && dp[i] <= dp[dq.back()])dq.pop_back(); dq.pb(i); } if(dp[n] == inf)dp[n] = -1; return(dp[n]); } /* int main() { int N, M, K; assert(3 == scanf("%d %d %d", &N, &M, &K)); std::vector<int> C(N); for (int i = 0; i < N; ++i) { assert(1 == scanf("%d", &C[i])); } std::vector<int> A(M); std::vector<std::vector<int>> B(M); for (int i = 0; i < M; ++i) { assert(1 == scanf("%d", &A[i])); B[i].resize(A[i]); for (int j = 0; j < A[i]; ++j) { assert(1 == scanf("%d", &B[i][j])); } } int minimum_instructions = minimumInstructions(N, M, K, C, A, B); printf("%d\n", minimum_instructions); return 0; } */
#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...