Submission #288309

#TimeUsernameProblemLanguageResultExecution timeMemory
288309egekabas휴가 (IOI14_holiday)C++14
47 / 100
5011 ms11036 KiB
//#include "grader.h" #include <bits/stdc++.h> #define all(x) (x).begin(), (x).end() #define ff first #define ss second #define pb push_back #define mp make_pair using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<ll, ll> pll; typedef pair<ull, ull> pull; typedef pair<int, int> pii; typedef pair<ld, ld> pld; struct tree{ vector<ll> seg; void init(ll n){ seg.resize(4*n+9); } void upd(ll v, ll tl, ll tr, ll idx, ll val){ if(tl == idx && tr == idx){ seg[v] += val; return; } if(idx <= (tl+tr)/2) upd(2*v, tl, (tl+tr)/2, idx, val); else upd(2*v+1, (tl+tr)/2+1, tr, idx, val); seg[v] = seg[2*v]+seg[2*v+1]; } pll get(ll v, ll tl, ll tr, ll val){ if(tl == tr) return {tl, max(0LL, seg[v]-val)}; if(seg[2*v+1] >= val) return get(2*v+1, (tl+tr)/2+1, tr, val); else return get(2*v, tl, (tl+tr)/2, val-seg[2*v+1]); } }; struct bit{ ll n; vector<ll> bit; void init(ll sz){ bit.resize(sz+1); n = sz; } void upd(ll idx, ll val){ for(++idx; idx > 0; idx -= idx&(-idx)) bit[idx] += val; } ll get(ll idx){ ll ret = 0; for(++idx; idx <= n; idx += idx&(-idx)) ret += bit[idx]; return ret; } }; vector<ll> mpp; ll maxn; ll get(ll x){ return lower_bound(all(mpp), x)-mpp.begin(); } int N, D; ll getval(vector<ll> v, ll lim){ tree s; bit b; s.init(maxn); b.init(maxn); ll ans = 0; for(int i = 0; i < v.size(); ++i){ s.upd(1, 0, maxn-1, v[i], 1); b.upd(v[i], mpp[v[i]]); if(lim-i <= 0) break; pll idx = s.get(1, 0, maxn-1, lim-i); //cout << i << ' ' << mpp[idx.ff] << '\n'; ans = max(ans, b.get(idx.ff)-mpp[idx.ff]*idx.ss); } return ans; } vector<ll> getvec(vector<ll> v, ll come){ vector<ll> ret(D); vector<ll> s; for(ll i = 0; i < v.size(); ++i){ s.insert(lower_bound(all(s), v[i], greater<ll>()), v[i]); ll cost = i; if(come) cost *= 2; ll val = 0; for(auto u : s){ ++cost; val += u; if(cost >= D) break; ret[cost] = max(ret[cost], val); } } for(ll i = 1; i < ret.size(); ++i) ret[i] = max(ret[i-1], ret[i]); return ret; } long long int findMaxAttraction(int n, int start, int d, int attraction[]) { N = n; D = d; for(int i = 0; i < n; ++i) mpp.pb(attraction[i]); sort(all(mpp)); mpp.resize(unique(all(mpp))-mpp.begin()); maxn = mpp.size(); for(int i = 0; i < n; ++i) attraction[i] = get(attraction[i]); if(start == 0){ vector<ll> v; for(int i = 0; i < n; ++i) v.pb(attraction[i]); return getval(v, d); } vector<ll> v1, v2, v3, v4; for(ll i = start; i < n; ++i) v1.pb(mpp[attraction[i]]); for(ll i = start+1; i < n; ++i) v2.pb(mpp[attraction[i]]); for(ll i = start; i >= 0; --i) v3.pb(mpp[attraction[i]]); for(ll i = start-1; i >= 0; --i) v4.pb(mpp[attraction[i]]); vector<ll> go1, come1, go2, come2; go1 = getvec(v2, 0); come1 = getvec(v1, 1); go2 = getvec(v4, 0); come2 = getvec(v3, 1); ll ans = 0; for(ll i = 0; i < d; ++i){ ans = max(ans, come1[i]+go2[d-i-1]); ans = max(ans, come2[i]+go1[d-i-1]); } vector<ll> v; for(int i = start; i < n; ++i) v.pb(attraction[i]); ans = max(ans, getval(v, d)); v.clear(); for(int i = start; i >= 0; --i) v.pb(attraction[i]); ans = max(ans, getval(v, d)); return ans; }

Compilation message (stderr)

holiday.cpp: In function 'll getval(std::vector<long long int>, ll)':
holiday.cpp:72:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |     for(int i = 0; i < v.size(); ++i){
      |                    ~~^~~~~~~~~~
holiday.cpp: In function 'std::vector<long long int> getvec(std::vector<long long int>, ll)':
holiday.cpp:85:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   85 |     for(ll i = 0; i < v.size(); ++i){
      |                   ~~^~~~~~~~~~
holiday.cpp:98:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |     for(ll i = 1; i < ret.size(); ++i)
      |                   ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...