[NOI2015]程序自动分析

★☆   输入文件:prog.in   输出文件:prog.out   简单对比
时间限制:2 s   内存限制:512 MB

【题目描述】

在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。

考虑一个约束满足问题的简化版本:假设x1,x2,x3,...xn代表程序中出现的变量,给定n个形如xi=xj或者xixj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述条件同时被满足。

【输入格式】

输入文件第一行包含一个正整数T,表示需要判定的问题个数。注意这些问题之间相互独立。

对于每个问题,包含若干行:

第一行一个正整数n,表示约束条件个数。

接下来n行,每行三个正整数i,j,e,描述一个相等/不等的约束条件。若e=1,则约束条件为xi=xj,若e=0,则约束条件为xixj

【输出格式】

输出文件包括T行。

输出文件的第k行输出一个字符串"YES"或者"NO"(不包含引号,字母全部大写).

【样例输入1】

2
2
1 2 1
1 2 0
2
1 2 1
2 1 1

【样例输出1】

NO
YES

【样例输入2】

2

3

1 2 1

2 3 1

3 1 1

4

1 2 1

2 3 1

3 4 1

1 4 0

【样例输出2】

YES

NO

数据规模

1<=T<=10

对于1,2:1<=n<10

对于3,4:10<n<=100

对于5,6,7:100<n<=100,000

对于8,9,10:100<n<=100,000

对于前70%的数据:1<=i,j<=10,000

对于100%的数据:1<=i,j<=1,000,000,000

【来源】

NOI2015

思路

hash+并查集

代码实现

 1     #include<cstdio>
 2     #include<cstring>
 3     #include<algorithm>
 4     using namespace std;
 5     const int maxn=3e6;
 6     const int mod=2999957;
 7     int test,n,ans;
 8     int a,b,c;
 9     int f[maxn];
10     struct question{int a,b,c;}q[maxn];
11     int hash(int a){
12         int ha=1;
13         while(a){
14             ha*=a;
15             ha%=mod;
16             a/=10;
17         }
18         return ha;
19     }
20     int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
21     bool comp(const question&x,const question&y){return x.c>y.c;}
22     int main(){
23         freopen("prog.in","r",stdin);
24         freopen("prog.out","w",stdout);
25         scanf("%d",&test);
26         while(test--){
27             memset(f,0,sizeof(f));
28             ans=1;
29             scanf("%d",&n);
30             for(int i=1;i<=n;i++){
31                 scanf("%d%d%d",&a,&b,&c);
32                 q[i]=(question){hash(a),hash(b),c};
33             }
34             sort(q+1,q+n+1,comp);
35             for(int i=1;i<=n;i++){
36                 a=q[i].a,b=q[i].b;
37                 if(!f[a]) f[a]=a;
38                 if(!f[b]) f[b]=b;
39                 a=find(a),b=find(b);
40                 if(q[i].c) f[b]=a;
41                 else if(a==b) ans=0;
42                 if(!ans) break;
43             }
44             if(ans) puts("YES");
45             else puts("NO");
46         }
47         return 0;
48     }

单模居然没W;

因为忘了写find_f的修正路径,差点降低本题通过率。。。

NOI2015

原文地址:https://www.cnblogs.com/J-william/p/7202853.html