小红的直角三角形
思路:
当作向量来求,向量乘为0;
#include<bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
typedef pair<ll, ll> pll;
int n;
vector<pll> u;
void solve() {int x, y, l, r;cin >> x >> y >> l >> r;if (x * l + y * r == 0 || -x * (l - x) + (-y) * (r - y) == 0 || -l * (x - l) + (-r) * (y - r) == 0) {cout << "Yes" << endl;}else {cout << "No" << endl;}return;
}
int main(){ios::sync_with_stdio(false); // 禁用同步std::cin.tie(nullptr),std::cout.tie(nullptr); // 解除cin与cout绑定int t = 1;//cin >> t;while (t--) {solve();}return 0;
}
小红的好点对
思路:
因为在坐标轴上,所以只有同x轴/y轴相差为1才成立,(0,0)单独讨论与(1,0)(0,-1)(-1,0)(0,1)的情况;
#include<bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
typedef pair<int, int> pii;
int n;
void solve() {int n;cin >> n;vector<int>a, b;bool pan = false;int x, y;for (int i = 0; i < n; i++) {cin >> x >> y;if (x == 0 && y == 0) {pan = true;}else if(x==0) {a.push_back(y);}else {b.push_back(x);}}sort(a.begin(), a.end());sort(b.begin(), b.end());int ans = 0;if (!a.empty() && (a[0] == -1 || a[0] == 1)&&pan) {ans++;}for (int i = 1; i < a.size(); i++) {if (a[i] == 1 || a[i] == -1) {if (pan)ans++;}if (a[i] - a[i - 1] == 1) {ans++;}}if (!b.empty() && (b[0] == -1 || b[0] == 1) && pan) {ans++;}for (int i = 1; i < b.size(); i++) {if (b[i] == 1 || b[i] == -1) {if (pan)ans++;}if (b[i] - b[i - 1] == 1) {ans++;}}cout << ans << endl;return;
}
int main(){ios::sync_with_stdio(false); // 禁用同步std::cin.tie(nullptr),std::cout.tie(nullptr); // 解除cin与cout绑定int t = 1;//cin >> t;while (t--) {solve();}return 0;
}
小红的整数三角形
思路:
两种情况,若y1!=y2,C点位(x1+(-)2,y1)或(x2+(-)2,y2) S=2*|y1-y2|/2;
若y1=y1,C点位(x1,y+(-)21)或(x2,y2+(-)2) S=2*|x1-x2|/2;
#include<bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
typedef pair<int, int> pii;
int n;
void solve() {ll x, y, l, r;cin >> x >> y >> l >> r;ll q = y - r;if (q != 0) {cout << l + 2 << " " << r << endl;}else {cout << l << " " << r+2 << endl;}return;
}
int main(){ios::sync_with_stdio(false); // 禁用同步std::cin.tie(nullptr),std::cout.tie(nullptr); // 解除cin与cout绑定int t = 1;//cin >> t;while (t--) {solve();}return 0;
}
小红的马
思路:
两个map,一个存可以吃到兵的所以点位+该点位可以吃几个兵,第二个map存,兵的点位
最后遍历第一个map,并舍去第二个map存在的点后,取最大值。
#include<bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
typedef pair<int, int> pii;
pii b[8] = { {-1,2},{-1,-2},{1,2},{1,-2},{-2,1},{-2,-1},{2,1},{2,-1} };
void solve() {int n;cin >> n;pii a;map<pii, int> f, pan;for (int i = 0; i < n; i++) {cin >> a.first >> a.second;pan.insert({ a, 0 });for (int j = 0; j < 8; j++) {auto it = f.find({ a.first + b[j].first,a.second + b[j].second });if (it == f.end()) {f.insert({ { a.first + b[j].first,a.second + b[j].second },1 });}else {(*it).second++;}}}int max_f = 0;pii g = { n,n };for (auto& it : f) {if (it.first.first < 1 || it.first.second < 1) {continue;}auto yy = pan.find(it.first);if (yy == pan.end()) {if (max_f < it.second) {g = it.first;max_f = it.second;}}}cout << g.first<<" "<<g.second << endl;return;
}
int main(){ios::sync_with_stdio(false); // 禁用同步std::cin.tie(nullptr),std::cout.tie(nullptr); // 解除cin与cout绑定int t = 1;//cin >> t;while (t--) {solve();}return 0;
}
小红的好矩形
思路:
- 预处理:将点按
x
坐标和y
坐标分别排序,方便后续处理。 - 查找满足条件的点:对于每个点,检查是否存在
(x+1, y)
或(x, y+1)
。 - 统计点对:
- 对于相同
x
坐标的点,统计满足(x+1, y)
存在的点数目,计算组合数。 - 对于相同
y
坐标的点,统计满足(x, y+1)
存在的点数目,计算组合数。
- 对于相同
- 去重处理:如果存在点同时满足
(x+1, y)
和(x, y+1)
,需要减去重复计数的情况。
#include<bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
typedef pair<int, int> pii;
int n;
vector<pii> u;
bool find(pii q) {q.first++;int l = 0, r = n - 1;while (l < r) {int mid = (l + r) / 2;if (u[mid] > q) {r = mid - 1;}else if(u[mid]<q) {l = mid + 1;}else {return true;}}if (u[l] == q) {return true;}else {return false;}
}
void solve() {cin >> n;vector<pii> a(n), b(n);for (int i = 0; i < n; i++) {cin >> a[i].first >> a[i].second;b[i].second = a[i].first, b[i].first = a[i].second;}sort(a.begin(), a.end());sort(b.begin(), b.end());ll ans = 0;int i = 0;u = a;while (i < n) {while (i<n&&!find(a[i])) {i++;}if (i >= n) {break;}pii w = a[i];i++;if (i >= n) {break;}ll sum = 1;for (; i < n&&w.first==a[i].first; i++) {if (find(a[i])) {sum++;}}ans += (sum - 1) * sum / 2;}i = 0;u = b;while (i < n) {while (i < n && !find(b[i])) {i++;}if (i >= n) {break;}pii w = b[i];i++;if (i >= n) {break;}ll sum = 1;for (; i < n && w.first == b[i].first; i++) {if (find(b[i])) {sum++;}}ans += (sum - 1) * sum / 2;}for (int i = 0; i < n; i++) {if (i + 1 < n && b[i].first == b[i + 1].first &&b[i+1].second-b[i].second==1&& find(b[i]) && find(b[i + 1])) {ans--;}}cout << ans << endl;return;
}
int main(){ios::sync_with_stdio(false); // 禁用同步std::cin.tie(nullptr),std::cout.tie(nullptr); // 解除cin与cout绑定int t = 1;//cin >> t;while (t--) {solve();}return 0;
}