zoukankan      html  css  js  c++  java
  • hdu3047 Zjnu Stadium

    Problem Description
    In 12th Zhejiang College Students Games 2007, there was a new stadium built in Zhejiang Normal University. It was a modern stadium which could hold thousands of people. The audience Seats made a circle. The total number of columns were 300 numbered 1--300, counted clockwise, we assume the number of rows were infinite.
    These days, Busoniya want to hold a large-scale theatrical performance in this stadium. There will be N people go there numbered 1--N. Busoniya has Reserved several seats. To make it funny, he makes M requests for these seats: A B X, which means people numbered B must seat clockwise X distance from people numbered A. For example: A is in column 4th and X is 2, then B must in column 6th (6=4+2).
    Now your task is to judge weather the request is correct or not. The rule of your judgement is easy: when a new request has conflicts against the foregoing ones then we define it as incorrect, otherwise it is correct. Please find out all the incorrect requests and count them as R.
     

    Input
    There are many test cases:
    For every case: 
    The first line has two integer N(1<=N<=50,000), M(0<=M<=100,000),separated by a space.
    Then M lines follow, each line has 3 integer A(1<=A<=N), B(1<=B<=N), X(0<=X<300) (A!=B), separated by a space.

     

    Output
    For every case: 
    Output R, represents the number of incorrect request.
     

    Sample Input
    10 10 1 2 150 3 4 200 1 5 270 2 6 200 6 5 80 4 7 150 8 9 100 4 8 50 1 7 100 9 2 100
     

    Sample Output
    2
    Hint
    Hint:

    (PS: the 5th and 10th requests are incorrect)

    这题可以用并查集做,属于带权值的并查集。t1,t2是根节点,其中root[t2]=root[a]+c-root[b];(可以用向量推)t2是集合二的根节点,a,b是输入的点

    这里抄附上一张图

    root[a]

    a--------ra

    | -

    |x -

    | root[b] -

    b--------------------rb

    原本以为rb经过集合合并后根节点是a,但其实是ra,所以可以递归并查集算出每个节点离根节点的距离

    #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<map> #include<string> using namespace std; int pre[50005],root[50005]; int find(int x) { int temp; if(x==pre[x])return x; temp=pre[x]; pre[x]=find(pre[x]); root[x]=root[x]+root[temp]; return pre[x]; } int main() { int n,m,i,j,a,b,c,t1,t2,ans; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<=n;i++){ pre[i]=i;root[i]=0; } ans=0; for(i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); t1=find(a);t2=find(b); if(t1==t2){ if(root[b]-root[a]!=c){ ans++;continue; } } else{ pre[t2]=t1; root[t2]=root[a]+c-root[b]; } } printf("%d ",ans); } return 0; }

  • 相关阅读:
    C#中设置窗口在最前显示而其他窗口不能使用
    C#中关闭子窗口而不释放子窗口对象的方法
    C#窗体越界时鼠标还能回到初始坐标位置
    C#程序实现软件开机自动启动的两种常用方法
    C# 只开启一个程序,如果第二次打开则自动将第一个程序显示到桌面
    图标库网址收藏
    C# Winform打包部署时添加注册表信息实现开机自启动
    C# winform程序怎么打包成安装项目(VS2010图解)
    数据库的三级范式,涉及范式的问题
    基数排序
  • 原文地址:https://www.cnblogs.com/herumw/p/9464804.html
Copyright © 2011-2022 走看看