2019.5.10
CF1163A Eating Soup
简单题。
CF1163B2 Cat Party (Hard Edition)
暴力是 \(O(n^2)\) 的,也就是 CF1163B1,不过没打。
正解是 \(O(n \log n)\) 的,用 set 优化一下暴力即可,有一定思维难度,实现中细节也比较多,WA 了三发。
CF1163C2 Power Transmission (Hard Edition)
并不知道 CF1163C1 是用来干嘛的,感觉正解似乎也挺暴力的。
简单的组合计数,但是有很多小细节值得注意,最终写出来的代码像个“艺术品”,所以贴一下代码。
#include <bits/stdc++.h>
#define pii pair<int, int>
#define mp make_pair
#define ll long long
using namespace std;
const int N = 1e3 + 6, inf = 1e9;
int n, X[N], Y[N], tp, tt;
map<pii, int> p, m;
set<int> s[N*N];
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
inline pii work(int a, int b, int c, int d) {
if (a == c) {
if (!p[mp(inf,0)]) p[mp(inf,0)] = ++tp;
if (!m[mp(a,c)]) m[mp(a,c)] = ++tt;
return mp(p[mp(inf,0)], m[mp(a,c)]);
}
if (b == d) {
if (!p[mp(0,inf)]) p[mp(0,inf)] = ++tp;
if (!m[mp(b,d)]) m[mp(b,d)] = ++tt;
return mp(p[mp(0,inf)], m[mp(b,d)]);
}
if (a > c) swap(a, c), swap(b, d);
int dd = gcd(abs(d - b), c - a);
int x = b * c - a * d, y = c - a, g = gcd(abs(x), y);
if (!p[mp((d-b)/dd,(c-a)/dd)]) p[mp((d-b)/dd,(c-a)/dd)] = ++tp;
if (!m[mp(x/g,y/g)]) m[mp(x/g,y/g)] = ++tt;
return mp(p[mp((d-b)/dd,(c-a)/dd)], m[mp(x/g,y/g)]);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
scanf("%d %d", &X[i], &Y[i]);
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++) {
pii o = work(X[i], Y[i], X[j], Y[j]);
s[o.first].insert(o.second);
}
ll sum = 0, now = 0;
for (int i = 1; i <= tp; i++) {
ll sz = s[i].size();
sum += sz;
now += sz * (sz - 1) / 2;
}
cout << sum * (sum - 1) / 2 - now << endl;
return 0;
}
2019.5.9
P5345 【XR-1】快乐肥宅
exBSGS + exCRT
XR-1 中小粉兔出了这道题,筹备时就做过一遍,当时 AC 了还帮小粉兔加强了数据,结果被自己的数据 Hack 到了 80 分。
今天重构了一遍发现细节好多,或许这是数论题的特点吧,之前的代码也一直调不对,弃了,以后有缘再做吧。