제출 #683889

#제출 시각아이디문제언어결과실행 시간메모리
683889kym벽 칠하기 (APIO20_paint)C++14
63 / 100
1596 ms22732 KiB
#include <bits/stdc++.h> using namespace std; #define FOR(i,s,e) for(int i = s; i <= (int)e; ++i) #define DEC(i,s,e) for(int i = s; i >= (int)e; --i) #define IAMSPEED ios_base::sync_with_stdio(false); cin.tie(0); #ifdef LOCAL #define db(x) cerr << #x << "=" << x << "\n" #define db2(x, y) cerr << #x << "=" << x << " , " << #y << "=" << y << "\n" #define db3(a,b,c) cerr<<#a<<"="<<a<<","<<#b<<"="<<b<<","<<#c<<"="<<c<<"\n" #define dbv(v) cerr << #v << ":"; for (auto ite : v) cerr << ite << ' '; cerr <<"\n" #define dbvp(v) cerr << #v << ":"; for (auto ite : v) cerr << "{" << ite.f << ',' << ite.s << "} "; cerr << "\n" #define dba(a,ss,ee) cerr << #a << ":"; FOR(ite,ss,ee) cerr << a[ite] << ' '; cerr << "\n" #define reach cerr << "LINE: " << __LINE__ << "\n"; #else #define reach #define db(x) #define db2(x,y) #define db3(a,b,c) #define dbv(v) #define dbvp(v) #define dba(a,ss,ee) #endif mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #define pb push_back #define eb emplace_back #define all(x) (x).begin(), (x).end() #define f first #define s second #define g0(x) get<0>(x) #define g1(x) get<1>(x) #define g2(x) get<2>(x) #define g3(x) get<3>(x) typedef pair <int, int> pi; typedef tuple<int,int,int> ti3; typedef tuple<int,int,int,int> ti4; int rand(int a, int b) { return a + rng() % (b-a+1); } const int MOD = 1e9 + 7; const int inf = (int)1e9 + 500; const long long oo = (long long)1e18 + 500; template <typename T> bool chmax(T& a, const T b) { return a<b ? a = b, 1 : 0; } template <typename T> bool chmin(T& a, const T b) { return a>b ? a = b, 1 : 0; } const int MAXN = 100005; #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt,tune=native") int D[MAXN]; unordered_map<int,int> dp[2]; int store[MAXN]; vector<int> V[MAXN]; // contractors of this colour bool can[MAXN]; struct node { int s,e,m,val; node *l, *r; node(int _s, int _e) { s=_s;e=_e; m=(s+e)/2; val=inf; if(s!=e) { l=new node(s,m); r=new node(m+1,e); } } void update(int x, int nval) { if(s==e) { val=nval; return; } if(x>m)r->update(x,nval); else l->update(x,nval); val=min(l->val,r->val); } int query(int x, int y) { if(s==x&&e==y) return val; if(x>m) return r->query(x,y); else if(y<=m) return l->query(x,y); else return min(l->query(x,m), r->query(m+1,y)); } } *seg; int minimumInstructions( int n, int m, int k, std::vector<int> C, std::vector<int> A, std::vector<std::vector<int>> B) { seg=new node(0,n); FOR(i,0,m-1) { // this contractor int y=A[i]; FOR(j,0,y-1) { // V[i] -> the indices of contractors of this index. V[B[i][j]].pb(i); } } FOR(i,1,MAXN)D[i]=inf; D[0]=0; bool alt; FOR(i,0,n-1) { alt=i%2; dp[alt].clear(); for(auto x:V[C[i]]) { // index of contractor that can paint this place // for continuous segment, all V values are the same // store longest segment of this same value int V=i-x; chmax(dp[alt][V],dp[1-alt][V]+1); } db(i); dbvp(dp[alt]); store[i]=dp[alt][i-(m-1)]; //now check if i can cover from [i-m+1 to i] int st=i-m+1; if(st<0)continue; for(auto x:dp[alt]) { int idx=-(x.f-i); // idx of the contractor int len=min(x.s,idx+1); if(idx == m-1) { if(len>=m){ can[i]=1; break; } } if(idx>=len)continue; //idx<len int curidx=i-len; db(curidx); if(curidx<0){ continue; } int req=m-len; if(store[curidx]>=req){ can[i]=1; break; } } //actually after this, the only value that matters is the largest val } dba(store,0,n-1); dba(can,0,n-1); seg->update(0,0); FOR(i,m,n) { // this is thing should be one indexed if(!can[i-1])continue; chmin(D[i], seg->query(i-m, i-1) + 1); seg->update(i, D[i]); } if(D[n]>=inf)return -1; else return D[n]; }

컴파일 시 표준 에러 (stderr) 메시지

paint.cpp: In function 'int minimumInstructions(int, int, int, std::vector<int>, std::vector<int>, std::vector<std::vector<int> >)':
paint.cpp:90:22: warning: iteration 100004 invokes undefined behavior [-Waggressive-loop-optimizations]
   90 |     FOR(i,1,MAXN)D[i]=inf;
      |                  ~~~~^~~~
paint.cpp:3:37: note: within this loop
    3 | #define FOR(i,s,e) for(int i = s; i <= (int)e; ++i)
......
   90 |     FOR(i,1,MAXN)D[i]=inf;
      |         ~~~~~~~~                     
paint.cpp:90:5: note: in expansion of macro 'FOR'
   90 |     FOR(i,1,MAXN)D[i]=inf;
      |     ^~~
#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...