제출 #1152760

#제출 시각아이디문제언어결과실행 시간메모리
1152760alexddShortcut (IOI16_shortcut)C++20
0 / 100
0 ms324 KiB
#include "shortcut.h" #include<bits/stdc++.h> using namespace std; #define int long long const int INF = 1e18; const int MAXN = 3005; int n,c; int a[MAXN];//pozitii int d[MAXN]; int worst_pref[MAXN],worst_suff[MAXN]; int only_pref[MAXN],only_suff[MAXN]; int inainte[MAXN][MAXN]; bool verif(int lim) { if(only_pref[n] <= lim) return 1; vector<vector<int>> prec(n+2,vector<int>(n+2,-INF)); for(int u=1;u<=n;u++) { for(int v=u+1;v<=n;v++) { if(a[v] + d[v] - a[u] + d[u] > lim) { prec[u][v] = a[u] - a[v] + d[u] + d[v]; } } } for(int u=1;u<=n;u++) { for(int v=u+1;v<=n;v++) { prec[u][v] = max(prec[u][v], prec[u+1][v]); prec[u][v] = max(prec[u][v], prec[u][v-1]); } } for(int u=n;u>0;u--) { for(int v=n;v>u;v--) { prec[u][v] = max(prec[u][v], prec[u+1][v]); prec[u][v] = max(prec[u][v], prec[u][v-1]); } } vector<vector<bool>> aux(n+2,vector<bool>(n+2,1)); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(c >= a[j]-a[i]) continue; bool bun=1; for(int u=i+1;u<j;u++) { if(d[u] + a[u] > lim - worst_pref[i]) { if(d[u] - a[u] > lim - worst_pref[i] - a[i] - a[j] - c) { bun=0; break; } } } for(int u=i+1;u<j;u++) { if(d[u] - a[u] > lim - worst_suff[j]) { if(d[u] + a[u] > lim - worst_suff[j] + a[i] + a[j] - c) { bun=0; break; } } } aux[i][j] = bun; } for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(c >= a[j]-a[i]) continue; bool bun=1; if(i+1<j-1 && prec[i+1][j-1] > lim - (a[j]+c-a[i])) bun=0; if(inainte[i][j] > lim) bun=0; if(aux[i][j]==0) bun=0; if(bun) return 1; } } } return 0; } long long find_shortcut(int32_t cit_n, std::vector<int32_t> l, std::vector<int32_t> citd, int32_t cit_c) { n = cit_n; c = cit_c; for(int i=2;i<=n;i++) a[i] = a[i-1] + l[i-2]; for(int i=1;i<=n;i++) { d[i] = citd[i-1]; } worst_pref[0] = -INF; for(int i=1;i<=n;i++) worst_pref[i] = max(worst_pref[i-1], -a[i] + d[i]); worst_suff[n+1] = -INF; for(int i=n;i>0;i--) worst_suff[i] = max(worst_suff[i+1], a[i] + d[i]); only_pref[0] = -INF; for(int i=1;i<=n;i++) only_pref[i] = max({only_pref[i-1], a[i] + d[i] + worst_pref[i-1], d[i]}); only_suff[n+1] = -INF; for(int i=n;i>0;i--) only_suff[i] = max({only_suff[i+1], -a[i] + d[i] + worst_suff[i+1], d[i]}); int cv=0; for(int i=1;i<=n;i++) cv = max(cv, d[i]); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(c >= a[j]-a[i]) continue; int mxm=0; mxm = max(mxm, a[i] + worst_pref[i] + c + worst_suff[j] - a[j]); mxm = max(mxm, only_pref[i]); mxm = max(mxm, only_suff[j]); mxm = max(mxm, c); mxm = max(mxm, cv); inainte[i][j] = mxm; } } int st=0,dr=INF,ans=INF; while(st<=dr) { int mij=(st+dr)/2; if(verif(mij)) { ans = mij; dr = mij-1; } else st = mij+1; } return ans; } /* 4 10 10 20 20 0 40 0 30 output: 80 9 30 10 10 10 10 10 10 10 10 20 0 30 0 0 40 0 40 0 output: 110 */

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

shortcut.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
shortcut_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...