G - Four Segments
这题没什么难度,但是好狗,我踩了很多坑
typedef struct {
int x, y;
}zb;
zb bb[15];
bool cmp(zb a, zb b) {
if (a.x == b.x) {
return a.y < b.y;
}
else return a.x < b.x;
}
bool ck(zb a, zb b) {
return a.x == b.x && a.y == b.y;
}
void solve() {
int x1, y1, x2, y2;
int l = 0;
int f = 0;
int x = 0, y = 0; //平行x轴和平行y轴的线段数量
for (int i = 0; i < 4; i++) {
cin >> x1 >> y1 >> x2 >> y2;
bb[l].x = x1;
bb[l++].y = y1;
bb[l].x = x2;
bb[l++].y = y2;
if (x1 == x2)y++;
if (y1 == y2)x++;
//判断是否有重点,有线段不平行于任何一轴,平行x轴和平行y轴的线段数量大于2
if (x1 == x2 && y1 == y2 || x1 != x2 && y1 != y2 || x > 2 || y > 2) {
f = 1;
}
}
if (f) {
cout << "NO\n";
return;
}
f = 0;
sort(bb, bb + l, cmp);
for (int i = 0; i < l - 1; i++) { //判断是否符合矩形条件(有4对相等的端点,但相同的端点个数不能超过两个)
if (!ck(bb[i], bb[i + 1]) && f == 0 || ck(bb[i], bb[i + 1]) && f == 1) {
cout << "NO\n";
return;
}
else if (!ck(bb[i], bb[i + 1]) && f == 1)f = 0;
else f = 1;
}
cout << "YES\n";
}
Problem - D - Codeforces (Unofficial mirror by Menci)
将是数字排序后分为3块,分别由3个人负责,通过二分,先找左边符合条件的最大区间,再找右边的最大区间,剩下的中间再判断是否满足条件。
const int N = 2e5 + 5;
int a[N];
void solve() {
int n;
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);
//将是数字排序后分为3块,分别由3个人负责,通过二分,先找左边符合条件的最大区间
//再找右边的最大区间,剩下的中间再判断是否满足条件
long long l = -1, r = 1e9;
while (r - l > 1) {
long long mid = (r + l) >> 1;
int i = 0, j = n - 1;
while (i + 1 < n && a[i + 1] - a[0] <= 2 * mid)i++; //左
while (j - 1 >= 0 && a[n - 1] - a[j - 1] <= 2 * mid)j--; //右
i++, j--;
if (i > j || a[j] - a[i] <= 2 * mid) { //中间
r = mid;
}
else l = mid;
}
cout << r << '\n';
}
I - Laptops
将原数组按照价格排序之后,遍历比较质量低下即可。
void solve() {
int n;
cin >> n;
int maxn = 0; int mb = 0;
int minn = 99999; int ib = 0;
for (int i = 0; i < n; i++) {
cin >> aa[i].a >> aa[i].b;
}
sort(aa, aa + n, cmp);
for (int i = 1; i < n; i++) {
if (aa[i - 1].b > aa[i].b) {
cout << "Happy Alex\n";
return;
}
}
cout << "Poor Alex\n";
}
https://vjudge.net/problem/AtCoder-abc300_d/origin
先求出数据范围内的所有素数,如何从小到大遍历。
typedef long long ll;
const int MAXN = 316228; //(sqrt(10^12))
vector<int> primes; //素数表
bool isPrime[MAXN+1];
void getprimes() { //获取素数表
fill(isPrime, isPrime + MAXN + 1, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i <= MAXN; i++) {
if (isPrime[i]) {
primes.push_back(i);
for (ll j = (ll) i * i; j <= MAXN; j += i) {
isPrime[j] = false;
}
}
}
}
void solve() {
getprimes();
ll n;
cin >> n;
ll ans = 0;
for (int i = 0; i < primes.size(); i++) {
ll a = primes[i];
if (a * a * a * a * a >= n)break;
for (int j = i + 1; j < primes.size(); j++) {
ll b = primes[j];
if (a * a * b * b * b >= n)break;
for (int k = j + 1; k < primes.size(); k++) {
ll c = primes[k];
if (a * a * b * c * c > n)break;
ans++;
}
}
}
cout << ans << '\n';
}