Submission #209742

#TimeUsernameProblemLanguageResultExecution timeMemory
209742the_art_of_warAliens (IOI16_aliens)C++14
Compilation error
0 ms0 KiB
//
// Created by Ильдар Ялалов on 14.01.2020.
//
//#pragma GCC optimize("Ofast")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf_int = 1e9 + 100;
const ll inf_ll = 1e18;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef long double dbl;
typedef unsigned int uint;
#define pb push_back
#define eb emplace_back
const double pi = 3.1415926535898;
#define dout if(debug) cout
#define fi first
#define se second
#define sp setprecision
#define sz(a) (int(a.size()))
#define mp make_pair
#define all(a) a.begin(),a.end()
//region debug

template<class T1, class T2>
std::ostream &operator<<(std::ostream &out, const std::pair<T1, T2> &rhs) {
    out << "( " << rhs.first << " , " << rhs.second << " )";
    return out;
}

template<typename A, typename B>
string to_string(pair<A, B> p);

template<typename A, typename B, typename C>
string to_string(tuple<A, B, C> p);

template<typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p);

string to_string(const string &s) {
    return '"' + s + '"';
}

string to_string(const char *s) {
    return to_string((string) s);
}

string to_string(bool b) {
    return (b ? "true" : "false");
}

string to_string(vector<bool> v) {
    bool first = true;
    string res = "{";
    for (int i = 0; i < static_cast<int>(v.size()); i++) {
        if (!first) {
            res += ", ";
        }
        first = false;
        res += to_string(v[i]);
    }
    res += "}";
    return res;
}

template<size_t N>
string to_string(bitset<N> v) {
    string res = "";
    for (size_t i = 0; i < N; i++) {
        res += static_cast<char>('0' + v[i]);
    }
    return res;
}

template<typename A>
string to_string(A v) {
    bool first = true;
    string res = "{";
    for (const auto &x : v) {
        if (!first) {
            res += ", ";
        }
        first = false;
        res += to_string(x);
    }
    res += "}";
    return res;
}


template<typename A>
string to_string(vector<vector<A>> v) {
    bool first = true;
    string res = "{";
    for (const auto &x : v) {
        if (!first) {
            res += ", ";
        }
        first = false;
        res += to_string(x);
        res += "\n";
    }
    res += "}";
    return res;
}


template<typename A, typename B>
string to_string(pair<A, B> p) {
    return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}

template<typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
    return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")";
}

template<typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p) {
    return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " +
           to_string(get<3>(p)) + ")";
}

void debug_out() { cerr << endl; }

template<typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
    cerr << " " << to_string(H);
    debug_out(T...);
}
//endregion
#ifdef zxc1
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

bool debug = 0;
const int MAXN = 1e6 + 100;
const int LOG = 21;
const int mod = 1e9 + 7;
const int MX = (2e7 + 100);


struct Point {
    ll a;
    ll b;
    int cnt;

    Point() {
        a = b = 0;
    }
};

struct vertex_lichao {
    int l, r;
    Point p;

    vertex_lichao() {
        l = r = 0;
    }

    vertex_lichao(Point &P) {
        l = r = 0;
        p = P;
    }
};


inline pair<ll, int> get(const Point &cur, ll x) {
    return {cur.a + x * cur.b, cur.cnt};
}


vector<pii> good;

pair<ll, ll> dp[MAXN];


vector<Point> hull;

bool ccw(Point a, Point b, Point c) {
    return (long double)a.b * (b.a - c.a) + (long double)b.b * (c.a - a.a) + (long double)c.b * (a.a - b.a) >= 1e-9;
}

void add_point(Point &p) {
    while (sz(hull) >= 2 && !ccw(hull[sz(hull) - 2], hull[sz(hull) - 1], p)) {
        hull.pop_back();
    }
    hull.push_back(p);
}

int top = 0;

pair<ll, int> get_best(ll x) {
    top = min(top, sz(hull) - 1);
    while (top + 1 < sz(hull) && get(hull[top], x) >= get(hull[top + 1], x)) {
        top++;
    }
    return get(hull[top], x);
}

