题目:

三类动物A、B、C,A吃B,B吃C,C吃A。
给出K句话来描述N个动物(各属于A、B、C三类之一)
之间的关系,格式及意义如下:
1 X Y:表示X与Y是同类; 2 X Y:表示X吃Y。
K句话中有真话有假话,当一句话满足下列三条之一时,
这句话就是假话,否则就是真话。
1) 当前的话与前面的某些真的话冲突,就是假话; 2) 当前的话中X或Y比N大,就是假话; 3) 当前的话表示X吃X,就是假话。
求假话的总数。

输入:

第一行是两个整数N和K,以一个空格分隔。
以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。
若D=1,则表示X和Y是同类。
若D=2,则表示X吃Y

输出:

假话的总数。

一个容易想到的思路:

用二维数组s存放已知关系:
S[X][Y] = -1:表示X与Y关系未知;
S[X][Y] = 0:表示X与Y是同类;
S[X][Y] = 1:表示X吃Y;
S[X][Y] = 2:表示Y吃X。
对每个读入的关系s(x,y),检查S[x][y]:
若S[x][y]=s,则继续处理下一条;
若S[x][y] = -1,则令S[x][y]=s,并更新S[x][i]、
S[i][x]、S[y][i]和S[i][y] (0<i<=n)。
若S[x][y] != s且S[x][y] != -1,计数器加1。

复杂度:

以上算法需要存储一个N×N的数组,空间复杂度为O(N2)。对每一条语句
进行关系判定时间为O(1)加入关系时间为O(N)总的时间复杂度为O(N*K)
0<=N<=50000,0<=K<=100000,复杂度太高。
对于任意a≠b,a、b属于题中N个动物的集合S,
当且仅当S中存在一个有限序列(P1, P2, …, Pm)(m≥0)
使得aP1、P1P2、…、Pm-1Pm、Pmb(或m=0时的ab)之间的相对关系均已确定时,
b对a的相对关系才可以确定。由上面可知,我们不需要保留每对个体之间的
关系,只需要为每对已知关系的个体保留一条
路径aP1P2…Pmb(m≥0)其中aP1、P1P2、…、Pm-1Pm、Pmb之间的关系均为已知。两两关系已知的动物们,构成一个group。

解决方案:

使用并查集:

用结点表示每个动物,边表示动物之间
的关系。采用父结点表示法,在每个结
点中存储该结点与父结点之间的关系。
parent数组: parent[i]表示i的父节点
relation数组:relation[i]表示i和父节点
的关系
初始状态下,每个结点单独构成一棵树。
读入a,b关系描述时的逻辑判断:
分别找到两个结点a、b所在树的根结点ra、
rb,并在此过程中计算a与ra、b与rb之间的
相对关系。
若ra!=rb,此句为真话,将a、b之间的关系加入;
若ra=rb,则可计算出r(a,b)=f( r(a,ra) , r(b,rb) )
若读入的关系与r(a,b)矛盾,则此句为假话,
计数器加1;
若读入的关系与r(a,b)一致,则此句为真话。

code:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 50010 struct node {
int pre;
int relation;
};
node p[N]; int find(int x) { //查找根结点
int temp;
if(x == p[x].pre)
return x;
temp = p[x].pre; //路径压缩
p[x].pre = find(temp);
p[x].relation = (p[x].relation + p[temp].relation) % ; //关系域更新
return p[x].pre; //根结点
} int main() {
int n, k;
int ope, a, b;
int root1, root2;
int sum = ; //假话数量
scanf("%d%d", &n, &k);
for(int i = ; i <= n; ++i) { //初始化
p[i].pre = i;
p[i].relation = ;
}
for(int i = ; i <= k; ++i) {
scanf("%d%d%d", &ope, &a, &b);
if(a > n || b > n) { //条件2
sum++;
continue;
}
if(ope == && a == b) { //条件3
sum++;
continue;
}
root1 = find(a);
root2 = find(b);
if(root1 != root2) { // 合并
p[root2].pre = root1;
p[root2].relation = ( + (ope - ) +p[a].relation - p[b].relation) % ;
} else {
if(ope == && p[a].relation != p[b].relation) {
sum++;
continue;
}
if(ope == && (( - p[a].relation + p[b].relation) % != ope - )) {
sum++;
continue;
}
}
}
printf("%d\n", sum);
return ;
}

这是一道并查集的升级运用。

相比并查集的基础运用题目,难度高很多。

JZOJ的更多相关文章

  1. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  2. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  3. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  4. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

  5. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  6. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

  7. [jzoj]4216.【NOIP2015模拟9.12】平方和

    Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...

  8. [jzoj]2938.【NOIP2012模拟8.9】分割田地

    Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...

  9. [jzoj]2505.【NOIP2011模拟7.29】藤原妹红

    Link https://jzoj.net/senior/#main/show/2505 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...

  10. [jzoj]3875.【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)

    Link https://jzoj.net/senior/#main/show/3875 Problem 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流. ...

随机推荐

  1. Bias, Variance and the Trade-off

    偏差,方差以及两者权衡 偏差是由模型简化的假设,使目标函数更容易学习. 一般来说,参数化算法有很高的偏差,使它们学习起来更快,更容易理解,但通常不那么灵活.反过来,它们在复杂问题上的预测性能更低,无法 ...

  2. 【洛谷P4093】 [HEOI2016/TJOI2016]序列 CDQ分治+动态规划

    你发现只会改变一个位置,所以可以直接进行dp 具体转移的话用 CDQ 分治转移就好了~ #include <bits/stdc++.h> #define N 100006 #define ...

  3. CLR内部异常(上)

    当我们提到CLR里的“异常”,要注意一个很重要的区别.有通过如C#的try/catch/finally暴露给应用程序,并由运行时提供机制全权实现的托管异常.也有运行时自己使用的异常.大部分运行时开发人 ...

  4. PostGraphile 4.4 发布,支持real time 查询

    在4.4 之前,real time 是通过插件完成处理的,4.4 直接内置了,还是很方便的功能,总算 和其他类似graphql 平台看齐了,使用上还是挺方便的. 参考资料 https://www.gr ...

  5. HTML5 Geolocation(地理定位)

    一.背景 在HTML规范中,增加了获取用户地理信息的API,这样使得可以基于用户位置开发互联网应用,即基于位置服务 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的. Inter ...

  6. vscode vue文件格式化没效果

    在vscode 中   格式化vue文件没效果 解决办法: 点击头部文件 >首选项>设置 在右侧加入这两句 "vetur.format.defaultFormatter.js&q ...

  7. 模板 - 部分C++库

    __builtin系列 据说是GCC自带的系列,在本地装有 GNU GCC Compiler 的 Codeblocks 和 Codeforces 等平台都可以使用这些.但是没办法从 Codeblock ...

  8. hdfs、yarn集成kerberos

    1.kdc创建principal 1.1.创建认证用户 登陆到kdc服务器,使用root或者可以使用root权限的普通用户操作: # kadmin.local -q “addprinc -randke ...

  9. 无法定位程序输入点到xxx.dll

    Q:安装pytorch时报错无法定位程序输入点到Anaconda3\Library\bin\libssl-1_1-x64.dll A:下载libssl-1_1-x64.dll覆盖bin下的文件 下载地 ...

  10. Linux设置开机挂载

    Linux可不可以在开机的时候就将我们要的文件系统都挂载好?这样就不需要每次进入Linux系统还要挂载一次.当然可以,那就直接到/etc/fstab里面去修改. 系统挂载的一些限制: - 根目录/是必 ...