首页 > 其他分享 >vijos1697 平面几何

vijos1697 平面几何

时间:2024-06-19 21:43:01浏览次数:10  
标签:std 平面几何 join int dsu vijos1697 -- find

给定N条直线、M组位置关系(平行或垂直)和Q个查询,要求输出共有多少组平行线,并回答询问的直线之间的位置关系。

提示:种类并查集。

#include <bits/stdc++.h>
using i64 = long long;

struct DSU {
    std::vector<int> f;
    DSU(int n) {
        init(n);
    }
    void init(int n) {
        f.resize(n);
        std::iota(f.begin(), f.end(), 0);
    }
    int find(int x) {
        while (x != f[x]) {
            x = f[x] = f[f[x]];
        }
        return x;
    }
    void join(int x, int y) {
        x = find(x);
        y = find(y);
        if (x != y) {
            f[y] = x;
        }
    }
    bool same(int x, int y) {
        return find(x) == find(y);
    }
};

void solve() {
    int N, M, Q;
    std::cin >> N >> M >> Q;
    bool ok = true;
    DSU dsu(2*N);
    for (int i = 0; i < M; i++) {
        std::string a, b, c;
        std::cin >> a >> b >> c;
        int u = std::stoi(a.substr(1));
        int v = std::stoi(c.substr(1));
        u--, v--;
        if (b == "p") {
            if (dsu.same(u, v+N)) {
                ok = false;
                continue;
            }
            dsu.join(u, v);
            dsu.join(u+N, v+N);
        } else {
            if (dsu.same(u, v)) {
                ok = false;
                continue;
            }
            dsu.join(u, v+N);
            dsu.join(u+N, v);
        }
    }
    if (!ok) {
        std::cout << "There must be something wrong...\n";
        return;
    }
    std::map<int,int> cnt;
    for (int i = 0; i < N; i++) {
        int f = dsu.find(i);
        cnt[f] += 1;
    }
    int ans = 0;
    for (auto &kv : cnt) {
        ans += kv.second * (kv.second - 1) / 2;
    }
    std::cout << ans << "\n";
    for (int i = 0; i < Q; i++) {
        std::string a, b;
        std::cin >> a >> b;
        int u = std::stoi(a.substr(1));
        int v = std::stoi(b.substr(1));
        u--, v--;
        if (dsu.same(u, v)) {
            std::cout << "Parallel.\n";
        } else if (dsu.same(u, v+N)) {
            std::cout << "Vertical.\n";
        } else {
            std::cout << "No idea.\n";
        }
    }
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:std,平面几何,join,int,dsu,vijos1697,--,find
From: https://www.cnblogs.com/chenfy27/p/18257487

相关文章

  • 【学习笔记】关于数论与平面几何的一切
    快速幂人话求\(a\)的\(n\)次方,其实就是根据二进制唯一分解定理给\(a^n\)拆成\(\log{n}\)个\(a^{2^i}\),递推求出从\(a^0\)到\(a^{2^i}\)每个数,如果\(n\)的二进制第\(i\)位为1,则将答案乘上\(a^{2^i}\)llQpow(lla,llb){//一开始a就是a的一次方llans=1;while(b......
  • 初中平面几何定理汇总
    射影定理条件:\(AB\perpBC,BD\perpAC\)。结论:\(AB^2=AD\timesAC\)\(BC^2=CD\timesCA\)\(BD^2=DA\timesDC\)线束定理条件:\(DE//BC\)。结论:\(\dfrac{DF}{FE}=\dfrac{BG}{GC}\)。角平分线定理条件:\(AD\)平分\(\angleBAC\)(或平分其外角)。结论:\(\dfrac{AB......
  • 高中数学竞赛——平面几何板块引航1
    出自平几引路人曹珏贇老师讲义,希望对大家有所帮助,想要学到思想的最好还是去听曹老师的课程......
  • PlaneGCS-平面几何约束求解器用法
    PlaneGCS-平面几何约束求解器用法[email protected]在传统的机械设计软件中,一般使用几何约束求解器来画草图,再通过对草图进行拉伸旋转等生成特征实现建模功能......
  • 万喜人《平面几何测试题集》题记
    更新到测试9暂时做的不是很好,日后完善常规题目通过倒角,全等,相似常规辅助线模块构型中的初级知识可以完成的题目[1]1,2,5(同一法)[2]1[3]1,2(等角共轭点),3......
  • 与单位圆内接三角形的心有关的平面几何常识
    单位圆上给出\((\cos\theta_1,\sin\theta_1),(\cos\theta_2,\sin\theta_2),...,(\cos\theta_n,\sin\theta_n)\)这\(n\)个互不相同的点,任选三个构成三角形,求解问题。【......