Zjnuスタジアム加重互いに素セット

2007年第12回浙江省大学生のゲームでは、浙江師範大学で構築された新しいスタジアムがありました。これは、何千人もの人々を握ることができる近代的なスタジアムでした。観客席はサークルを作りました。列の総数は300、1~300の番号が付け時計回りに数えた、我々は、行の数が無限であったと仮定する。
最近では、Busoniyaがこのスタジアムで大規模な演劇のパフォーマンスを保持します。Nの人々が1-Nが番号を行くがあります。Busoniyaは、いくつかの席を予約しています。面白いそれを作るために、彼はこれらの座席のためのMの要求を行う:手段の人々はBが人々から時計回りにX距離を収容しなければならないの番号ABXは、例えばA.を番:A列4日にあり、Xは、列6日で2、その後、B必要があります(あります6 = 4 + 2)。
今すぐあなたのタスクは、リクエストが正しいかどうか、天候を判断することです。あなたの判断のルールは簡単です:新しい要求が前述のものに対する競合を持っているときに、我々はそれ以外の場合は正しい、間違ったとして、それを定義します。すべての不正な要求を見つけるとR.のとしてそれらをカウントしてください
入力は
、多くのテストケースがあります。
すべてのケースの場合:
最初の行は整数N 2(1 <= N <= 50,000)、M(0 <= M <= 100,000持ちます)、スペースで区切ら。
次いで、Mラインが各ラインにより分離され、A(1 <= A <= N)、B(1 <= B <= N)、X(0 <= X <300)(A!= B)整数3を有し、従っスペース。

出力
すべてのケースの場合:
出力Rは、間違った要求の数を表します。
サンプル入力
10 10
1 2 150
3 200 4
1 5 270
2 6 200
6 5 80
4 7 150
8 9 100
4 8 50
1 7 100
9 2 100
サンプル出力
2

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int pre[50002],num[50005];
int ans,mod=300;
int find(int x)
{
    if(x!=pre[x])
    {
        int fx=pre[x];
        pre[x]=find(fx);
        num[x]=(num[x]+num[fx])%mod;
    }
    return pre[x];
}
void join(int x,int y,int z)
{
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy)
    {
        pre[fy]=fx;
        num[fy]=(num[x]-num[y]+mod+z)%mod;
    }
    else
    {
        if(num[y]!=(num[x]+z)%mod)
            ans++;
    }
}
int main()
{
    int n,m,i;
    while(~scanf("%d%d",&n,&m))
    {
        int x,z,y;
        ans=0;
        for(i=1;i<=n;i++)
        {
            pre[i]=i;
            num[i]=0;
        }
        while(m--)
        {
            scanf("%d%d%d",&x,&y,&z);
            join(x,y,z);
        }
        printf("%d\n",ans);
    }

    return 0;
}
公開された17元の記事 ウォンの賞賛3 ビュー518

おすすめ

転載: blog.csdn.net/RUBGH/article/details/105299492