hdu 3047 Zjnu Stadium

有一个有300个座位的圆,现在给出n个两个人间的座位信息,问有几个信息是错误的。

当一个信息和前面的信息矛盾被认为是错误的。

一个模300系的带权并查集。势能高的向势能低的树合并,合并时压缩路径并将相对于根节点的势能更新。

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define up rt,rt<<1,rt<<1|1
#define mem(x) memset(x,0,sizeof(x))
#define mem1(x) memset(x,-1,sizeof(x))
#define LMissher
using namespace std;
typedef long long ll;
typedef double db;
const int M = 1e5+7;
const double pi = acos(-1);
const int inf = 2147483647;
const int mod = 300;

int n,m;
int f[M],pos[M];

void init(){
    for(int i=1;i<=n;i++) f[i]=i,pos[i]=0;
}
int find(int x){
    if(x==f[x]) return x;
    int tmp=f[x];
    f[x]=find(f[x]);
    pos[x]=(pos[x]+pos[tmp])%mod;
    return f[x];
}
int main(){
    #ifdef LMissher
        freopen("1.in","r",stdin);
        freopen("1.out","w",stdout);
    #endif
    while(~scanf("%d%d",&n,&m)){
        init();
        int ans=0,u,v,d;
        while(m--){
            scanf("%d%d%d",&v,&u,&d);//v+d=u
            int fu=find(u),fv=find(v);
            if(fu==fv){
                if((pos[v]+d)%mod!=pos[u]) ans++;
            }
            else{
                f[fu]=fv;
                pos[fu]=(pos[v]-pos[u]+d+mod)%mod;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/LMissher/p/9634534.html