Codevs 4600 [NOI2015]程序自动分析

点的序号很大,存不过来,但点数较少,因此用离散化,然后再用并查集。

用map进行离散化,过8个点,2个超时

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#define Size 1000005*2
using namespace std;

map<int,int> dic;
struct IN{
    int x,y,e;
}data[Size];
int f[Size*2];
int en[Size][2];
int cnt=0;
int n; bool flag;
int pa[Size];
void init(){
    for(int i=1;i<Size;i++)pa[i]=i;
    memset(en,0,sizeof(en));
}
int find(int x){
    if(x!=pa[x])pa[x]=find(pa[x]);
    return pa[x];
}
bool query(int x,int y){
    return find(x)==find(y);
}
void un(int x,int y){
    if(query(x,y))return;
    pa[find(x)]=find(y);
}

int main(){
    int T;cin>>T;
    while(T--){
        flag=true; cnt=0;
        init();

        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>data[i].x>>data[i].y>>data[i].e;
            f[2*i-1]=data[i].x; f[2*i]=data[i].y;
        }
        sort(f+1,f+1+n*2);
        for(int i=1;i<=n*2;i++){
            if(f[i]!=f[i-1]){
                cnt++;
                dic[f[i]]=cnt;
            }
        }

        int e,x,y;
        int num=0;
        for(int i=1;i<=n;i++){
            x=dic[data[i].x]; y=dic[data[i].y]; e=data[i].e;
            if(e==1)un(x,y);
            else{
                num++; en[num][0]=x; en[num][1]=y;
            }
        }
        for(int i=1;i<=num;i++){
            x=en[i][0]; y=en[i][1];
            if(query(x,y)){
                flag=false;
                break;
            }
        }
        if(flag)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
} 
时间: 2024-12-19 11:06:07

Codevs 4600 [NOI2015]程序自动分析的相关文章

bzoj4195[Noi2015]程序自动分析

bzoj4195[Noi2015]程序自动分析 题意: t组数据,每组n个给出两个变量是相等还是不等的约束条件,要求判断是否能满足.n≤1000000,变量数量≤109 题解: 先离散化,然后只处理相等条件用并查集维护“相等集合”,接着对每个不相等条件判断是否在一个集合,是的话则说明不满足. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue&g

【BZOJ 4195】[Noi2015]程序自动分析

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

bzoj 4195: [Noi2015]程序自动分析

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

【bzoj4195】[Noi2015]程序自动分析

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

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

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

[UOJ#127][BZOJ4195][NOI2015]程序自动分析

试题描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设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,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足. 现在给出一些约束满足问题,请分别对它们

NOI2015 程序自动分析

/* 十分简单的题面 离散化一下 然后并茶几一下就OK了 跑的死慢 可能还有更优的方法吧 */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #define maxn 1000010 using namespace std; int T,n,m,s[maxn],t[maxn],fa[maxn],falg,num; in

NOI2015 程序自动分析(luogu p1955)

原题链接:https://www.luogu.org/problem/show?pid=1955 夏令营的模拟考试题,今天才发现是NOI原题,没想到15年也有这样裸的题... 离散化一下,这样就能用并查集来处理问题,然后逐个判断,相等的就将其合并,不相等就判断是否真的不相等,如果已知两数相等,那么就能确定不可被满足. 除了离散化有点玄学之外,其他的倒是挺正常的并查集... #include<cstdio> #include<algorithm> using namespace st