CodingTrip - 攜程編程大賽 (預賽第二場)第一題

剪刀石頭布

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 4   Accepted Submission(s) : 1

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

現有M我的一塊兒玩剪刀石頭布,以1-M編號,每人出一種,出過再也不改變,可是咱們並不知道它究竟是哪種。 (其中石頭贏剪刀,剪刀贏布,布贏石頭,同樣則平)
裁判用兩種說法對這M我的所構成的輸贏關係進行描述: 
一:"1 A B",表示第A我的和第B我的出的同樣。 
二:"2 A B",表示第A我的贏第B我的。 
裁判對M我的,用以上兩種說法,連說N句話,其中有真的、也有假的。
一句話出現如下狀況,就是假話,不然就是真話。 
1) 該句話與以前的某些真話衝突; 
2) 該句話中A或B比M大; 
3) 該句話表示A贏A。 

請根據給定的M和N,輸出假話數。
其中(1 <= M <= 10,000),(0 <= N <= 10,000)

Input

第1行是一個天然數K,表明有K組數據。
每組數據以一個空行分隔,其中每組數據的第1行是兩個天然數M、N,以空格分開。 
每組數據的第2行至N+1行,每行是三個天然數X,A,B,三個數之間用空格分開,X(1或2)表示說法的種類。

Output

每組數據對應一行,每行有一個整數,表明假話數。

Sample Input

3

43 11
1 4 3
2 3 3
1 4 1
1 4 4
2 3 3
1 2 2
2 1 4
1 1 1
2 1 4
2 3 4
2 3 2

66 9
2 3 1
2 4 4
2 1 2
2 4 3
2 4 2
2 2 3
1 3 2
1 2 1
1 1 1

6 7
2 3 7
2 1 2
2 4 4
1 2 1
1 3 2
1 2 3
2 1 3

Sample Output

5
4
3

詳見POJ1182···(PS:攜程好多陳題,傳說第二題也是POJ上面的題···)
  1 /*
  2 ID: asif
  3 LANG: C++
  4 TASK: test
  5 */
  6 //# pragma comment(linker, "/STACK:102400000,102400000")
  7 # include<iostream>
  8 # include<cstdio>
  9 # include<cstdlib>
 10 # include<cstring>
 11 # include<algorithm>
 12 # include<cctype>
 13 # include<cmath>
 14 # include<string>
 15 # include<set>
 16 # include<map>
 17 # include<stack>
 18 # include<queue>
 19 # include<vector>
 20 # include<numeric>
 21 using namespace std;
 22 const int maxn=100010;
 23 const double inf=0.000001;
 24 const int INF=~0U>>1;
 25 const int mod=1000000007;
 26 # define PI (acos(0)*2.0)
 27 # define lson l,m,rt<<1
 28 # define rson m+1,r,rt<<1 | 1
 29 # define PS printf("\n")
 30 # define S(n) scanf("%d",&n)
 31 # define P(n) printf("%d\n",n)
 32 # define Ps(n) printf(" %d",(n))
 33 # define SB(n) scanf("%lld",&n)
 34 # define PB(n) printf("%lld\n",n)
 35 # define PBs(n) printf(" %lld",n)
 36 # define SD(n) scanf("%lf",&n)
 37 # define PD(n) printf("%.3lf\n",n)
 38 # define Sstr(s) scanf("%s",s)
 39 # define Pstr(s) printf("%s\n",s)
 40 # define S0(a) memset(a,0,sizeof(a))
 41 # define S1(a) memset(a,-1,sizeof(a))
 42 typedef long long ll;
 43 int n,f[maxn],p[maxn],m;
 44 int equal(double x,double y)
 45 {
 46     if(x-y>=-inf&&x-y<=inf)
 47         return 0;
 48     else if(x-y>inf)
 49         return 1;
 50     return -1;
 51 }
 52 void init()
 53 {
 54     for(int i=0;i<=n;i++)
 55         f[i]=i,p[i]=0;
 56 }
 57 int find(int x)
 58 {
 59     if(x==f[x])
 60         return x;
 61     int fx=find(f[x]);
 62     p[x]=(p[x]+p[f[x]])%3;
 63     f[x]=fx;
 64     return f[x];
 65 }
 66 bool unin(int a,int x,int y)
 67 {
 68     a--;
 69     int fx=find(x);
 70     int fy=find(y);
 71     if(fx==fy)
 72     {
 73         if((p[y]-p[x]+3)%3!=a)
 74             return true;
 75         return false;
 76     }
 77     f[fy]=fx;
 78     p[fy]=(p[x]-p[y]+3+a)%3;
 79     return false;
 80 }
 81 int main()
 82 {
 83     //freopen("input.in", "r", stdin);
 84     //freopen("output.out", "w", stdout);
 85     int T;
 86     S(T);
 87     while(T--)
 88     {
 89         S(n),S(m);
 90         init();
 91         int ans=0;
 92         while(m--)
 93         {
 94             int a,u,v;
 95             S(a),S(u),S(v);
 96             if(u>n||v>n||(a==2&&u==v))
 97                 ans++;
 98             else
 99             {
100                 if(unin(a,u,v))
101                     ans++;
102             }
103         }
104         P(ans);
105     }
106     return 0;
107 }
View Code
相關文章
相關標籤/搜索