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;
}