zoukankan      html  css  js  c++  java
  • ZOJ 3862【贪心】【枚举】

    题目链接

    题目大意是给定n条直线,2*n个点,通过交换任意直线的端点位置使得它们互不相交,容易想到可以通过按照坐标x,y大小排序的规则来交换它们的位置,即可保证所有直线不相交

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int INF = 0x3f3f3f3f;
    const int MAXN = 200005;
    typedef pair<int, int> P;
    struct node
    {
    	int x, y, id, link;
    	node(int _x, int _y, int _id = 0) {
    		x = _x, y = _y, id = _id;
    	}
    	bool operator<(const node &r) const {
    		return x == r.x && y < r.y || x < r.x;
    	}
    };
    int p[MAXN];
    int main() {
    	int T;
    	scanf("%d", &T);
    	while (T--)
    	{
    		int n;
    		scanf("%d", &n);
    		vector<node> v;
    		v.push_back({ -INF, -INF, 0 });
    		int x, y;
    		for (int i = 1; i <= 2 * n; ++i) {
    			scanf("%d%d", &x, &y);
    			v.push_back(node(x, y, i));
    		}
    		for (int i = 1; i <= n; ++i) {
    			scanf("%d%d", &x, &y);
    			v[x].link = y, v[y].link = x;
    		}
    		sort(v.begin(), v.end());
    		for (int i = 1; i <= 2 * n; ++i) {
    			p[v[i].id] = i;
    		}
    		vector<P> ans;
    		for (int i = 1; i <= 2 * n; i += 2) {
    			if (v[i].link == v[i + 1].id) continue;
    			ans.push_back({ v[i].link, v[i + 1].id });
    			int j = p[v[i].link];
    			v[j].id = v[i + 1].id;
    			v[j].link = v[i + 1].link;
    			p[v[i + 1].id] = j;
    		}
    		printf("%zd
    ", ans.size());
    		for (P i : ans) {
    			printf("%d %d
    ", i.first, i.second);
    		}
    	}
    }
  • 相关阅读:
    算法之路 level 01 problem set
    算法原理与实践(链表)
    散列表(HashTable)
    系统设计与实践(实战演练)
    桶排序 + 基数排序
    算法原理与实践(二叉树)
    Total Difference String
    【翻译】std::list::remove
    【翻译】std::remove
    Observer模式实践
  • 原文地址:https://www.cnblogs.com/ZKin/p/9471049.html
Copyright © 2011-2022 走看看