Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #define _USE_MATH_DEFINES
- #include <iostream>
- #include <fstream>
- #include <stdio.h>
- #include <string>
- #include <vector>
- #include <cmath>
- #include <algorithm>
- #include <set>
- #include <map>
- #include <ctime>
- #include <cstring>
- #include <iomanip>
- #include <random>
- #include <unordered_set>
- #include <unordered_map>
- #include <deque>
- #include <queue>
- #include <bitset>
- #include <sstream>
- using namespace std;
- #define mp make_pair
- #define X first
- #define Y second
- #define all(x) x.begin(), x.end()
- #define all_(x) x.rbegin(), x.rend()
- typedef unsigned int ui;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef long double ld;
- typedef pair<ll, ll> pll;
- typedef pair<int, int> pii;
- const int INF = 2e9 + 9;
- const ll INF1 = 1e18 + 9;
- const ll MAXN = 1e6 + 7;
- const ll MAXN1 = 32;
- const ll MAXN2 = 2e7 + 9;
- const ll MOD = 1e9 + 7;
- const ll MOD1 = 1e9 + 9;
- const ll ALPH = 50;
- const ll PW1 = 157;
- const ll PW2 = 199;
- const ll PW3 = 193;
- const ll PW4 = 117;
- const ld EPS = 1e-9;
- const ll BLOCK = 387;
- void solve();
- signed main(){
- srand('a' + 'l' + 'e' + 'x' + 'X' + '5' + '1' + '2');
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif // _DEBUG
- solve();
- }
- /*-------------------------------------------------------------------------------------------------------------*/
- pll operator-(pll a, pll b) {
- return mp(a.X - b.X, a.Y - b.Y);
- }
- ll cross(pll a, pll b) {
- return a.X * b.Y - a.Y * b.X;
- }
- bool point_in_triangle(pll a, pll b, pll c, pll p) {
- return abs(cross(b - a, c - a)) == abs(cross(b - a, p - a)) + abs(cross(c - a, p - a)) + abs(cross(b - c, p - c));
- }
- bool in(pll p, vector<pll> &v) {
- int l = 0, r = v.size() - 1;
- while (r - l > 1) {
- int m = (r + l) >> 1;
- if (cross(v[m] - v[0], p - v[0]) > 0) l = m;
- else r = m;
- }
- return point_in_triangle(v[l], v[r], v[0], p);
- }
- void solve() {
- int n, m;
- cin >> n >> m;
- vector<pll> v(n), v1(m);
- for (auto &i : v) cin >> i.X >> i.Y;
- for (auto &i : v1) cin >> i.X >> i.Y;
- int q;
- cin >> q;
- while (q--) {
- int k;
- cin >> k;
- vector<pll> vec, vec1;
- pll mn = mp(INF1, INF1);
- int ind = 0;
- for (int i = 0; i < k; ++i) {
- int a;
- cin >> a;
- vec.emplace_back(v[a - 1]);
- if (mn > v[a - 1]) {
- mn = v[a - 1];
- ind = i;
- }
- }
- reverse(all(vec));
- ind = k - ind - 1;
- for (int i = 0; i < k; ++i) {
- vec1.emplace_back(vec[(i + ind) % k]);
- }
- int ans = 0;
- for (auto &i : v1) if (in(i, vec1)) ++ans;
- cout << ans << "\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement