Submission #600959

#TimeUsernameProblemLanguageResultExecution timeMemory
600959balbitShortcut (IOI16_shortcut)C++14
0 / 100
2091 ms212 KiB
// 我的心裡只有你沒有他 #pragma GCC optimize("O3", "unroll-loops") #include "shortcut.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define int ll #define pii pair <int, int > #define f first #define s second #define MX(a,b) a = max(a,b) #define MN(a,b) a = min(a,b) #define ALL(x) (x).begin(), (x).end() #define SZ(x) (int)((x).size()) #ifdef BALBIT #define bug(...) cerr<<"#"<<__LINE__<<": "<<#__VA_ARGS__<<"- ", _do(__VA_ARGS__) template<typename T> void _do(T && x) {cerr<<x<<endl;} template<typename T, typename ...S> void _do(T && x, S && ...y) {cerr<<x<<", "; _do(y...);} #else #define bug(...) #endif // BALBIT #define pb push_back #define REP(i,n) for (int i = 0; i<(n); ++i) #define REP1(i,n) for (int i = 1; i<=(n); ++i) const int maxn = 1e6+5; const ll inf = 0x3f3f3f3f3f3f3f3f; int P[maxn], D[maxn]; // position, depth vector<pii> Aval, Bval; // A is Da + Pa, B is Db - Pb ll C[2][2], bigB[2], sbigB[2], whoB[2]; double t1=0,t2=0; ll thismuchmore; bool okay(int n, ll M, ll cost) { // for all D[a] + P[a] - D[b] + P[b] >= M, clock_t t = clock(); bug(M, cost); REP(r,2) REP(R, 2) { C[r][R] = -inf; bigB[r] = sbigB[r] = -inf; whoB[r] = -1; } int j = SZ(Bval)-1; if (M < 1e9 * 2+10) { REP(i,SZ(Aval)) { int a = Aval[i].s; while (j>=0 && Aval[i].f+Bval[j].f > M) { // work j int b = Bval[j].s; bug(a,b,Aval[i].f + Bval[i].f); REP(vx,2) { ll val = D[b] +(vx?-1:1)*P[b]; if (val > bigB[vx]) { sbigB[vx] = bigB[vx]; whoB[vx] = b; bigB[vx] = val; }else if (val > sbigB[vx]) { sbigB[vx] = val; } } --j; } REP(vx,2) { ll ka = cost-M+D[a]+(vx?-P[a]:P[a]); REP(vy,2) { int bval = whoB[vy]==a?sbigB[vy] : bigB[vy]; MX(C[vx][vy], (ka + bval)); } } if (C[0][0] > -C[1][1]) return 0; if (C[0][1] > -C[1][0]) return 0; } }else{ REP(i,SZ(Aval)) { int a = Aval[i].s; while (j>=0 && Aval[i].f+Bval[j].f > M) { int b = Bval[j].s; REP(vx,2) { MX(bigB[vx], D[b] +(vx?-P[b]:P[b])); } --j; } REP(vx,2) { ll ka = cost-M+D[a]+(vx?-P[a]:P[a]); REP(vy,2) { MX(C[vx][vy], (ka + bigB[vy])); } } if (C[0][0] > -C[1][1]) return 0; if (C[0][1] > -C[1][0]) return 0; } } t1 += (clock()-t) / (double)CLOCKS_PER_SEC; t = clock(); // REP(X,2) REP(Y,2) C[X][Y] += cost-M; // bug(C[0][0], C[0][1], C[1][0], C[1][1]); t = clock(); bool ok = 0; signed i00=n, i01=-1, i10=0,i11=n-1; thismuchmore = inf; REP(a, n) { ll X = P[a]; // while (i00-1>=0 && P[i00-1] >= C[0][0]-X) --i00; // while (i10<n && P[i10] < C[1][0] + X) ++i10; // while (i01+1 <n && P[i01+1] <= -C[0][1] + X) ++i01; // while (i11 >= 0 && P[i11] > -C[1][1] - X) --i11; // if (max(i00, i10) <= min(i01, i11)) { // return 1; // } ll lb = max(C[0][0]-X, C[1][0] + X); ll rb = min(-C[0][1]+X, -C[1][1]-X); // bug(X, lb, rb); if (lb > rb) continue; int it = lower_bound(P, P+n, lb) - P; if (it < n && P[it]>=lb && P[it] <= rb) { return 1; }else{ // MN(thismuchmore, min(P[it]-rb, lb-P[it-1])); } } t2 += (clock()-t) / (double)CLOCKS_PER_SEC; return ok; // conditions: Pa + Da + } long long find_shortcut(signed n, std::vector<signed> l, std::vector<signed> _d, signed _c) { // watermelon 4A orz bug(1,2); P[0] = 0; REP(i,n-1) P[i+1] = P[i] + l[i]; // P[n] = inf*2; REP(i,n) D[i] = _d[i]; REP(i,n) { Aval.pb({D[i] + P[i], i}); Bval.pb({D[i] - P[i], i}); } sort(ALL(Aval)); sort(ALL(Bval)); int lb=P[n-1]/3, rb=P[n-1]+2e9+100; while (lb != rb) { ll M = (lb+rb)/2; if (okay(n,M,_c)) { rb = M; }else { bug(rb, thismuchmore + lb); MN(rb, thismuchmore + lb); lb = M+1; } } bug(lb); return lb; } /* 4 10 10 20 20 0 40 0 30 9 30 10 10 10 10 10 10 10 10 20 0 30 0 0 40 0 40 0 3 10 1 1 0 1000 0 */ // #ifdef BALBIT signed main(){ // bug(hi); int n; cin>>n; REP(www, 1) { vector<signed> l, d; REP(i,n-1) { l.pb(rand()%1000000000); } REP(i,n) { d.pb(rand()%1000000000); } bug(find_shortcut(n, l, d, 222)); bug(t1,t2); } } #endif

Compilation message (stderr)

shortcut.cpp: In function 'bool okay(long long int, long long int, long long int)':
shortcut.cpp:118:12: warning: unused variable 'i00' [-Wunused-variable]
  118 |     signed i00=n, i01=-1, i10=0,i11=n-1;
      |            ^~~
shortcut.cpp:118:19: warning: unused variable 'i01' [-Wunused-variable]
  118 |     signed i00=n, i01=-1, i10=0,i11=n-1;
      |                   ^~~
shortcut.cpp:118:27: warning: unused variable 'i10' [-Wunused-variable]
  118 |     signed i00=n, i01=-1, i10=0,i11=n-1;
      |                           ^~~
shortcut.cpp:118:33: warning: unused variable 'i11' [-Wunused-variable]
  118 |     signed i00=n, i01=-1, i10=0,i11=n-1;
      |                                 ^~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...