Submission #492859

#TimeUsernameProblemLanguageResultExecution timeMemory
492859balbitAliens (IOI16_aliens)C++14
100 / 100
887 ms24256 KiB
#include "aliens.h" #include <bits/stdc++.h> //#define int ll using namespace std; #define ll long long #define y1 zck_is_king #define pii pair<ll, ll> #define ull unsigned ll #define f first #define s second #define ALL(x) x.begin(),x.end() #define SZ(x) (int)x.size() #define MN(a,b) a = min(a,(__typeof__(a))(b)) #define MX(a,b) a = max(a,(__typeof__(a))(b)) #define pb push_back #define REP(i,n) for (int i = 0; i<n; ++i) #define RREP(i,n) for (int i = n-1; i>=0; --i) #define REP1(i,n) for (int i = 1; i<=n; ++i) #define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end())))) #ifdef BALBIT #define IOS() #define bug(...) fprintf(stderr,"#%d (%s) = ",__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 IOS() ios_base::sync_with_stdio(0);cin.tie(0); #define endl '\n' #define bug(...) #endif const int iinf = 1e9+10; const ll inf = 1ll<<60; const ll mod = 1e9+7 ; void GG(){cout<<"0\n"; exit(0);} ll mpow(ll a, ll n, ll mo = mod){ // a^n % mod ll re=1; while (n>0){ if (n&1) re = re*a %mo; a = a*a %mo; n>>=1; } return re; } ll inv (ll b, ll mo = mod){ if (b==1) return b; return (mo-mo/b) * inv(mo%b,mo) % mo; } const int MM = 1e6+5; const int NN = 1e5+5; ll reach[MM]; // where does this point reach ll over[NN]; // overcount for this index ll dp[NN], take[NN]; ll at[NN], to[NN]; inline ll SQ(ll x) {return x*x;} bool QTYPE = 0; struct Line{ mutable ll m, b, p, id; bool operator < (const Line &o) const { if (QTYPE) return p < o.p; return m < o.m; } }; struct LineContainer : multiset<Line> { ll div(ll A, ll B) { return A/B - ((A%B) && ((A^B)<0)); } bool isect (iterator x, iterator y) { if (y == end()) { x->p = inf; return false; } if (x->m == y->m) { x->p = x->b > y->b? inf : -inf; }else{ x->p = div(x->b - y->b, y->m - x->m); } return x->p >= y->p; } void add(ll m, ll b, int id) { m=-m; b=-b; auto z = insert({m,b,0,id}), y = z++, x = y; while (isect(y,z)) z = erase(z); if (x!=begin() && isect(--x, y)) { isect(x, y = erase(y)); } while ((y=x)!=begin() && (--x)->p >= y->p) { isect(x, erase(y)); } } pii query(ll x) { QTYPE = 1; auto it = lower_bound({0,0,x,-1}); ll ret = it->m * x + it->b; QTYPE = 0; return {-ret, it->id}; } }; pii brute(int n,ll pen) { // pen is (positive) penalty for each thing chosen LineContainer CV; REP(i,n+1) { if (i!=n && at[i] > to[i+1]) { over[i] = SQ(at[i] - to[i+1]); } if (i) { pii yo = CV.query(at[i]); dp[i] = yo.f + pen + SQ(at[i]); take[i] = take[yo.s]+1; bug(i, dp[i], take[i]); } CV.add(-2 * to[i+1], SQ(to[i+1]) - over[i] + dp[i], i); } return pii{dp[n], take[n]}; } long long take_photos(int n, int m, int k, std::vector<int> ROW, std::vector<int> COL) { ll re = 0; memset(reach, 0x3f, sizeof reach); REP(i,n) { int a = ROW[i], b = COL[i]; if (a > b) swap(a,b); MN(reach[b], a); } int nowdep = (0x3f3f3f3f)-1; vector<pii> use; for (int i = m-1; i>=0; --i) { if (reach[i] < nowdep) { nowdep = reach[i]; use.emplace_back(i, reach[i]); bug(i, reach[i]); } } reverse(ALL(use)); bug (SZ(use)); at[0] = to[0] = -1; REP(i, SZ(use)){ at[i+1] = use[i].f; to[i+1] = use[i].s-1; } { ll l = 0, r = 1e13; while (l!=r) { ll mid = (l+r)/2; pii hi = brute(SZ(use), mid); if (hi.s > k) { // taking too many! penalize!!! l = mid+1; }else{ r = mid; } } bug(l); pii go = brute(SZ(use), l); ll re = (go.s) * -l - (k-go.s)*l + go.f; bug(re, go.f, go.s); return re; } } //signed main(){ // ll r = take_photos(5, 7, 1, vector<int>{0, 4, 4, 4, 4}, vector<int>{3, 4, 6, 5, 6}); // cout<<r<<endl; //} // //signed main(){ // //}

Compilation message (stderr)

aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:131:8: warning: unused variable 're' [-Wunused-variable]
  131 |     ll re = 0;
      |        ^~
#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...