Submission #140346

# Submission time Handle Problem Language Result Execution time Memory
140346 2019-08-02T15:10:51 Z egorlifar Printed Circuit Board (CEOI12_circuit) C++17
30 / 100
100 ms 31880 KB
/*
ЗАПУСКАЕМ
░ГУСЯ░▄▀▀▀▄░РАБОТЯГУ░░
▄███▀░◐░░░▌░░░░░░░
░░░░▌░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░▄▀▒▒▀▀▀▀▄
░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄
░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░▄▄▌▌▄▌▌░░░░░
 */
#include <iostream>
#include <complex>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdio>
#include <numeric>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <list>
#include <cmath>
#include <bitset>
#include <cassert>
#include <queue>
#include <stack>
#include <deque>
#include <random>
 
using namespace std;
template<typename T1, typename T2>inline void chkmin(T1 &x, T2 y) { x = (x > y ? y: x);}
template<typename T1, typename T2>inline void chkmax(T1 &x, T2 y) { x = (x < y ? y: x);}
#define sz(c) (int)(c).size()
#define all(c) (c).begin(), (c).end()
#define rall(c) (c).rbegin(), (c).rend()
#define left left224
#define right right224
#define next next224
#define rank rank224
#define prev prev224
#define y1 y1224
#define read(FILENAME) freopen((FILENAME + ".in").c_str(), "r", stdin)
#define write(FILENAME) freopen((FILENAME + ".out").c_str(), "w", stdout)
#define files(FILENAME) read(FILENAME), write(FILENAME)
#define pb push_back
#define mp make_pair
const string FILENAME = "input";
const int MAXN = 200228;


struct point
{
    int x, y;
    int id;
    point(){}
    point(int _x, int _y) {
        x = _x;
        y = _y;
    }
};


bool good[MAXN];


point operator +(const point &a, const point &b) {
    return point(a.x + b.x, a.y + b.y);
}


point operator -(const point &a, const point &b) {
    return point(a.x - b.x, a.y - b.y);
}


long long dist(const point &a, const point &b) {
    return 1LL * (a.x - b.x) * (a.x - b.x) + 1LL * (a.y - b.y) * (a.y - b.y);
}


long long vec(const point &a, const point &b) {
    return 1LL * a.x * b.y - 1LL * a.y * b.x;
}


bool operator <(const point &a, const point &b) {
    return mp(a.x, a.y) < mp(b.x, b.y);
    return dist(a, point(0, 0)) < dist(b, point(0, 0));
}

int n;
point p[MAXN];
point g;


bool comp(const point &a, const point &b) {
    long long s = vec(a, b);
    if (s == 0) {
        return dist(a, point(0, 0)) < dist(b, point(0, 0));
    }
    return s > 0;
}


bool operator ==(const point &a, const point &b) {
    return a.x == b.x && a.y == b.y;
}


bool intersect(point a, point b, point c) {
    if (c == a || c == b) {
        return false;
    }
    long long s = vec(a, c);
    long long s1 = vec(c, b);
    if (s == 0) {
        return dist(point(0, 0), a) < dist(point(0, 0), c);
    }
    if (s1 == 0) {
        return dist(point(0, 0), b) < dist(point(0, 0), c);
    }
    if (s > 0 && s1 < 0) {
        return false;
    }
    if (s < 0 && s1 > 0) {
        return false;
    }
    s = vec(c - a, b - a);
    s1 = vec(b - a, point(0, 0) - a);
    if (s > 0 && s1 < 0) {
        return false;
    }
    if (s < 0 && s1 > 0) {
        return false;
    }
    return true;
}



set<pair<point, pair<point, point> > >  s;
point q[MAXN];
int where[MAXN];
vector<pair<point, point> >add[MAXN], del[MAXN]; 


int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    //read(FILENAME); 
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> p[i].x >> p[i].y;
        p[i].id = i + 1;
        q[i] = p[i];
    }
    sort(p, p + n, comp);
    for (int i = 0; i < n; i++) {
        where[p[i].id] = i;
    }
    for (int i = 0; i < n; i++) {
        int j = where[i + 1];
        int k = where[(i + 1) % n + 1];
        point a = q[i];
        point b = q[(i + 1) % n];
        if (j > k) {
            swap(j, k);
            swap(a, b);
        }
        s.insert({a + b, {a, b}});
        //add[j].pb({a, b});
        //del[k].pb({a, b});
    }
    vector<int> f;
    for (int i = 0; i < n; i++) {
        bool bad = false;
        int cnt = 0;
        for (auto x: s) {
            if (intersect(x.second.first, x.second.second, p[i])) {
                bad = true;
                break;
            }
            cnt++;
            // if (cnt >= 5) {
            //     break;
            // }
        }
        
        // for (auto x: add[i]) {
        //     point d = x.first + x.second;
        //     s.insert({d, x});
        // }
        cnt = 0;
         for (auto x: s) {
            if (intersect(x.second.first, x.second.second, p[i])) {
                bad = true;
                break;
            }
            cnt++;
            // if (cnt >= 5) {
            //     break;
            // }
        }
        // for (auto x: del[i]) {
        //     point d = x.first + x.second;
        //     s.erase({d, x});
        // }
        if (!bad) {
            good[p[i].id] = true;
        }
    }
    for (int i = 1; i <= n; i++) {
        if (good[i]) {
            f.pb(i);
        }
    }
    cout << sz(f) << '\n';
    for (auto x: f) {
        cout << x << ' ';
    }
    cout << endl;
    return 0; 
}


# Verdict Execution time Memory Grader output
1 Correct 11 ms 9848 KB Output is correct
2 Correct 14 ms 9848 KB Output is correct
3 Execution timed out 321 ms 10232 KB Time limit exceeded
4 Execution timed out 663 ms 10268 KB Time limit exceeded
5 Correct 81 ms 11000 KB Output is correct
6 Correct 86 ms 10932 KB Output is correct
7 Execution timed out 202 ms 12124 KB Time limit exceeded
8 Correct 83 ms 10768 KB Output is correct
9 Execution timed out 1067 ms 10876 KB Time limit exceeded
10 Execution timed out 101 ms 11000 KB Time limit exceeded
11 Execution timed out 110 ms 11128 KB Time limit exceeded
12 Execution timed out 1074 ms 12024 KB Time limit exceeded
13 Execution timed out 507 ms 13432 KB Time limit exceeded
14 Correct 54 ms 14072 KB Output is correct
15 Execution timed out 1081 ms 15096 KB Time limit exceeded
16 Execution timed out 1073 ms 20984 KB Time limit exceeded
17 Execution timed out 1079 ms 20472 KB Time limit exceeded
18 Execution timed out 1078 ms 31868 KB Time limit exceeded
19 Execution timed out 1065 ms 31880 KB Time limit exceeded
20 Execution timed out 1070 ms 31868 KB Time limit exceeded