zoukankan      html  css  js  c++  java
  • 【poj3207】Ikki's Story IV

    传送门

    题意:
    给出一个圆,圆上有(n)个点,依次为(0,1,cdots,n-1)
    现在要连接(m)对点,每次连接时可以直接从里面连,也可以从外面连。
    最后问,连完这(m)对点后,是否有线相交。

    思路:
    每次连接时可以直接从里面连,也可以从外面连,那么可以考虑这个问题是一个(2-sat)模型。(2-sat)模型一般可以表示为:((x_1igvee x_2)igwedge (x_3igvee x_4)igwedge cdots)。大概就是这样,每个括号里面有两个变量。
    那么我们现在将矛盾找出来,这个在纸上画一下就比较好找了。
    最后的二元关系是:两个变量(x_i,x_j)只能选一个,也就是说一个往里面连,另一个往外面连。
    所以我们连边(x_i' ightarrow x_j,x_j' ightarrow x_i,x_i ightarrow x_j',x_j ightarrow x_i')即可,表示两者选择一个。
    感觉这个题数据好水,后面做一个类似的题的时候代码被hack了。

    /*
     * Author:  heyuhhh
     * Created Time:  2019/11/29 15:38:08
     */
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <cmath>
    #include <set>
    #include <map>
    #include <iomanip>
    #include <cstring>
    #define MP make_pair
    #define fi first
    #define se second
    #define sz(x) (int)(x).size()
    #define all(x) (x).begin(), (x).end()
    #define INF 0x3f3f3f3f
    #define Local
    #ifdef Local
      #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
      void err() { std::cout << '
    '; }
      template<typename T, typename...Args>
      void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
    #else
      #define dbg(...)
    #endif
    void pt() {std::cout << '
    '; }
    template<typename T, typename...Args>
    void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> pii;
    //head
    const int N = 2005;
    
    int n, m;
    int a[N], b[N];
    
    vector<int> G[N], rG[N], vs;
    int used[N], bel[N];
    
    void adde(int from, int to) {
        G[from].push_back(to);
        rG[to].push_back(from);
    }
    
    void dfs(int v) {
        used[v] = true;
        for(int i = 0; i < sz(G[v]); i++) {
            int u = G[v][i];
            if(!used[u])
                dfs(u);
        }
        vs.push_back(v);
    }
    
    void rdfs(int v, int k) {
        used[v] = true;
        bel[v] = k;
        for(int i = 0; i < sz(G[v]); i++) {
            int u = G[v][i];
            if(!used[u])
                rdfs(u, k);
        }
    }
    
    int scc() {
        memset(used, 0, sizeof(used));
        vs.clear();
        for(int v = 1; v <= 2 * m; ++v)
            if(!used[v]) dfs(v);
        memset(used, 0, sizeof(used));
        int k = 0;
        for(int i = (int) vs.size() - 1; i >= 0; --i)
            if(!used[vs[i]]) rdfs(vs[i], k++);
        return k;
    }
    
    bool cross(int x, int y) {
        if(a[x] < a[y] && b[x] > a[y] && b[x] < b[y]) return true;
        if(a[x] < b[y] && a[x] > a[y] && b[x] > b[y]) return true;
        return false;
    }
    
    void run(){
        for(int i = 1; i <= m; i++) {
            cin >> a[i] >> b[i];
            if(a[i] > b[i]) swap(a[i], b[i]);
        }
        for(int i = 1; i <= m; i++) {
            for(int j = i + 1; j <= m; j++) {
                if(cross(i, j)) {
                    adde(2 * i - 1, 2 * j);
                    adde(2 * i, 2 * j - 1);
                    adde(2 * j - 1, 2 * i);
                    adde(2 * j, 2 * i - 1);
                }
            }
        }
        scc();
        for(int i = 1; i <= m; i++) {
            if(bel[2 * i] == bel[2 * i - 1]) {
                cout << "the evil panda is lying again" << '
    ';
                return;
            }   
        }
        cout << "panda is telling the truth..." << '
    ';
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        cout << fixed << setprecision(20);
        while(cin >> n >> m) run();
        return 0;
    }
    
  • 相关阅读:
    Python-pymysql
    MySQL学习(3)
    MySQL学习(1)
    MySQL与PostgreSQL哪个更好?
    svn与git区别
    journalctl常用命令
    Spring Cloud 生产环境性能优化
    springcloud优雅停止上下线与熔断
    istio基础详解
    微服务的全链路监控
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/11965804.html
Copyright © 2011-2022 走看看