首页 > 编程语言 >P1955 [NOI2015] 程序自动分析(并查集)

P1955 [NOI2015] 程序自动分析(并查集)

时间:2024-09-29 09:36:33浏览次数:6  
标签:P1955 typedef return int 查集 long NOI2015 vector vx

相等放并查集里,不等直接判断

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
vector<int> vx;
inline int mp(int x) {return upper_bound(vx.begin(),vx.end(),x)-vx.begin();}
inline int log_2(int x) {return 31-__builtin_clz(x);}
inline int popcount(int x) {return __builtin_popcount(x);}
inline int lowbit(int x) {return x&-x;}
const int N = 1e5+10;
//注意有n条指令至多有2*n个点
int f[N<<1];
int find(int u)
{
    if(f[u] == u) return u;
    return f[u] = find(f[u]);
}
void merge(int u,int v)
{
    int f1 = find(u), f2 = find(v);
    if(f1 != f2) f[f1] = f2;
}
void solve()
{
    vx.clear();
    int n;
    cin>>n;
    vector<array<int,3>> tmp(n);
    vector<PII> pd;
    for(int i=1;i<=2*n;++i) f[i] = i;
    for(int i=0;i<n;++i)
    {
        int u,v,e;
        cin>>u>>v>>e;
        tmp[i] = {u,v,e};
        vx.push_back({u});
        vx.push_back({v});
    }
    sort(vx.begin(),vx.end());
    for(int i=0;i<n;++i)
    {
        auto [u,v,e] = tmp[i];
        if(e) merge(mp(u),mp(v));
        else pd.push_back({mp(u),mp(v)});
    }
    bool ok = true;
    for(auto [s,t]:pd)
    {
        if(find(s) == find(t)) ok = false;
    }
    cout<<(ok?("YES\n"):("NO\n"));
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	cin>>T;
	while(T--)
	{
		solve();
	}
}

标签:P1955,typedef,return,int,查集,long,NOI2015,vector,vx
From: https://www.cnblogs.com/ruoye123456/p/18438894

相关文章

  • 数据结构:速通并查集
    并查集用来干什么:处理不相交的集合的合并以及查询相交集合的个数等情况例题(自行搜索):36024年第一批笔试算法题传染病防控 并查集具有三个操作initfindunioninit初始化集合,将当前所有节点的父节点设置为自己intfa[]=newint[10000];intsize[]=newint[10000];//这里是......
  • LeetCode力扣——并查集:947. 移除最多的同行或同列石头,1971. 寻找图中是否存在路径,24
    947.移除最多的同行或同列石头题目描述947.移除最多的同行或同列石头n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。给你一个长度为 n 的数组 stones ,其......
  • 基础带权并查集
    只能基础查询到根节点的距离structDSU{intfa[N],siz[N],deep[N];voidinit(){for(inti=1;i<=n;i++){fa[i]=i;siz[i]=1;deep[i]=0;}}intfind(intx){inttmpfa=fa[x];......
  • 2024牛客多校 4 (概率,带权并查集,构造)
    2024牛客多校4(概率,带权并查集,构造)J-Zero题面:给出整数\(n\)和\(k\),一个01?字符串\(s\)。?有概率是0或是1,且概率相等,一段区间\([l,r]\)的贡献这样计算:这一段区间不包含0贡献为长度的\(k\)次方求这个字符串\(s\)的期望贡献是多少?solution:首......
  • 九、并查集-算法总结
    文章目录九、并查集9.1简介9.2数据结构9.2.1初始化9.2.2Quick-Find9.2.3Quick-Union9.2.4WeightedQuickUnion九、并查集9.1简介并查集用于处理不相交集合的合并与查询问题,常见操作有:查询:查询元素属于哪个集合,可用于判断元素是否在一个集合中合并:合并两......
  • Luogu P10179 水影若深蓝 题解 [ 绿 ] [ 并查集 ] [ 构造 ]
    水影若深蓝:挺好的一道并查集构造题。观察不难发现“距离为\(2\)”这个条件我们可以通过黑白染色实现,我们把他们的中转点染成与他们相反的颜色,把这两个距离为\(2\)的点染成相同颜色。这个染色问题就很并查集。于是我们用并查集维护相同的种类。显然,当图上只有一个连通块的......
  • 并查集
    并查集一开始每个元素都以自己为一个集合find(i):查找i所在集合的代表元素,代表元素代表了i所在的集合isSameSet(a,b):判断a、b是否在同一个集合里union(a,b):将a、b所在的两个集合合并并查集的实现#include<iostream>#include<vector>#include<stack>using......
  • 算法【并查集】
    并查集的使用是如下的场景1.一开始每个元素都拥有自己的集合,在自己的集合里只有这个元素自己。2.find(i):查找i所在集合的代表元素,代表元素来代表i所在的集合。3.bool isSameSet(a,b):判断a和b在不在一个集合里。4.voidunion(a,b):a所在集合所有元素与b所在集合所有元素......
  • P1955 [NOI2015] 程序自动分析
    算法1(离散化+并查集)没想到的点:由于数据范围很大1e9,因此需要采用离散化,从而降低时间复杂度主要思想1.约束条件有相等/不相等,不难发现,相等的约束条件是属于一个集合的--因此需要用到并查集思想我们按照e的大小进行排序,从而完成先处理e=1的所有情况3.并查集:初始化:一......
  • Luogu P7250 BalticOI 山峰 题解 [ 蓝 ] [ 模拟 ] [ 并查集 ] [ BFS ]
    LuoguP7250BalticOI山峰。一道大模拟,很暴力,也很难写。建议紫或蓝,标签为模拟、广度优先搜索、并查集。思路首先观察到答案取决于路线上的最低点,所以我们可以把所有点的高度丢进一个桶里,从大到小枚举,尝试更新答案。这应该是个挺经典的trick了。感性理解可以看作所有山都先......