华师一附中OI组
标题:
P2024 食物链
[打印本页]
作者:
admin
时间:
2018-5-21 22:34
标题:
P2024 食物链
https://www.luogu.org/problemnew/show/P2024
题目描述
动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B
吃 C,C 吃 A。
现有 N 个动物,以 1 - N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道
它到底是哪一种。
有人用两种说法对这 N 个动物所构成的食物链关系进行描述:
第一种说法是“1 X Y”,表示 X 和 Y 是同类。
第二种说法是“2 X Y”,表示 X 吃 Y 。
此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真
的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。
• 当前的话与前面的某些真的话冲突,就是假话
• 当前的话中 X 或 Y 比 N 大,就是假话
• 当前的话表示 X 吃 X,就是假话
你的任务是根据给定的 N 和 K 句话,输出假话的总数。
输入输出格式
输入格式:
从 eat.in 中输入数据
第一行两个整数,N,K,表示有 N 个动物,K 句话。
第二行开始每行一句话(按照题目要求,见样例)
输出格式:
输出到 eat.out 中
一行,一个整数,表示假话的总数。
输入输出样例
输入样例#1:
100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
输出样例#1:
3
说明
1 ≤ N ≤ 5 ∗ 10^4
1 ≤ K ≤ 10^5
作者:
吴语林
时间:
2018-7-28 07:46
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
using namespace std;
int n,m,l=0,fa[201000],x,y,a,all=0;
int getf(int u)
{
if(u==fa[u]) return u;
int f=getf(fa[u]);
fa[u]=f;
return f;
}
void he(int x,int y)
{
int t1=getf(x),t2=getf(y);
if(t1!=t2)
fa[t1]=t2;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=3*n;i++)
fa[i]=i;
while(m--)
{
scanf("%d%d%d",&a,&x,&y);
if(x>n||y>n)
{
all++;
continue;
}
if(a==1)
{
if(getf(x)==getf(y+n)||getf(x)==getf(y+n+n))
{
all++;
continue;
}
he(x,y);he(x+n,y+n);he(x+n+n,y+n+n);
}
else
{
if(x==y||getf(x)==getf(y)||getf(x)==getf(y+n))
{
all++;
continue;
}
he(x+n,y);he(x,y+n+n);he(y+n,x+n+n);
}
}
printf("%d",all);
return 0;
}
复制代码
作者:
zhwang
时间:
2018-7-29 19:51
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int sum,d,x,y;
int re[5*10000+100];
int f[5*10000+100];
int n,k;
vector<int> getf(int num)
{
vector<int> t(2);
if(f[num]==num)
{
t[0]=num;
t[1]=0;
return t;
}
t=getf(f[num]);
f[num]=t[0];
re[num]=(t[1]+re[num])%3;
t[1]=re[num];
return t;
}
void merge(int a,int b)
{
vector<int> t1(2);
t1=getf(a);
vector<int> t2(2);
t2=getf(b);
if(t1[0]==t2[0])
{
if(d==1)
{
if(t1[1]!=t2[1])
{
sum++;
}
}
else
{
if(d==2)
{
if((d+t2[1]-1)%3!=t1[1])
{
sum++;
}
}
}
return;
}
f[t1[0]]=t2[0];
re[t1[0]]=(d+2-re[x]+re[y])%3;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
f[i]=i;
re[i]=0;
}
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n)
{
sum++;
continue;
}
else
{
if(d==2&&x==y)
{
sum++;
continue;
}
else
{
merge(x,y);
}
}
}
printf("%d",sum);
return 0;
}
复制代码
作者:
ZMQ
时间:
2018-8-6 21:56
提示:
作者被禁止或删除 内容自动屏蔽
作者:
倚窗倾听风吹雨
时间:
2018-10-4 19:45
#include<iostream>
#define FOR(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;
const int N=50005;
int n,m,ans,x,y,z,f[N*3];
int getf(int x)
{
if(f[x]==x)return x;
f[x]=getf(f[x]);
return f[x];
}
void Merge(int x,int y){f[getf(f[x])]=getf(y);return;}
int main()
{
cin>>n>>m;
FOR(i,1,n+n+n){f[i]=i;}
while(m--)
{
cin>>z>>x>>y;
if(x>n || y>n){ans++;continue;}
if(z==1)
{
if(getf(x)==getf(y+n) || getf(x+n)==getf(y))ans++;
else{Merge(x,y);Merge(x+n,y+n);Merge(x+n+n,y+n+n);}
}
else
{
if(getf(x)==getf(y) || getf(x)==getf(y+n))ans++;
else{Merge(x+n,y);Merge(x+n+n,y+n);Merge(x,y+n+n);}
}
}
cout<<ans<<endl;
return 0;
}
复制代码
作者:
周陈诚
时间:
2020-1-13 11:29
#include<iostream>
using namespace std;
const int mn=100150;
int f[3*mn];
int ans,n,k;
int getfa(int x)
{
if(x==f[x]) return x;
f[x]=getfa(f[x]);
return f[x];
}
int main()
{
cin>>n>>k;
for(int i=1;i<=3*n+5;i++) f[i]=i;
while(k--){
int a,x,y;
cin>>a>>x>>y;
if (x>n || y>n) {
ans++;continue;}
if(a==2){
if(getfa(x)==getfa(y)||getfa(x+n+n)==getfa(y)) ans++;
else{
f[getfa(x+n)]=getfa(y);
f[getfa(x+n+n)]=getfa(y+n);
f[getfa(x)]=getfa(y+n+n);
}
}
else{
if(getfa(x+n)==getfa(y)||getfa(x+n+n)==getfa(y)) ans++;
else{
f[getfa(x)]=getfa(y);
f[getfa(x+n)]=getfa(y+n);
f[getfa(x+n+n)]=getfa(y+n+n);
}
}
}
cout<<ans;
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2