首页 > 其他分享 >[NOIP2010 提高组] 关押罪犯 - 洛谷

[NOIP2010 提高组] 关押罪犯 - 洛谷

时间:2023-12-12 17:35:05浏览次数:26  
标签:洛谷 关押 int NOIP2010 mid rank i64 ufs col

P1525 [NOIP2010 提高组] 关押罪犯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

种类并查集

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

struct UFS {
	int sz;
	vector<int> rank, p;
	void link(int x, int y) {
		if (x == y)
			return;
		if (rank[x] > rank[y])
			p[y] = x;
		else
			p[x] = y;
		if (rank[x] == rank[y])
			rank[y]++;
	}
	void init(int n) {
		sz = n;
		rank.resize(n + 1);
		p.resize(n + 1);
		for (int i = 0; i <= sz; i++) {
			p[i] = i;
			rank[i] = 0;
		}
	}
	int find(int x) {
		return x == p[x] ? x : (p[x] = find(p[x]));
	}
	void unin(int x, int y) {
		link(find(x), find(y));
	}
	void compress() {
		for (int i = 0; i <= sz; i++)
			find(i);
	}
};
//种类并查集 merge(y + n, x),merge(x + n, y)

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n, m;
	cin >> n >> m;
	vector<pair<i64, PII>> g;
	for (int i = 0; i < m; i ++) {
		i64 u, v, w;
		cin >> u >> v >> w;
		g.emplace_back(w, PII(u, v));
	}

	sort(g.begin(), g.end(), greater<>());
	UFS ufs;
	ufs.init(2 * n);
	i64 ans = 0;
	for (int i = 0; i < m; i ++) {
		auto [w, uv] = g[i];
		auto [u, v] = uv;
		if (ufs.find(u) == ufs.find(v) || ufs.find(u + n) == ufs.find(v + n)) {
			ans = w;
			break;
		}
		ufs.unin(u + n, v);
		ufs.unin(v + n, u);
	}

	cout << ans << '\n';

	return 0;
}

二分+二分图染色

二分最大的影响力,大于\(mid\)的罪犯就必须分开,然后看判定所有的罪犯是否可以分成两个集合

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n, m;
	cin >> n >> m;
	vector g(n + 1, vector<PII>());
	for (int i = 0; i < m; i ++) {
		i64 u, v, w;
		cin >> u >> v >> w;
		g[u].emplace_back(v, w);
		g[v].emplace_back(u, w);
	}

	auto check = [&](i64 mid) {
		vector<int> col(n + 1, -1);
		queue<int> Q;
		for (int i = 1; i <= n; i ++) {
			if (col[i] == -1) {
				Q.push(i);
				col[i] = 0;
				while (Q.size()) {
					auto u = Q.front();
					Q.pop();
					for (auto [v, w] : g[u]) {
						if (w > mid) {
							if (col[v] == -1) {
								col[v] = col[u] ^ 1;
								Q.push(v);
							} else if (col[v] == col[u])
								return false;
						}
					}
				}
			}
		}
		return true;
	};


	i64 l = 0, r = 1e9, ans = 0;
	while (l <= r) {
		i64 mid = (l + r) >> 1;
		if (check(mid)) r = mid - 1, ans = mid;
		else l = mid + 1;
	}

	cout << ans << '\n';

	return 0;
}

标签:洛谷,关押,int,NOIP2010,mid,rank,i64,ufs,col
From: https://www.cnblogs.com/Kescholar/p/17897388.html

相关文章

  • 洛谷P3396 哈希冲突
    根号分治模板题#include<iostream>#include<stdio.h>#include<algorithm>#include<cstring>#include<cmath>#defineRED"\033[0;32;31m"#defineNONE"\033[m"#defineR(x)x=read()#defineFor(i,j,n)for......
  • 洛谷P4199 万径人踪灭
    题目链接考虑容斥:拿满足条件\(1\)的方案数减去满足条件\(1\)但不满足条件\(2\)的方案数就是答案。满足条件\(1\)但不满足条件\(2\)的方案可以用\(\text{Manacher}\)算法\(O(n)\)计算。对于满足条件\(1\)的总方案数,我们记\(c_i\)表示以\(i\)位置为对称轴时,......
  • 「杂题乱刷」洛谷P1216
    题目链接一道dp的入门题。\(O(2^n)\):考虑直接爆搜,可以考虑到所有情况。\(O(n^2)\):考虑\(dp\),设\(dp_{i,j}\)代表到达第\(i\)层第\(j\)个数所能达到的最大值。状态转移方程为\(dp_{i,j}=a_{i,j}+\max(dp_{i-1,j-1},dp_{i-1,j})\)。最终答案就是\(\max(dp_{n,1},d......
  • 【洛谷 P2670】[NOIP2015 普及组] 扫雷游戏 题解(模拟)
    [NOIP2015普及组]扫雷游戏题目背景NOIP2015普及组T2题目描述扫雷游戏是一款十分经典的单机小游戏。在行列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的......
  • 【LGR-168-Div.4】洛谷入门赛 #18
    打表过样例题目描述很不幸,你遇到了不负责任的出题人。在某道试题里,共有\(N\)个测试点,组成了\(k\)个Subtask,第\(i\)个Subtask包含\(p_i\)个测试点,第\(j\)个测试点的编号为\(w_{i,j}\)。请注意,一个测试点可能属于多个Subtask。Subtask每个Subtask包含多个测......
  • 「杂题乱刷」洛谷P1544
    题目链接数字三角形的变形。直接在原来的基础上加个判断\(3\)倍的就行了。参考代码:点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlongn,m,ans=-1e18,a[110][110],dp[110][110][5010];#definelc(x)x<<1#definerc(x)x<<1|1#definelowbit(x)x&-......
  • 「杂题乱刷」洛谷P2285
    题目传送门一道小清新动态规划题,直接设\(dp[i]\)表示前\(i\)个鼹鼠最多能打到几个,然后状态转移方程也很好想了。参考代码:点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlongn,m,ans,dp[10010],x[10010],y[10010],times[10010];#definelowbit(x)x&-......
  • 「杂题乱刷」洛谷P1064
    题目传送门一道算是dp的板子题了。题意大概就是01背包+捆绑。首先回顾一下01背包,一个比较基础的dp题,状态转移方程也很好想,是\(dp[i][j]=\max(dp[i][j],dp[i-1][j-w[i]]+v[i])\)。代码实现如下:点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlo......
  • 洛谷 P1044 [NOIP2003 普及组] 栈 题解
    洛谷P1044[NOIP2003普及组]栈题解Sol本题通过分析可得:假设现在进行\(12\)次操作,我们把push认为是在地图上向右走,pop向上走,那么其中一个合法的步骤可以是(\(p1\)代表push,\(p2\)代表pop):\(p1,p1,p2,p1,p2,p2,p1,p1,p2,p2,p1,p2\)。而且我们发现,他最终会......
  • 洛谷P1443 马的遍历(BFS广度优先搜索)
    这道题只要求输入最小步数即可,而且数据的个数较大,所以优先采用BFS(广度优先搜索):广度优先搜索,即以数据搜索的广度优先,换句话说就是每一次操作都将所有可能的结果存储下来,随后对数据进行下一步处理,注意是对每组数据都只进行一次处理,如果是一条路走到头,这就变成了深度优先搜索(DFS)。而基......