제출 #1080362

#제출 시각아이디문제언어결과실행 시간메모리
1080362EvirirDragon 2 (JOI17_dragon2)C++17
15 / 100
4042 ms36948 KiB
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
//using namespace __gnu_pbds;

// #pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2")
#define setp(x) cout<<fixed<<setprecision(x)
#define sz(x) (int)(x).size()
#define all(x) begin(x), end(x)
#define forn(i,a,b) for(int i=(a);i<(b);i++)
#define fore(i,a,b) for(int i=(a);i<=(b);i++)
#define pb push_back
#define F first
#define S second
#define fbo find_by_order
#define ook order_of_key
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> ii;
typedef vector<ll> vi;
typedef vector<ii> vii;
//template<typename T>
//using pbds = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
void SD(int t=0){ cout<<"PASSED "<<t<<endl; }
template<typename T> void amax(T &a, T b){ a=max(a,b); }
template<typename T> void amin(T &a, T b){ a=min(a,b); }
struct Hash {
	static uint64_t splitmix64(uint64_t x) {
		// http://xorshift.di.unimi.it/splitmix64.c
		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);
	}
};

const ll INF = ll(1e18);
const int MOD = 998244353;
const bool DEBUG = 0;
const int MAXN = 100005;
const int LG = 21;

int n,m;
vector<ii> p;
vector<ll> x, y, c;
ii s[2];
int Q;

int sign(ll x)
{
	if (x < 0) return -1;
	if (x == 0) return 0;
	return 1;
}

ll cross(ll x1, ll y1, ll x2, ll y2)
{
	return x1 * y2 - x2 * y1;
}

ll cross(const ii& p1, const ii& p2)
{
	return cross(p1.F, p1.S, p2.F, p2.S);
}

ii operator-(ii& p1, ii& p2)
{
	return {p1.F - p2.F, p1.S - p2.S};
}

int sideOf(ii& p1, ii& p2, ii& p3)  // 1=right, 0 = on line, -1 = left
{
	return sign(cross(p1 - p2, p3 - p2));
}

bool isect(int i, int j)
{
	int side1 = sideOf(s[0], p[i], p[j]);
	int side2 = sideOf(p[i], s[1], p[j]);
	int sidet = sideOf(s[0], p[i], s[1]);
	return side1 == side2 && side2 == sidet;
}

int main()
{
	cin.tie(0)->sync_with_stdio(0);

	cin>>n>>m;
	p.resize(n);
	x.resize(n);
	y.resize(n);
	c.resize(n);
	forn(i, 0, n)
	{
		cin >> x[i] >> y[i] >> c[i];
		p[i] = {x[i], y[i]};
		c[i]--;
	}
	forn(i, 0, 2) cin >> s[i].F >> s[i].S;

	int ans[m][m]{};
	forn(i, 0, n) forn(j, 0, n)
	{
		if (c[i] == c[j]) continue;
		if (isect(i, j)) ans[c[i]][c[j]]++;
	}

	cin>>Q;
	forn(z,0,Q)
	{
		int u,v; cin>>u>>v; u--; v--;
		cout << ans[u][v] << '\n';
	}

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...