pll get_solve(ll cost) {
    pair<ll, int> prev = {0, 0};
    debug(cost);

    top = 0;
    hull.clear();


    for (int i = 0; i < sz(good); ++i) {
        ll spec = 0;
        int x = good[i].fi;
        int y = good[i].se;
        if (i > 0 && good[i - 1].se >= x) {
            spec = good[i - 1].se - x + 1;
            spec = spec * spec;
        }
        debug(spec);
        Point add;
        add.a = prev.fi + 1ll * x * x - spec;
        add.b = -2 * x;
        add.cnt = prev.se;

        add_point(add);

        debug(i);
        for (auto x : hull) {
            debug(x.a, x.b, x.cnt);
        }

        auto val = get_best(y + 1);
        val.first += 1ll * (y + 1) * (y + 1);
        val.se++;
        val.first += cost;
        dp[i] = val;
        prev = dp[i];

        debug(i, dp[i]);
    }
    return prev;
}

void solve() {
    int n, m, k;
    cin >> n >> m >> k;
    vector<pii> all_c;
    for (int i = 1; i <= n; ++i) {
        int r, c;
        cin >> r >> c;

        if (c < r)
            swap(r, c);

        all_c.pb({r, c});
    }

    sort(all(all_c));

    map<int, int> mp;
    for (auto x : all_c) {
        mp[x.fi] = x.se;
    }
    int mx = -1;
    for (auto x : mp) {
        if (mx >= x.se) {
            continue;
        }
        good.push_back(x);
        mx = max(mx, x.se);
    }
    debug(all_c);
    debug(good);

    ll l = 0, r = 1e13;
    pair<ll, int> last;
    ll cost = -1;
    while (l <= r) {
        ll mid = (l + r) >> 1;
        auto x = get_solve(mid);
        if (x.se <= k) {
            if (cost == -1 || mid <= cost) {
                last = x;
                cost = mid;
            }
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    assert(cost != -1);
    cout << last.fi - cost * k << "\n";


}

// CHECK LIMITS (n <= 10^5)
// CHECK CORNER CASES ( n==1)
signed main() {
#ifdef zxc
    freopen("../input.txt", "r", stdin);
//    freopen("../output.txt", "w", stdout);
#else
#endif //zxc
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cout.setf(ios::fixed);
    cout.precision(15);

    int t = 1;
    while (t--)
        solve();
    debug(1.0 * clock() / CLOCKS_PER_SEC);
}

Compilation message (stderr)

aliens.cpp: In function 'pll get_solve(ll)':
aliens.cpp:210:16: warning: statement has no effect [-Wunused-value]
     debug(cost);
                ^
aliens.cpp:224:20: warning: statement has no effect [-Wunused-value]
         debug(spec);
                    ^
aliens.cpp:232:17: warning: statement has no effect [-Wunused-value]
         debug(i);
                 ^
aliens.cpp:234:35: warning: statement has no effect [-Wunused-value]
             debug(x.a, x.b, x.cnt);
                                   ^
aliens.cpp:233:19: warning: variable 'x' set but not used [-Wunused-but-set-variable]
         for (auto x : hull) {
                   ^
aliens.cpp:244:24: warning: statement has no effect [-Wunused-value]
         debug(i, dp[i]);
                        ^
aliens.cpp: In function 'void solve()':
aliens.cpp:277:17: warning: statement has no effect [-Wunused-value]
     debug(all_c);
                 ^
aliens.cpp:278:16: warning: statement has no effect [-Wunused-value]
     debug(good);
                ^
aliens.cpp: In function 'int main()':
aliens.cpp:319:42: warning: statement has no effect [-Wunused-value]
     debug(1.0 * clock() / CLOCKS_PER_SEC);
                                          ^
/tmp/ccXY1Fxh.o: In function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'
/tmp/ccS32lUE.o:aliens.cpp:(.text.startup+0x0): first defined here
/tmp/ccXY1Fxh.o: In function `main':
grader.cpp:(.text.startup+0xdf): undefined reference to `take_photos(int, int, int, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)'
collect2: error: ld returned 1 exit status