zoukankan      html  css  js  c++  java
  • Luogu P1955 程序自动分析

    Luogu P1955 程序自动分析

    核心思路:并查集+离散化。

    然而离散化打错还检查不出来的我是不是没救了

    #include<bits/stdc++.h>
    #define N 100010
    
    int t,n,siz;
    int a[N*2],b[N*2],fa[N*2]; //a--discrete->t
    bool ans;
    
    struct node {
    	int i,j,e;
    };
    
    node input[N];
    
    namespace WalkerV {
    	void Init() {
    		memset(input,0,sizeof(input));
    		memset(a,0,sizeof(a));
    		memset(b,0,sizeof(b));
    		memset(fa,0,sizeof(fa));
    		return;
    	}
    
    	void Read() {
    		scanf("%d",&n);
    		for(int k=1;k<=n;k++) {
    			scanf("%d%d%d",&input[k].i,&input[k].j,&input[k].e);
    			a[k*2-1]=input[k].i,a[k*2]=input[k].j;
    		}
    		return;
    	}
    
    	void Discrete() {
    		std::sort(a+1,a+n*2+1);
    		for(int k=1;k<=n*2;k++) {
    			b[k]=a[k];
    		}
    		siz=std::unique(b+1,b+n*2+1)-(b+1);
    		return;
    	}
    
    	int Query(int x) {
    		return std::lower_bound(b+1,b+siz+1,x)-b;
    	}
    
    	bool Compare(node x,node y) {
    		return x.e>y.e;
    	}
    
    	int Find(int x) {
    		return fa[x]==x?x:fa[x]=Find(fa[x]);
    	}
    	
    	void Merge(int x,int y) {
    		fa[Find(y)]=Find(x);
    		return;
    	}
    
    	void Solve() {
    		Discrete();
    		for(int k=1;k<=siz;k++) {
    			fa[k]=k;
    		}
    		std::sort(input+1,input+n+1,Compare);
    		for(int k=1;k<=n;k++) {
    			if(input[k].e) {
    				Merge(Query(input[k].i),Query(input[k].j));
    			}
    			else {
    				if(Find(Query(input[k].i))==Find(Query(input[k].j))) {
    					ans=false;
    					return;
    				}
    			}
    		}
    		ans=true;
    		return;
    	}
    
    	void Print() {
    		printf("%s
    ",ans?"YES":"NO");
    		return;
    	}
    }
    
    int main()
    {
    	scanf("%d",&t); 
    	for(int k=1;k<=t;k++) {
    		WalkerV::Init();
    		WalkerV::Read();
    		WalkerV::Solve();
    		WalkerV::Print();
    	}
    	return 0;
    }
    
  • 相关阅读:
    点击有惊喜
    模态框案例
    DOM操作
    定时器
    函数和object
    shell 判断文件出现次数
    shell 判断路径
    shell 循环数组
    shell 判断为空打印
    shell 示例1 从1叠加到100
  • 原文地址:https://www.cnblogs.com/luoshui-tianyi/p/15115690.html
Copyright © 2011-2022 走看看