#include <bits/stdc++.h>
#define f first
#define s second
#define ll long long
#define pii pair<int,int>
using namespace std;
int N,C,W,H;
pii G;
pii camps[10010], trees[2010], lines[2010][2010];
pii sub(pii a, pii b){
    return {a.f-b.f,a.s-b.s};
}
bool cmp(pii a, pii b){
    int c = a.f+(!a.f)*a.s, d = b.f+(!b.f)*b.s;
    if(!c) return false;
    if(!d) return true;
    if(c < 0 && d > 0) return false;
    if(c > 0 && d < 0) return true;
    return (ll)a.s*b.f > (ll)a.f*b.s;
}
int finden(int i, pii a){
    return (upper_bound(lines[i],lines[i]+N-1,a,cmp)-lines[i])%(N-1);
}
int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> W >> H >> G.f >> G.s >> C;
    for(int i = 0;i<C;++i){
        cin >> camps[i].f >> camps[i].s;
    }
    cin >> N;
    for(int i = 0;i<N;++i){
        cin >> trees[i].f >> trees[i].s;
    }
    for(int i = 0;i<N;++i){
        for(int j = 0;j<N;++j){
            lines[i][j] = sub(trees[i],trees[j]);
        }
        sort(lines[i],lines[i]+N,cmp);
    }
    vector<int> ans;
    for(int i = 0;i<C;++i){
        bool poss = true;
        for(int j = 0;j<N;++j){
            if(finden(j,sub(G,trees[j])) != finden(j,sub(camps[i],trees[j]))){
                poss = false;
                break;
            }
        }
        if(poss) ans.push_back(i+1);
    }
    cout << ans.size() << "\n";
    for(int i = 0;i<ans.size();++i){
        if(i == ans.size()-1) cout << ans[i] << "\n";
        else cout << ans[i] << " ";
    }
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |