程序自动分析(并查集+排序)

题意 给许多个x,y,k,若k=1,x==y,否则x!=y,如果矛盾,输出NO,否则YES

对于k=1,并查集简单操作一下,k=0,如果find(x)==find(y),打个标记,输出NO;

有一个需要注意的地方是,对于询问我们要进行sort,使k=1的情况先执行,这样可以保证最后判断的答案正确。

#include<iostream>
#include<cstdio>
using namespace std;
int re(){
    char c=getchar();int all=0,pd=1;
    for(;c>‘9‘||c<‘0‘;c=getchar()) if(c==‘-‘) pd=-1;
    while(c>=‘0‘&&c<=‘9‘) all=all*10+c-‘0‘,c=getchar();return all*pd;
}const int N=3e4+5;int f[N],front[N],num[N];
int find(int x){
    if(x==f[x]) return x;
    int fa=find(f[x]);front[x]+=front[f[x]];return f[x]=fa;
}int abs(int x){return x>0?x:-x;}
int main(){
    int n=re();for(int i=1;i<=30000;i++) num[i]=1,f[i]=i;
    for(int i=1;i<=n;i++){
        char c;cin>>c;
        int x=re(),y=re();
        int r1=find(x),r2=find(y);
        if(c==‘M‘){
            front[r1]+=num[r2];
            f[r1]=r2;num[r2]+=num[r1];
            num[r1]=0;
        }else if(r1!=r2) printf("-1\n");
        else printf("%d\n",abs(front[x]-front[y])-1);
    }
}

原文地址:https://www.cnblogs.com/BLUE-EYE/p/9520299.html

时间: 2024-09-27 00:33:06

程序自动分析(并查集+排序)的相关文章

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

Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足.例如,一个问题中的约束条件为:x1=x2,x2=x3,x3=x4,x1≠x4,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足. 现在给出一些约束满足问题,请分别对它们

洛谷P1955 [NOI2015] 程序自动分析 [并查集,离散化]

题目传送门 题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足.例如,一个问题中的约束条件为:x1=x2,x2=x3,x3=x4,x4≠x1,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足. 现在给出一些约束满足问题,请分别对它们

NOI 2015 DAY1 T1 程序自动分析 并查集+离散化

题意:暂且并没有链接 方法:并查集+离散化 解析: 国赛这道普及组难度的题我都不好意思写题解, 这道题的题意非常明了,一眼题.. 其实就是把所有的要求sort一下,把令xi=xj的条件放在前面,令xi!=xj的条件放到后面就行了. 然后我们对于n个询问,先把所有的i,j离散化,这里我偷懒用了map 然后只需要将所有xi=xj的部分加到并查集里. xi!=xj的部分看一下二者的祖先相不相同就行了,不相同就判断下一个,相同输出no: 代码: 这道题贴代码真是不好意思- - #include <map

BZOJ 4195: [Noi2015]程序自动分析 [并查集 离散化 | 种类并查集WA]

题意: 给出若干相等和不等关系,判断是否可行 woc NOI考这么傻逼的题飞快打了一个种类并查集交上了然后爆零... 发现相等和不等看错了异或一下再叫woc90分 然后发现md$a \neq b, a \neq c,不能得到b = c$ 老老实实的把所有相等关系加并查集然后不等关系来判断吧,唉 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using

bzoj4195 [Noi2015]程序自动分析——并查集

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4195 突然在这道大水题上WA了半天... 思路很简单,离线处理询问,先把 = 的都加到并查集里,再暴力判断 != 的: 然而WA了许多遍...对离散化还是太不熟悉了... 1.fa[] 数组的预处理!平时写的手熟,上来就 for(i=1;i<=n;i++),完全忘了离散化后怎样怎样了啊!! 2. unique 的时候需要 -1! 3. lower_bound 时不要多 -1! 代码如下:

FZU 2059 MM (并查集+排序插入)

Problem 2059 MM Accept: 109    Submit: 484Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description There is a array contain N(1<N<=100000) numbers. Now give you M(1<M<10000) query. Every query will be: 1 x : ask longest substring

【并查集+离散化】BZOJ4195- [Noi2015]程序自动分析

[题目大意] 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足.例如,一个问题中的约束条件为:x1=x2,x2=x3,x3=x4,x1≠x4,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足. 现在给出一些约束满足问题,请分别对它们进行判定.

【并查集】【NOI 2015】【bzoj 4195】程序自动分析

4195: [Noi2015]程序自动分析 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 294 Solved: 149 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,-代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足. 例如,一个问题

「并查集」程序自动分析

程序自动分析 原题链接:程序自动分析 题目大意 给你很多逻辑关系,判断是否有冲突 题目题解 先将两个逻辑分开来看,前一个逻辑存在那么后一个逻辑一定不存在,如果存在那么答案就错误了,可以用并查集维护,详细见代码 //#define fre yes #include <cstdio> #include <iostream> #include <algorithm> const int N = 1000005; struct message { int x, y, e; }