题意:浙江省第十二届大学生运动会在浙江师范大学举行,为此在浙师大建造了一座能容纳近万人的新体育场。 
观众席每一行构成一个圆形,每个圆形由300个座位组成,对300个座位按照顺时针编号1到300,且可以认为有无数多行。现在比赛的组织者希望观众进入场地的顺序可以更加的有趣,在门票上并没有规定每个人的座位,而是与这个圈中某个人的相对位置,可以坐在任意一行。 
门票上标示的形式如下:A B x 表示第B个人必须在A的顺时针方向x个位置(比如A坐在4号位子,x=2,则B必须坐在6号位子)。 
现在你就座位志愿者在入场口检票。如果拿到一张门票,与之前给定的矛盾,则被视为是假票,如果无矛盾,视为真票。现在给定该行入场观众的顺序,以及他们手中的门票,请问其中有多少假票?

第一行两个数N(1<=N<=50,000)和m(1<=m<=100,000)。表示N个人,m张票。

思路:复习下带权并查集的模板

dis[x]代表路径压缩后到根结点的距离

合并集合时新的dis可以使用向量运算求出

 var f,dis:array[..]of longint;
n,m,i,u,v,x,y,z,ans:longint; function find(k:longint):longint;
var x:longint;
begin
if k=f[k] then exit(k);
x:=f[k];
f[k]:=find(f[k]);
dis[k]:=(dis[k]+dis[x]) mod ;
exit(f[k]);
end; procedure union(x,y,z:longint);
var u,v:longint;
begin
u:=find(x); v:=find(y);
f[v]:=u;
dis[v]:=(dis[x]+z-dis[y]+) mod ;
end; begin
assign(input,'hdoj3047.in'); reset(input);
assign(output,'hdoj3047.out'); rewrite(output);
while not eof do
begin
readln(n,m);
if (n=)and(m=) then break;
ans:=;
for i:= to n do
begin
f[i]:=i; dis[i]:=;
end;
for i:= to m do
begin
readln(x,y,z);
u:=find(x); v:=find(y);
if u<>v then union(x,y,z)
else if (dis[x]+z) mod <>dis[y] then inc(ans);
end;
writeln(ans);
end;
close(input);
close(output);
end.

UPD(2018.10.18):C++

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 61000
#define M 6100000
#define eps 1e-8
#define pi acos(-1)
#define oo 1e9 int f[N],dis[N]; int find(int k)
{
if(k==f[k]) return k;
int x=f[k];
f[k]=find(f[k]);
dis[k]=(dis[k]+dis[x])%;
return f[k];
} void Union(int x,int y,int z)
{
int u=find(x);
int v=find(y);
f[v]=u;
dis[v]=(dis[x]+z-dis[y]+)%;
} int main()
{
//freopen("hdoj3047.in","r",stdin);
//freopen("hdoj3047.out","w",stdout);
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int ans=;
memset(dis,,sizeof(dis));
for(int i=;i<=n;i++) f[i]=i;
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
int u=find(x);
int v=find(y);
if(u!=v) Union(x,y,z);
else if((dis[x]+z)%!=dis[y]) ans++;
}
printf("%d\n",ans);
}
return ;
}

