제출 #725139

#제출 시각아이디문제언어결과실행 시간메모리
725139n0sk1ll벽 칠하기 (APIO20_paint)C++14
40 / 100
1585 ms209816 KiB
#include <bits/stdc++.h> #define FAST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);cerr.tie(0) #define mp make_pair #define xx first #define yy second #define pb push_back #define pf push_front #define popb pop_back #define popf pop_front #define all(x) x.begin(),x.end() #define ff(i,a,b) for (int i = a; i < b; i++) #define fff(i,a,b) for (int i = a; i <= b; i++) #define bff(i,a,b) for (int i = b-1; i >= a; i--) #define bfff(i,a,b) for (int i = b; i >= a; i--) using namespace std; long double typedef ld; unsigned int typedef ui; long long int typedef li; pair<int,int> typedef pii; pair<li,li> typedef pli; pair<ld,ld> typedef pld; vector<vector<int>> typedef graph; unsigned long long int typedef ull; //const int mod = 998244353; const int mod = 1000000007; //Note to self: Check for overflow #include "paint.h" int root[50004]; //implicitno segmento za svakog (kontraktor - index) ((ono moje)) const int N=25'000'007; int val[N],L[N],R[N]; int idx=0; void add(int p, int l, int r, int s, int x) { val[p]+=x; if (l==r) return; int mid=(l+r)/2; if (s<=mid) { if (!L[p]) L[p]=++idx; add(L[p],l,mid,s,x); } else { if (!R[p]) R[p]=++idx; add(R[p],mid+1,r,s,x); } } int sum(int p, int l, int r, int ll, int rr) { if (!p || ll>r || rr<l) return 0; if (ll<=l && rr>=r) return val[p]; int mid=(l+r)/2; return sum(L[p],l,mid,ll,rr)+sum(R[p],mid+1,r,ll,rr); } void ispisi(int p, int l, int r) { if (!val[p]) return; if (l==r) { cout<<l<<" "; return; } int mid=(l+r)/2; ispisi(L[p],l,mid); ispisi(R[p],mid+1,r); } int upizdi(int i, int n) //retard funkcija { i%=n; if (i<0) i+=n; return i; } vector<int> koji[100005]; //koji kontraktori sadrze ovu boju, svkk su indexirani bool chiba[100005]; //da li siba, na osnovu toga racuna minimalan broj poteza int minimumInstructions(int n, int m, int k, vector<int> c, vector<int> a, vector<vector<int>> b) { ff(i,0,m) for (auto it : b[i]) koji[it].pb(i); ff(i,0,m) root[i]=++idx; ff(i,0,n) for (auto kont : koji[c[i]]) add(root[upizdi(kont-i,m)],0,n-1,i,1); //ff(i,0,m) cout<<i<<": ",ispisi(root[i],0,n-1),cout<<endl; /*ff(i,0,k) { cout<<i<<": "; for (auto it : koji[i]) cout<<it<<" "; cout<<endl; } cout<<endl;*/ fff(i,0,n-m) for (auto kont : koji[c[i]]) if (sum(root[upizdi(kont-i,m)],0,n-1,i,i+m-1)==m) chiba[i]=1; int poslednji=-mod,snaga=0,ans=0; ff(i,0,n) { if (chiba[i]) poslednji=i; if (snaga<=0) { if (i>=poslednji+m) return -1; snaga=poslednji+m-i,ans++; } snaga--; } return ans; } //Note to self: Check for overflow /* 8 3 5 3 3 1 3 4 4 2 2 3 0 1 2 2 2 3 2 3 4 */
#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...