답안 #990569

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
990569 2024-05-30T16:22:00 Z AdamGS Shortcut (IOI16_shortcut) C++17
0 / 100
1 ms 4444 KB
#include "shortcut.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(a, b) for(int a = 0; a < (b); ++a)
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
const ll INF=1e18+7;
const int LIM=1e6+7;
ll P[LIM], T[LIM], prefm[LIM], lewo[LIM], prawo[LIM], dlewo[LIM], dprawo[LIM], n, C;
ll sred(ll a, ll b) {
  ll sum=P[b]-P[a]+C; sum/=2;
  vector<pair<ll,ll>>S;
  ll akt=0;
  rep(i, b-a) {
    S.pb({T[a+i], akt});
    akt+=P[a+i+1]-P[a+i];
  }
  S.pb({prawo[b], akt});
  akt+=C;
  S[0].st=lewo[a];
  rep(i, b-a+1) S.pb({S[i].st, S[i].nd+akt});
  vector<pair<ll,ll>>X;
  int l=0, l2=0;
  ll ans=max(dlewo[a], dprawo[b]);
  rep(i, S.size()) {
    while(l<S.size() && S[l].nd-S[i].nd<=sum) {
      while(X.size() && X.back().st<=S[l].nd+S[l].st) X.pop_back();
      l2=min(l2, (int)X.size());
      X.pb({S[l].nd+S[l].st, l});
      ++l;
    }
    while(l2<X.size() && X[l2].nd<=i) ++l2;
    if(l2<X.size()) ans=max(ans, X[l2].st-S[i].nd+S[i].st);
  }
  return ans;
}
bool check(ll k) {
  ll xpy_gora=INF, ymx_dol=0;
  for(int b=1; b<n; ++b) {
    if(prefm[b-1]>k-P[b]-T[b]) {
      xpy_gora=min(xpy_gora, -prefm[b-1]+P[b]-T[b]+k-C);
      ymx_dol=max(ymx_dol, prefm[b-1]+P[b]+T[b]-k+C);
    }
  }
  rep(b, n) if(2*P[b]>=xpy_gora+ymx_dol) {
    for(int a=b-1; a>=0; --a) {
      if(P[a]+P[b]<=xpy_gora && P[b]-P[a]>=ymx_dol) {
        if(sred(a, b)<=k) return true;
        break;
      }
    }
    break;
  }
  for(int b=n-1; b>=0; --b) if(2*P[b]<=xpy_gora+ymx_dol) {
    for(int a=b-1; a>=0; --a) {
      if(P[a]+P[b]<=xpy_gora && P[b]-P[a]>=ymx_dol) {
        if(sred(a, b)<=k) return true;
        break;
      }
    }
    break;
  }
  return false;
}
ll find_shortcut(int _n, vector<int>_l, vector<int>_d, int _c) {
  n=_n; C=_c;
  rep(i, n-1) P[i+1]=P[i]+_l[i];
  rep(i, n) T[i]=_d[i];
  rep(i, n) {
    prefm[i]=T[i]-P[i];
    if(i) prefm[i]=max(prefm[i], prefm[i-1]);
    if(i) lewo[i]=lewo[i-1]+P[i]-P[i-1];
    lewo[i]=max(lewo[i], T[i]);
    if(i) dlewo[i]=dlewo[i-1];
    dlewo[i]=max(dlewo[i], T[i]);
    if(i) dlewo[i]=max(dlewo[i], lewo[i-1]+P[i]-P[i-1]+T[i]);
  }
  for(int i=n-1; i>=0; --i) {
    if(i<n-1) prawo[i]=prawo[i+1]+P[i+1]-P[i];
    prawo[i]=max(prawo[i], T[i]);
    if(i<n-1) dprawo[i]=dprawo[i+1];
    dprawo[i]=max(dprawo[i], T[i]);
    if(i<n-1) dprawo[i]=max(dprawo[i], prawo[i+1]+P[i+1]-P[i]+T[i]);
  }
  ll po=0, ko=3000000000000000;
  while(po<ko) {
    ll sr=(po+ko)/2;
    if(check(sr)) ko=sr; else po=sr+1;
  }
  return po;
}

Compilation message

shortcut.cpp: In function 'll sred(ll, ll)':
shortcut.cpp:5:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    5 | #define rep(a, b) for(int a = 0; a < (b); ++a)
      |                                    ^
