Submission #289678

#TimeUsernameProblemLanguageResultExecution timeMemory
289678b00n0rpPainting Walls (APIO20_paint)C++17
100 / 100
1129 ms410028 KiB
/* Soln: https://drive.google.com/file/d/1ZZIUOhvEl-sldF9eY8HSjTMnusHsbGsM/view */ #include "paint.h" #include <bits/stdc++.h> using namespace std; typedef long double LD; typedef long long ll; // #define int ll #define pb push_back #define mp make_pair #define REP(i,n) for (int i = 0; i < n; i++) #define FOR(i,a,b) for (int i = a; i < b; i++) #define REPD(i,n) for (int i = n-1; i >= 0; i--) #define FORD(i,a,b) for (int i = a; i >= b; i--) #define remax(a,b) a = max(a,b) #define remin(a,b) a = min(a,b) #define all(v) v.begin(),v.end() typedef map<int,int> mii; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int,int> pii; typedef vector<pii> vpii; #define F first #define S second #define PQ(type) priority_queue<type> #define PQD(type) priority_queue<type,vector<type>,greater<type> > #define WL(t) while(t --) #define SZ(x) ((int)(x).size()) #define runtime() ((double)clock() / CLOCKS_PER_SEC) #define inrange(i,a,b) ((i>=min(a,b)) && (i<=max(a,b))) #ifdef TRACE #define trace(...) __f(#__VA_ARGS__, __VA_ARGS__) template <typename Arg1> void __f(const char* name, Arg1&& arg1){ cout << name << " : " << arg1 << std::endl; } template <typename Arg1, typename... Args> void __f(const char* names, Arg1&& arg1, Args&&... args){ const char* comma = strchr(names + 1, ',');cout.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...); } #else #define trace(...) #endif const int MAXN = 100005; const int SQRTN = 1003; const int LOGN = 22; const double PI=acos(-1); #ifdef int const int INF=1e16; #else const int INF=1e9; #endif const int MOD = 1000000007; const int FMOD = 998244353; const double eps = 1e-9; int n,m,k; vi a,c; vvi b; int dp[MAXN]; bool valid[MAXN]; vi gg[MAXN]; vi lol[MAXN]; int cnt[MAXN]; void checksegments(){ REP(i,m){ for(auto x:b[i]) gg[x].pb(i); } REP(i,n){ for(auto x:gg[c[i]]) lol[i].pb({(x-i+n)%m}); } REP(i,n){ if(i >= m){ for(auto x:lol[i-m]) cnt[x]--; } for(auto x:lol[i]){ cnt[x]++; if(cnt[x] == m) valid[i+1-m] = 1; } } } int seg[MAXN*2]; void upd(int pos,int val){ pos += n+1; seg[pos] = val; pos /= 2; while(pos){ seg[pos] = min(seg[pos*2],seg[pos*2+1]); pos /= 2; } } int quer(int l,int r){ l += n+1; r += n+1; int res = INF; while(l < r){ if(l%2) remin(res,seg[l++]); if(r%2) remin(res,seg[--r]); l /= 2; r /= 2; } return res; } int minimumInstructions(int N, int M, int K, vi C, vi A, vvi B) { n = N; m = M; k = K; a = A; b = B; c = C; checksegments(); dp[0] = 0; upd(0,0); FOR(i,1,n+1){ dp[i] = INF; if(valid[i-m]) remin(dp[i],quer(i-m,i)+1); upd(i,dp[i]); } if(dp[n] == INF) return -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...