题目大意

  假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。i,j<=1000000000, n<=1000000

思路

  如果把所有相等的变量纳为一个或几个集合,那么输出yes当且仅当同一个相等集合中不存在一对xi,xj被要求不相等。集合→并查集。i,j,n的范围→离散化。

离散化的标准做法

功能

  将离散的数据压缩到一个有限的区间处理。具体可以为输入一个数的下标,输出该下标的排名。

实现

  将原始下标排序,得到一个下标为原始下标排名顺序、值为原始下标的数组。然后我们就可以运用LowerBound二分由原始下标找到其在原数组中的位置了。

注意事项

并查集

  • 一开始所有节点的Father都是自己。
  • Join两个节点是将一个节点的Root的Father设为另一个节点的Root,而不是将节点的Father设为另一个节点。

整体

  • 如果只想得到70分的话,注意下标范围是多于N的,所以并查集中的N都应当设为1000000。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cstdlib>
using namespace std; const int MAX_N = 200010; struct Discret
{
private:
int SortedA[MAX_N];
int Rank[MAX_N];
int N; int LowerBound(int *a, int l, int r, int k)
{
while (l < r)
{
int mid = (l + r) / 2;
if (k <= SortedA[mid])
r = mid;
else
l = mid + 1;
}
return l;
} public:
void Init(int n, int *a)
{
N = n;
for (int i = 1; i <= n; i++)
SortedA[i] = a[i];
sort(SortedA + 1, SortedA + n + 1); int prevVal = 0, rankCnt = 0;
for (int i = 1; i <= n; i++)
{
if (SortedA[i] != prevVal)
{
Rank[i] = ++rankCnt;
prevVal = SortedA[i];
}
else
Rank[i] = rankCnt;
}
} int GetRank(int val)
{
return Rank[LowerBound(SortedA, 1, N, val)];
} }List; struct UnionFind
{
private:
struct Node
{
Node *Father;
}_nodes[MAX_N]; Node *GetRoot(Node *cur)
{
return cur->Father == cur ? cur : cur->Father = GetRoot(cur->Father);
} public:
void Init(int n)
{
for (int i = 1; i <= n; i++)
_nodes[i].Father = _nodes + i;
} bool SameRoot(int a, int b)
{
Node *root1 = GetRoot(_nodes + a);
Node *root2 = GetRoot(_nodes + b);
return root1 == root2;
} void Join(int a, int b)
{
GetRoot(_nodes + a)->Father = GetRoot(_nodes + b);
}
}G; int main()
{
#ifdef _DEBUG
freopen("c:\\noi\\source\\input.txt", "r", stdin);
#endif
static vector< pair<int, int> > equal, nequal;
static int OrgVal[MAX_N];
int caseCnt;
scanf("%d", &caseCnt);
while (caseCnt--)
{
equal.clear();
nequal.clear(); int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
int x1, x2, isEqual;
scanf("%d%d%d", &x1, &x2, &isEqual); if (isEqual)
equal.push_back(pair<int, int>(x1, x2));
else
nequal.push_back(pair<int, int>(x1, x2)); OrgVal[i * 2 - 1] = x1;
OrgVal[i * 2] = x2;
}
List.Init(n * 2, OrgVal);
G.Init(n * 2);
for (int i = 0; i < equal.size(); i++)
{
int rank1 = List.GetRank(equal[i].first), rank2 = List.GetRank(equal[i].second);
if (!G.SameRoot(rank1, rank2))
G.Join(rank1, rank2);
} bool Ok = true;
for (int i = 0; i<nequal.size(); i++)
{
int rank1 = List.GetRank(nequal[i].first), rank2 = List.GetRank(nequal[i].second);
if (G.SameRoot(rank1, rank2))
{
Ok = false;
break;
}
}
if (Ok)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}

  

luogu1955 [NOI2015] 程序自动分析的更多相关文章

  1. codevs4600 [NOI2015]程序自动分析==洛谷P1955 程序自动分析

    4600 [NOI2015]程序自动分析  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 在实现 ...

  2. Codevs 4600 [NOI2015]程序自动分析

    4600 [NOI2015]程序自动分析 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 在实现程序自动分析的过程中,常常需 ...

  3. BZOJ4195 [Noi2015]程序自动分析(离散化+并查集)

    4195: [Noi2015]程序自动分析 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 689  Solved: 296 [Submit][Sta ...

  4. BZOJ4195 NOI2015 程序自动分析

    4195: [Noi2015]程序自动分析 Time Limit: 10 Sec Memory Limit: 512 MB Description 在实现程序自动分析的过程中,常常需要判定一些约束条件 ...

  5. 【BZOJ4195】[Noi2015]程序自动分析 并查集

    [BZOJ4195][Noi2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3 ...

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

    4195: [Noi2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表 ...

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

    [UOJ#127][BZOJ4195][NOI2015]程序自动分析 试题描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2, ...

  8. [NOI2015]程序自动分析(并查集,离散化)

    [NOI2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,-代表程序中出现的 ...

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

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...

随机推荐

  1. CodeForces 680A&680B&680C&680D Round#356

    昨天晚上实在是=_=困...(浪了一天)就没有去打Codeforces 中午醒来看看题,还不太难. A题:模拟(水题 3minAC) // by Sirius_Ren #include <cst ...

  2. A - Supermarket

    Problem description We often go to supermarkets to buy some fruits or vegetables, and on the tag the ...

  3. 树莓派-USB存储设备自动挂载

    简单介绍实现命令行下USB存储设备自动挂载的方法,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常需要用mount命令手动挂载USB存储 ...

  4. 带"签名"的请求接口实现

    废话少说,直接上代码(⊙﹏⊙) class Program { //签名证书 public static X509Certificate2 cerSigneCert; private static c ...

  5. php获取当地时间 time zone

      PHP5.2.4之前的版本无需设置时区.下面是修改PHP时区的三个办法. 1.修改PHP.ini这个文件 找到date.timezone这行,去掉前面的分号,改成: Java代码 date.tim ...

  6. 【Oracle】rollup函数

    当我们在做报表统计的时候,很多时候需要用到‘合计’这个功能,比如我们想得到如下格式的报表: 这张表是按照deptno分组,然后按照deptno分组合计.rollup函数可以完美的解决这个问题. 1.建 ...

  7. 怎么不让别人ping服务器

    频繁地使用Ping命令会导致网络堵塞.降低传输效率,为了避免恶意的网络攻击,一般都会拒绝用户Ping服务器.为实现这一目的,不仅可以在防火墙中进 行设置,也可以在路由器上进行设置,并且还可以利用Win ...

  8. BOS工具之BOS应用框架

    大纲:    应用框架概述,bos应用框架总体,bos应用框架详细设计,代码结构以及常用应用,开发常用接口 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象组件及组件实例间交互的 ...

  9. C#第十二节课

    数组 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Th ...

  10. js 中this到底指向哪里?

    其实js的this指向很简单.我们记住下面3种情况. this 指向的是浏览器中的window.代码如下: function fn(){ this.name='yangkun'; this.age=2 ...