Submission #1151386

#TimeUsernameProblemLanguageResultExecution timeMemory
1151386DeadlyCriticK blocks (IZhO14_blocks)C++20
53 / 100
56 ms9896 KiB
// template.cpp // use inp.txt/out.txt for file IO /* Pragma: If ever in doubt about whether your pragmas are correct, turn on most compiler warnings with the command-line option -Wall(or the more specific -Wunknown-pragmas). use assert(__builtin_cpu_supports("avx2")) to check if intruction set is available */ // #pragma GCC optimize ("O2,unroll-loops") // #pragma GCC optimize("no-stack-protector,fast-math") // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") // #pragma GCC optimize("O3","unroll-loops") // #pragma GCC optimize ("Ofast") // #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt") // #pragma GCC target("sse4") // instead of avx2 // __attribute__((target("avx2"), optimize("O3", "unroll-loops"))) #include <bits/stdc++.h> #define oo (1000'000'000'000'000'000LL) #define cif(i, n) for(int i = 0; i < n; i++) #define ccif(i, l, r) for(int i = l; i < r; i++) #define rif(i, n) for(int i = n-1; i >= 0; i--) #define rrif(i, l, r) for(int i = r-1; i >= l; i--) #define scan(a, __n) {for(int __ = 0; __ < __n; __++)cin >> a[__];} #define print(a, __n) {for(int __ = 0; __ < __n; __++)cout << a[__] << ' '; cout << '\n';} #define sz(s) ((int)s.size()) #define dbg(x) cerr << #x << " : " << x << endl; #define rep(i, l, r) for(int i = l; i < r; i++) // #define mset(a, chr) memset(a, chr, sizeof a) #define mset(a) memset(a, 0, sizeof a) #define int ll #define fastIO ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL); #define ff first #define ss second #define all(v) v.begin(), v.end() #define uni(v) sort(all(v)), v.resize(unique(all(v))-v.begin()); #define c0 (v<<1) #define c1 (c0|1) #define md ((l+r)/2) using namespace std; typedef unsigned long long ull; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi; typedef vector<ll> vl; typedef vector<pii> vii; typedef vector<pll> vll; typedef vector<ld> vd; typedef pair<ld, ld> pt; typedef vector<pt> vpt; ostream& operator<<(ostream& os, pt p) { return os << "(" << p.ff << "," << p.ss << ")"; } const ld PI = 3.14159265359; const int mod = 1e9+7; // const int maxFac = 1e6+7; // ll fac[maxFac], _fac[maxFac]; // ll po(ll b, ll p){ // b %= mod; // p %= mod-1; // ll r = 1; // while(p){ // if(p&1)r = r*b%mod; // p >>= 1; // b = b*b%mod; // } // return r; // } // ll choose(ll k, ll n){ // return fac[n]*_fac[k]%mod*_fac[n-k]%mod; // } // ll factorial(ll n, ll k){ // ll ret = 1; // for(ll i = n; i >= n-k+1; i--){ // ret = ret*i%mod; // } // return ret; // } // vii adj = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; const int maxN = 1e5+7; const int maxK = 1e2+7; ll seg[maxK][maxN]; ll dp[maxK][maxN]; void build(int v, int l, int r, int j){ if(r-l == 1){ seg[j][v] = dp[j][l]; } else{ build(c0, l, md, j); build(c1, md, r, j); seg[j][v] = min(seg[j][c0], seg[j][c1]); } } void upd(int v, int l, int r, int j, int po, ll vl){ if(r-l == 1){ seg[j][v] = vl; } else{ if(po < md){ upd(c0, l, md, j, po, vl); } else { upd(c1, md, r, j, po, vl); } seg[j][v] = min(seg[j][c0], seg[j][c1]); } } ll askmin(int v, int l, int r, int j, int ql, int qr){ if(ql <= l && r <= qr)return seg[j][v]; if(qr <= l || r <= ql)return oo; return min(askmin(c0, l, md, j, ql, qr), askmin(c1, md, r, j, ql, qr)); } inline void slv(){ int n, k; cin >> n >> k; ll a[n+1]; for(int i = 1; i <= n; i++)cin >> a[i]; for(int i = 0; i <= n; i++){ for(int j = 0; j <= k; j++){ dp[j][i] = oo; } } dp[0][0] = 0; for(int j = 0; j <= k; j++){ build(1, 0, n+1, j); } vi st; for(int i = 1; i <= n; i++){ while(sz(st) > 0 && a[st.back()] <= a[i])st.pop_back(); int ls = 0; if(sz(st))ls = st.back(); for(int j = 1; j <= k; j++){ dp[j][i] = a[i] + askmin(1, 0, n+1, j-1, ls, i); } if(sz(st)){ for(int j = 1; j <= k; j++){ dp[j][i] = min(dp[j][i], dp[j][st.back()]); } } for(int j = 1; j <= k; j++){ upd(1, 0, n+1, j, i, dp[j][i]); } st.push_back(i); } cout << askmin(1, 0, n+1, k, n, n+1) << '\n'; } /* */ inline void prep(){ // fac[0] = 1; // for(int i = 1; i < maxFac; i++)fac[i] = fac[i-1]*i%mod; // _fac[maxFac-1] = po(fac[maxFac-1], mod-2); // for(int i = maxFac-2; i >= 0; i--)_fac[i] = _fac[i+1]*(i+1)%mod; // w[0] = 1; // for(int i = 1; i < maxN; i++)w[i] = w[i-1]*p%mod; // _w[maxN-1] = po(w[maxN-1], mod-2); // for(int i = maxN-2; i >= 0; i--)_w[i] = _w[i+1]*p%mod; // for(int i = 2; i < maxN; i++){ // if(lp[i] == 0){ // lp[i] = i; // pr.push_back(i); // } // for (int j = 0; i * pr[j] < maxN; ++j) { // lp[i * pr[j]] = pr[j]; // if (pr[j] == lp[i]) { // break; // } // } // } } signed main(){ // freopen("blocks.in", "r", stdin); // freopen("blocks.out", "w", stdout); fastIO; // cout << fixed << setprecision (15); prep(); int t = 1; // cin >> t; while(t--){ // cout << slv() << '\n'; slv(); // string s; // cin >> s; // bool x = slv(); // cout << (x?"YES":"NO") << '\n'; } cout.flush(); } /* */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...