象限

杭电OJ 1152(C++)

≡放荡痞女 提交于 2020-02-25 01:29:06
基础题。输入奇数个点,按输入顺序最中间的点为原点,分成四个象限。 右上、左下象限中点的个数为A的得分,左上、右下象限中点的个数为B的得分,输出两者得分即可。 #include <iostream> using namespace std; const int MAXN = 200005; int point[MAXN][2]; int main() { int n; while (cin >> n) { if (n == 0) break; for (int i = 0; i < n; i++) { cin >> point[i][0] >> point[i][1]; } int x = point[n / 2][0]; int y = point[n / 2][1]; int scoreA = 0, scoreB = 0; for (int i = 0; i < n; i++) { if ((point[i][0] > x && point[i][1] > y) || (point[i][0] < x && point[i][1] < y)) ++scoreA; else if ((point[i][0] > x && point[i][1] < y) || (point[i][0] < x && point[i][1] > y)) ++scoreB; } cout <<

Day7 T1 直角三角形

为君一笑 提交于 2019-11-29 11:35:46
题目 二维平面坐标系中有N个点。从N个点选择3个点,问有多少选法使得这3个点形成直角三角形。 输入 第一行包含一个整数N(3 \(\leqslant\) N$\leqslant \(1500),表示点数。 接下来N行,每行包含两个用空格隔开的整数表示每个点的坐标,坐标值在\) -10^9$到 \(10^9\) 之间。每个点位置互不相同。 输出 输出直角三角形的数量。 样例 输入 输出 3 4 2 2 1 1 3 1 4 5 0 2 6 8 6 5 7 0 5 -1 1 -1 0 0 0 1 0 1 1 7 题解 固定一个点P,平移整个坐标系,使得P为原点。现在,对于每个点,首先确定其所在的象限,然后将其旋转k•90°(k∈Z),使其落在第一象限中。之后,按照过点的正比例函数的斜率k(纵坐标除以横坐标)对所有点进行排序。如果两个点斜率相同并且旋转之前在相邻的象限中,它们就能形成以P为直角顶点的直角三角形。排序后,对于每一组斜率相同的点,统计它们原来在每个象限的点的个数,并将相邻象限的点的数量相乘。时间复杂度为 \(O(N^2logN)\) 。(这就是为什么 \(O(N^3)\) 的暴力枚举在加一堆玄学优化后也能卡过:因为正解的时间复杂度也不低) #include<bits/stdc++.h> using namespace std; typedef long long ll; int