【HDOJ3047】Zjnu Stadium(带权并查集)的更多相关文章

  1. Hdu 2047 Zjnu Stadium(带权并查集)

    Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. hdu 3047–Zjnu Stadium(带权并查集)

    题目大意: 有n个人坐在zjnu体育馆里面,然后给出m个他们之间的距离, A B X, 代表B的座位比A多X. 然后求出这m个关系之间有多少个错误,所谓错误就是当前这个关系与之前的有冲突. 分析: 首 ...

  3. HDU 3047 Zjnu Stadium(带权并查集)

    题意:有一个环形体育场,有n个人坐,给出m个位置关系,A B x表示B所在的列在A的顺时针方向的第x个,在哪一行无所谓,因为假设行有无穷个. 给出的座位安排中可能有与前面矛盾的,求有矛盾冲突的个数. ...

  4. HDU3047 Zjnu Stadium 带权并查集

    转:http://blog.csdn.net/shuangde800/article/details/7983965 #include <cstdio> #include <cstr ...

  5. HDU3047 Zjnu Stadium 【带权并查集】

    HDU3047 Zjnu Stadium Problem Description In 12th Zhejiang College Students Games 2007, there was a n ...

  6. Zjnu Stadium(hdu3047带权并查集)

    题意:一个300列的无限行的循环场地,a b d代表a,b顺时针相距d的距离,现在给你一些距离,判断是否有冲突,如果有冲突计算冲突的次数 思路:带权并查集 a,b的距离等于b到根节点的距离 - a到根 ...

  7. HDU 3047 Zjnu Stadium(带权并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=3047 题意: 给出n个座位,有m次询问,每次a,b,d表示b要在a右边d个位置处,问有几个询问是错误的. 思路: ...

  8. 【带权并查集】HDU 3047 Zjnu Stadium

    http://acm.hdu.edu.cn/showproblem.php?pid=3047 [题意] http://blog.csdn.net/hj1107402232/article/detail ...

  9. HDU 3047 带权并查集 入门题

    Zjnu Stadium 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3047 Problem Description In 12th Zhejian ...

随机推荐

  1. SpringCloud开发学习总结(三)—— 服务治理Eureka

    在最初开始构建微服务系统的时候可能服务并不多,我们可以通过做一些静态配置来完成服务的调用.比如,有两个服务A和B,其中服务A需要调用服务B来完成一个业务操作时,为了实现服务B的高可用,不论采用服务端负 ...

  2. TCP协议三次握手和四次握手

    前言 先说一下IP协议和TCP协议,IP协议是无连接的通信协议,IP不会占用两个设备之间通信的线路,IP实际上主要负责将每个数据包路由至目的地,但是IP协议并没有能够确保数据包是否到达,传过去的数据包 ...

  3. 特性property

    #property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接引用# class People:# def __init__(self,name,weight,height ...

  4. hihocoder offer收割编程练习赛11 D 排队接水

    思路: 莫队算法+树状数组. 莫队算法的基本思想是对大量要查询的区间进行离线处理,按照一定的顺序计算,来降低复杂度.概括来说,我们在知道了[l, r]的解,并且可以通过一个较低的复杂度推出[l - 1 ...

  5. 如何安装sql server2005 windows 8

    如何安装sql server2005   windows 8 1 从网上下载到本地文件 ,这里使用的是cs_sql_2005_dev_all_dvd 安装版. 2. 点击下图所表示进行安装   3. ...

  6. updating error reports database解决方案

    Window--->Preferences--->General--->Startup and Shutdown--->取消勾选Eclipse Automated Error  ...

  7. Swift 中的值类型与引用类型

    顶级修饰 次级修饰 赋值类型 存储类型 值类型 值类型   深拷贝 栈 值类型 引用类型 浅拷贝 堆 引用类型 值类型 浅拷贝 堆 引用类型 引用类型 浅拷贝 堆 复合引用类型会改变内部值类型的存储行 ...

  8. C#在sql中使用變量訪問Oracle數據庫

    1.首先創建一個測試數據表 CREATE TABLE people ( SNO BYTE), SNAME BYTE), SSEX BYTE), SAGE number, SDEPT BYTE), BT ...

  9. windows sdk 设置窗体透明

    #define WINVER 0x0501 #include <windows.h> /* Declare Windows procedure */ LRESULT CALLBACK Wi ...

  10. mac vim编辑器常用操作快捷方式

    0 行首$ (shift+6)行尾gg 文首G(shift+g) 文尾A(Shift+a)文尾,并编辑ctrl+f 向上翻页ctrl+b 向下翻页ctrl+u 向上翻半页ctrl+d 向下翻半页数字+ ...