CodeChef February Challenge 2018 Points Inside A Polygon (鸽笼原理)
2024-09-06 09:23:58
题意 给定一个$n$个点的凸多边形,求出$[ \frac{n}{10}]\ $个凸多边形内的整点。
把$n$个点分成$4$类:
- 横坐标奇,纵坐标奇
- 横坐标奇,纵坐标偶
- 横坐标偶,纵坐标奇
- 横坐标偶,纵坐标偶
根据鸽笼原理,这$4$类点中至少有一类点数目不小于$[ \frac{n}{4}]\ $
每一个类别中,每两个点的中点肯定为整点,并且当这两个点不在凸多边形上相邻的时候,
他们一定在凸多边形内。
那么把这$4$个类别里面的点分别处理就可以了。
(事实证明只选最多的那个类别其实就可以通过)
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL;
typedef pair <int, int> PII; const int N = 1e5 + 10; int T;
int n;
int x[N], y[N];
int p, q;
int cnt;
vector <int> a[2][2];
vector <PII> ans;
map <PII, int> mp; int main(){ scanf("%d", &T);
while (T--){
scanf("%d", &n);
ans.clear();
mp.clear();
rep(i, 0, 1) rep(j, 0, 1) a[i][j].clear();
rep(i, 1, n){
scanf("%d%d", x + i, y + i);
a[abs(x[i]) & 1][abs(y[i]) & 1].push_back(i);
} p = 0, q = 0;
rep(i, 0, 1) rep(j, 0, 1){
if (a[i][j].size() > a[p][q].size()){
p = i;
q = j;
}
} cnt = n / 10;
rep(i, 0, a[p][q].size() - 2){
rep(j, i + 1, a[p][q].size() - 1){
int l = a[p][q][i], r = a[p][q][j];
if ((l + 1 == r) || (l == 1 && r == n)) continue;
int nx = (x[l] + x[r]) >> 1;
int ny = (y[l] + y[r]) >> 1;
if (!mp.count(MP(nx, ny))){
ans.push_back(MP(nx, ny));
mp[MP(nx, ny)] = 1;
--cnt;
}
if (cnt == 0) break;
}
if (cnt == 0) break;
} for (auto u : ans) printf("%d %d\n", u.fi, u.se);
} return 0;
}
最新文章
- Spring和Mybatis整合,配置文件
- bzoj3631: [JLOI2014]松鼠的新家(LCA+差分)
- 使用OWIN 为WebAPI 宿主 跨平台
- 【BZOJ 3809】Gty的二逼妹子序列
- 关于CDH中开发Spark
- Thinking in Java--笔记(2)
- iOS UILabel自定义行间距时获取高度
- Python设计模式——单例模式
- 『重构--改善既有代码的设计』读书笔记----Change Value to Reference
- javascript 的基本优化
- MPEG2_TS流基本概念和数据结构
- hdu 2896 病毒侵袭 AC自动机(查找包含哪些子串)
- CTFcracktools——非常实用的CTF解密工具
- 语音识别(LSTM+CTC)
- webform运行时弹出JavaScript的alert窗口
- AAPTEXECPTION
- Spark streaming的执行流程
- [Android Pro] 深入理解函数的调用过程——栈帧
- 微服务(Microservice)那点事
- C++ vs Python向量运算速度评测