从 2019.5.9 开始的 OI 刷题记录

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 分。

今天重构了一遍发现细节好多,或许这是数论题的特点吧,之前的代码也一直调不对,弃了,以后有缘再做吧。

猜你喜欢

转载自www.cnblogs.com/xht37/p/10836111.html