Submission #1295270

#TimeUsernameProblemLanguageResultExecution timeMemory
1295270TymondIzvanzemaljci (COI21_izvanzemaljci)C++20
5 / 100
20 ms10208 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
#define fi first
#define se second
#define vi vector<int>
#define vll vector<long long>
#define pii pair<int, int>
#define pll pair<long long, long long>
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
mt19937_64 rng64(chrono::high_resolution_clock::now().time_since_epoch().count());
inline int rand(int l,int r){return uniform_int_distribution<int>(l, r)(rng);}
inline ll rand(ll l,ll r){return uniform_int_distribution<ll>(l, r)(rng64);}
#ifdef DEBUG
auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";}
auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";}
#define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X)
#else
#define debug(...){}
#endif

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

struct pair_hash{
  size_t operator()(const pair<int,int>&x)const{
    return hash<long long>()(((long long)x.first)^(((long long)x.second)<<32));
  }
};

const int INF = 2e9 + 7;
struct Node{
    int mxX, mnX, mxY, mnY;
    Node(){
        mxX = mxY = -INF;
        mnX = mnY = INF;
    }

    Node(int a, int b, int c, int d){
        mxX = a;
        mnX = b;
        mxY = c;
        mnY = d;
    }
};

const int BASE = (1 << 18);
Node tree[2 * BASE + 7];

bool comp(pii& x, pii& y){
    if(x.se != y.se){
        return x.se < y.se;
    }
    return x.fi < y.fi;
}

vector<pair<pii, int>> solve(vector<pii> a, int n, int k){
    if(k == 1){
        int mxX = -INF;
        int mxY = -INF;
        int mnX = INF;
        int mnY = INF;
        for(auto ele : a){
            mxX = max(mxX, ele.fi);
            mnX = min(mnX, ele.fi);
            mxY = max(mxY, ele.se);
            mnY = min(mnY, ele.se);
        }

        vector<pair<pii, int>> ret = {mp(mp(mnX, mnY), max(1, max(mxX - mnX, mxY - mnY)))};
        return ret;
    }

    sort(all(a), comp);
    if(k == 2){
        vector<pii> sufX(n + 1, mp(-INF, INF));
        vector<pii> sufY(n + 1, mp(-INF, INF));
        for(int i = n - 1; i >= 0; i--){
            sufX[i].fi = max(sufX[i + 1].fi, a[i].fi);
            sufX[i].se = min(sufX[i + 1].se, a[i].fi);
            sufY[i].fi = max(sufY[i + 1].fi, a[i].se);
            sufY[i].se = min(sufY[i + 1].se, a[i].se);
        }

        int mxX = -INF;
        int mxY = -INF;
        int mnX = INF;
        int mnY = INF;
        int best = INF;
       // debug(a);
        vector<pair<pii, int>> ret = {mp(mp(INF, INF), INF), mp(mp(INF, INF), INF)};
        for(int i = 0; i < n - 1; i++){
            mxX = max(mxX, a[i].fi);
            mnX = min(mnX, a[i].fi);
            mxY = max(mxY, a[i].se);
            mnY = min(mnY, a[i].se);
           // cerr << "----- " << i << '\n';
           // debug(a[i]);
           // cerr << mxX << ' ' << mnX << ' ' << mxY << ' ' << mnY << '\n';
           // debug(sufX[i + 1]);
           // debug(sufY[i + 1]);

            int nbest = max({1, sufX[i + 1].fi - sufX[i + 1].se, sufY[i + 1].fi - sufY[i + 1].se, mxX - mnX, mxY - mnY});
           // cerr << nbest << '\n';
            if(nbest < best && (sufY[i + 1].se > mxY || sufX[i + 1].se > mxX || sufX[i + 1].fi < mnX)){
                best = nbest;
                ret = {mp(mp(sufX[i + 1].se, sufY[i + 1].se), max({1, sufX[i + 1].fi - sufX[i + 1].se, sufY[i + 1].fi - sufY[i + 1].se}))};
                pii upper = mp(mxX, mxY);
                upper.fi -= max({1, mxX - mnX, mxY - mnY});
                upper.se -= max({1, mxX - mnX, mxY - mnY});
                ret.pb(mp(upper, max({1, mxX - mnX, mxY - mnY})));
                //debug(ret);
            }
        }
        return ret;
    }

    sort(all(a));
    map<pii, int> m;
    for(int i = 0; i < n; i++){
        m[a[i]] = i;
    }
    sort(all(a), comp);

    for(int i = 1; i <= 2 * BASE; i++){
        tree[i] = Node();
    }

    int i = 0;
    while(i < n){
        int pocz = i;
        while(i + 1 < n && a[i + 1].se == a[i].se){
            i++;
        }


    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int n, k;
    cin >> n >> k;
    vector<pii> a(n);
    for(int i = 0; i < n; i++){
        cin >> a[i].fi >> a[i].se;
    }

    if(n < k){
        sort(all(a));
        if(n == 1){
            vector<pair<pii, int>> res = {mp(a[0], 1)};
            for(int j = 2; j <= k; j++){
                int x = (j == 2 ? (int)1e9 : (int)-1e9);
                res.pb(mp(mp(x, 0), 1));
            }
            for(auto ele : res){
                cout << ele.fi.fi << ' ' << ele.fi.se << ' ' << ele.se << '\n';
            }
        }else if(n == 2){
            vector<pair<pii, int>> res = {mp(mp(a[0].fi - 1, a[0].se - 1), 1), mp(a[1],1)};
            for(auto ele : res){
                cout << ele.fi.fi << ' ' << ele.fi.se << ' ' << ele.se << '\n';
            }
        }
        return 0;
    }

    vector<pair<pii, int>> res;
    int best = INF;
    for(int i = 0; i < 2; i++){
        for(int j = 0; j < 2; j++){
            vector<pair<pii, int>> curr = solve(a, n, k);
            int nbest = -INF;
            for(auto ele : curr){
                nbest = max(nbest, ele.se);
            }

            if(nbest <= best){
                //cerr << i << ' ' << j << '\n';
                if(i && j){
                  //  debug(a);
                 //   debug(nbest);
                 //   debug(curr);
                    for(auto& ele : curr){
                        ele.fi.se = -ele.fi.se  - ele.se;
                        swap(ele.fi.fi, ele.fi.se);
                    }
                }else if(j){
                    for(auto& ele : curr){
                        ele.fi.se = -ele.fi.se - ele.se;
                    }
                }else if(i){
                    for(auto& ele : curr){
                        swap(ele.fi.fi, ele.fi.se);
                    }
                }
              //  debug(nbest);
             //  debug(curr);
                res = curr;
                best = nbest;
            }

            for(int j2 = 0; j2 < n; j2++){
                a[j2].se = -a[j2].se;
            }
        }
        for(int j2 = 0; j2 < n; j2++){
            swap(a[j2].fi, a[j2].se);
        }
    }

    for(auto ele : res){
        cout << ele.fi.fi << ' ' << ele.fi.se << ' ' << ele.se << '\n';
    }

    return 0;
}

Compilation message (stderr)

izvanzemaljci.cpp: In function 'std::vector<std::pair<std::pair<int, int>, int> > solve(std::vector<std::pair<int, int> >, int, int)':
izvanzemaljci.cpp:155:1: warning: control reaches end of non-void function [-Wreturn-type]
  155 | }
      | ^
#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...