제출 #187533

#제출 시각아이디문제언어결과실행 시간메모리
187533dndhk구경하기 (JOI13_watching)C++14
50 / 100
1014 ms16316 KiB
#include <bits/stdc++.h> #define pb push_back using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const int MAX_N = 2000; const ll INFLL = 10000; int N, P, Q; vector<ll> v; int dp[MAX_N+1][MAX_N+1]; list<pii> dq[2][MAX_N+1]; void add(int idx, int x, int y, int z){ while(!dq[idx][x].empty() && dq[idx][x].back().first>=z){ dq[idx][x].pop_back(); } dq[idx][x].push_back({z, y}); } bool chk(ll x){ for(int i=0; i<=N; i++){ for(int j=0; j<=N; j++) dp[i][j] = INFLL; while(!dq[0][i].empty()) dq[0][i].pop_back(); while(!dq[1][i].empty()) dq[1][i].pop_back(); } dp[0][0] = 0LL; //cout<<x<<endl; int r1=0, r2=0; for(int i=0; i<=N; i++){ while(r1<v.size()-1 && v[r1+1]<=v[i+1]+x-1LL){ r1++; } while(r2<v.size()-1 && v[r2+1]<=v[i+1]+2LL*x-1LL){ r2++; } for(int j=N; j>=0; j--){ while(!dq[0][j].empty() && dq[0][j].front().second<i) dq[0][j].pop_front(); while(!dq[1][j].empty() && dq[1][j].front().second<i) dq[1][j].pop_front(); if(dq[0][j].empty()){ if(!dq[1][j].empty()) dp[i][j] = dq[1][j].front().first; }else{ if(dq[1][j].empty()) dp[i][j] = dq[0][j].front().first; else{ dp[i][j] = min(dq[0][j].front().first, dq[1][j].front().first); } } if(dp[i][j]==INFLL || i==N) continue; int k = dp[i][j]; add(0, j+1, r1, k); add(1, j, r2, k+1); } } for(int i=0; i<=P; i++){ if(dp[N][i]<=Q) return true; } return false; } int main(){ scanf("%d%d%d", &N, &P, &Q); v.pb(0); for(int i=1; i<=N; i++){ ll x; scanf("%lld", &x); v.pb(x); } sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); sort(v.begin(), v.end()); N = v.size()-1; ll s = 1LL, e = 1000000000LL, m; while(s<e){ m = (s+e)/2LL; if(chk(m)){ e = m; }else{ s = m+1; } } printf("%lld", s); }

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

watching.cpp: In function 'bool chk(ll)':
watching.cpp:37:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(r1<v.size()-1 && v[r1+1]<=v[i+1]+x-1LL){
         ~~^~~~~~~~~~~
watching.cpp:40:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(r2<v.size()-1 && v[r2+1]<=v[i+1]+2LL*x-1LL){
         ~~^~~~~~~~~~~
watching.cpp: In function 'int main()':
watching.cpp:67:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d", &N, &P, &Q); 
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
watching.cpp:70:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   ll x; scanf("%lld", &x);
         ~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...