shortcut.cpp:28:3: note: in expansion of macro 'rep'
   28 |   rep(i, S.size()) {
      |   ^~~
shortcut.cpp:29:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |     while(l<S.size() && S[l].nd-S[i].nd<=sum) {
      |           ~^~~~~~~~~
shortcut.cpp:35:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   35 |     while(l2<X.size() && X[l2].nd<=i) ++l2;
      |           ~~^~~~~~~~~
shortcut.cpp:36:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |     if(l2<X.size()) ans=max(ans, X[l2].st-S[i].nd+S[i].st);
      |        ~~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB n = 4, 80 is a correct answer
2 Correct 1 ms 4444 KB n = 9, 110 is a correct answer
3 Correct 1 ms 4440 KB n = 4, 21 is a correct answer
4 Correct 1 ms 4444 KB n = 3, 4 is a correct answer
5 Correct 1 ms 4444 KB n = 2, 62 is a correct answer
6 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
7 Correct 1 ms 4444 KB n = 3, 29 is a correct answer
8 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
9 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
10 Correct 1 ms 4444 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 4440 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 4444 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 4444 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 4440 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 4444 KB n = 10, 1000000343 is a correct answer
18 Incorrect 1 ms 4444 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB n = 4, 80 is a correct answer
2 Correct 1 ms 4444 KB n = 9, 110 is a correct answer
3 Correct 1 ms 4440 KB n = 4, 21 is a correct answer
4 Correct 1 ms 4444 KB n = 3, 4 is a correct answer
5 Correct 1 ms 4444 KB n = 2, 62 is a correct answer
6 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
7 Correct 1 ms 4444 KB n = 3, 29 is a correct answer
8 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
9 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
10 Correct 1 ms 4444 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 4440 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 4444 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 4444 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 4440 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 4444 KB n = 10, 1000000343 is a correct answer
18 Incorrect 1 ms 4444 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB n = 4, 80 is a correct answer
2 Correct 1 ms 4444 KB n = 9, 110 is a correct answer
3 Correct 1 ms 4440 KB n = 4, 21 is a correct answer
4 Correct 1 ms 4444 KB n = 3, 4 is a correct answer
5 Correct 1 ms 4444 KB n = 2, 62 is a correct answer
6 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
7 Correct 1 ms 4444 KB n = 3, 29 is a correct answer
8 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
9 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
10 Correct 1 ms 4444 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 4440 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 4444 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 4444 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 4440 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 4444 KB n = 10, 1000000343 is a correct answer
18 Incorrect 1 ms 4444 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB n = 4, 80 is a correct answer
2 Correct 1 ms 4444 KB n = 9, 110 is a correct answer
3 Correct 1 ms 4440 KB n = 4, 21 is a correct answer
4 Correct 1 ms 4444 KB n = 3, 4 is a correct answer
5 Correct 1 ms 4444 KB n = 2, 62 is a correct answer
6 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
7 Correct 1 ms 4444 KB n = 3, 29 is a correct answer
8 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
9 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
10 Correct 1 ms 4444 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 4440 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 4444 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 4444 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 4440 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 4444 KB n = 10, 1000000343 is a correct answer
18 Incorrect 1 ms 4444 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB n = 4, 80 is a correct answer
2 Correct 1 ms 4444 KB n = 9, 110 is a correct answer
3 Correct 1 ms 4440 KB n = 4, 21 is a correct answer
4 Correct 1 ms 4444 KB n = 3, 4 is a correct answer
5 Correct 1 ms 4444 KB n = 2, 62 is a correct answer
6 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
7 Correct 1 ms 4444 KB n = 3, 29 is a correct answer
8 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
9 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
10 Correct 1 ms 4444 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 4440 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 4444 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 4444 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 4440 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 4444 KB n = 10, 1000000343 is a correct answer
18 Incorrect 1 ms 4444 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB n = 4, 80 is a correct answer
2 Correct 1 ms 4444 KB n = 9, 110 is a correct answer
3 Correct 1 ms 4440 KB n = 4, 21 is a correct answer
4 Correct 1 ms 4444 KB n = 3, 4 is a correct answer
5 Correct 1 ms 4444 KB n = 2, 62 is a correct answer
6 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
7 Correct 1 ms 4444 KB n = 3, 29 is a correct answer
8 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
9 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
10 Correct 1 ms 4444 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 4440 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 4444 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 4444 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 4440 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 4444 KB n = 10, 1000000343 is a correct answer
18 Incorrect 1 ms 4444 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB n = 4, 80 is a correct answer
2 Correct 1 ms 4444 KB n = 9, 110 is a correct answer
3 Correct 1 ms 4440 KB n = 4, 21 is a correct answer
4 Correct 1 ms 4444 KB n = 3, 4 is a correct answer
5 Correct 1 ms 4444 KB n = 2, 62 is a correct answer
6 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
7 Correct 1 ms 4444 KB n = 3, 29 is a correct answer
8 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
9 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
10 Correct 1 ms 4444 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 4440 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 4444 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 4444 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 4440 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 4444 KB n = 10, 1000000343 is a correct answer
18 Incorrect 1 ms 4444 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB n = 4, 80 is a correct answer
2 Correct 1 ms 4444 KB n = 9, 110 is a correct answer
3 Correct 1 ms 4440 KB n = 4, 21 is a correct answer
4 Correct 1 ms 4444 KB n = 3, 4 is a correct answer
5 Correct 1 ms 4444 KB n = 2, 62 is a correct answer
6 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
7 Correct 1 ms 4444 KB n = 3, 29 is a correct answer
8 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
9 Correct 1 ms 4444 KB n = 2, 3 is a correct answer
10 Correct 1 ms 4444 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 4440 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 4444 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 4444 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 4444 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 4440 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 4444 KB n = 10, 1000000343 is a correct answer
18 Incorrect 1 ms 4444 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -