Gym - 101243F

http://codeforces.com/gym/101243

题意:有三种药,是不同重量的三种药,但是不知道哪种是哪种,现在给你一些称量的结果,要你把这些药的种类区分出来

思路:最开始想的是并查集,但是一直没有想到怎么并,然后看了下别人的思路,就懂了。

当两个药的颜色一样的时候,并起来,然后颜色不同的时候,用一个两个数组分别记录一下,表示这两个药有差别,一个重,一个轻

然后之后分类,如果某个药既有比它重的,

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <vector>
 5 using namespace std;
 6
 7 vector<pair<int,int> >v;
 8 vector<int>s[1005];
 9
10 int father[1005];
11 int down[1005],up[1005];
12 char ans[1005];
13
14 int Find(int x)
15 {
16     if(father[x]!=x)
17         return father[x] = Find(father[x]);
18     return father[x];
19 }
20
21
22 void unio(int a,int b)
23 {
24     int root1 = Find(a);
25     int root2 = Find(b);
26     if(root1!=root2)
27         father[root1] = root2;
28 }
29
30 int main()
31 {
32   //  freopen("input.txt","r",stdin);
33   // freopen("output.txt","w",stdout);
34     int m,n;
35     int a,b;
36     char c;
37     scanf("%d%d",&m,&n);
38     for(int i = 1;i<=m;i++)
39     {
40         father[i] = i;
41         ans[i]=‘?‘;
42     }
43     for(int i = 0;i<n;i++)
44     {
45         scanf("%d%c%d",&a,&c,&b);
46         if(c==‘=‘)
47             unio(a,b);
48         else {
49             if(c==‘>‘)
50                 swap(a,b);
51             v.push_back(make_pair(a,b));
52         }
53     }
54     for(int i = 1;i<=m;i++)
55     {
56         Find(i);
57         s[Find(i)].push_back(i);
58     }
59     for(int i = 0;i<v.size();i++)
60     {
61         a = v[i].first;
62         b = v[i].second;
63         down[Find(a)]++;
64         up[Find(b)]++;
65     }
66     for(int i =1;i<=m;i++)
67     {
68         if(down[Find(i)]&&up[Find(i)])
69         {
70             for(int j = 0;j<s[Find(i)].size();j++)
71             {
72                 ans[s[Find(i)][j]] = ‘R‘;
73             }
74             s[Find(i)].clear();
75         }
76     }
77     for(int i = 0;i<v.size();i++)
78     {
79         a = v[i].first;
80         b = v[i].second;
81         if(ans[a]==‘R‘){
82             for(int j = 0;j<s[Find(b)].size();j++)
83                 ans[s[Find(b)][j]] = ‘W‘;
84             s[Find(b)].clear();
85         }else if(ans[b]==‘R‘){
86             for(int j = 0;j<s[Find(a)].size();j++)
87                 ans[s[Find(a)][j]]=‘B‘;
88             s[Find(a)].clear();
89         }
90     }
91     for(int i = 1;i<=m;i++)
92         printf("%c",ans[i]);
93     printf("\n");
94     return 0;
95 }

又有比他轻的那么说明这个一定是中间的药,那么所有的这个颜色的药都可以找出来

然后重的轻的都可以通过这个中间的药比较出来

时间: 2024-10-25 05:20:28

Gym - 101243F的相关文章

CodeForces Gym 100935D Enormous Carpet 快速幂取模

Enormous Carpet Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Gym 100935D Description standard input/outputStatements Ameer is an upcoming and pretty talented problem solver who loves to solve problems using computers.

B - Average Gym - 101161B 组合数学

http://codeforces.com/gym/101161/attachments 今天被卡常了,其实是自己对组合数技巧研究的不够. 如果是n, m <= 1e5的,然后取模是质数,那么可以用费马小定理. 如果n, m都比较小,那么其实是直接杨辉三角.不用逆元那些. 这题的思路是,枚举每一一个ave,然后总和就是n * ave 相当于方程  x1 + x2 + .... + xn = n * ave中,在0 <= x[i] <= full的情况下,不同解的个数中,使得x[i] ==

Codeforces Gym 100269 Dwarf Tower (最短路)

题目连接: http://codeforces.com/gym/100269/attachments Description Little Vasya is playing a new game named "Dwarf Tower". In this game there are n different items,which you can put on your dwarf character. Items are numbered from 1 to n. Vasya want

CodeForces Gym 101063C 二进制压缩

http://codeforces.com/gym/101063/problem/C 给n个人,m样物品,每个人可以从物品中选择几样.两人选择物品的交集元素个数比上并集元素个数如果大于某个比例即可将两人配对.求配对数. n的范围是1e5,直接比较所有人的选择会TLE,应该将所有选择物品的情况用二进制压缩,m最大是10,情况数目小于2048,可以接受.注意配对总数范围应为long long. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> i

Gym 101246H ``North-East&#39;&#39;(LIS)

http://codeforces.com/gym/101246/problem/H 题意: 给出n个点的坐标,现在有一个乐队,他可以从任一点出发,但是只能往右上方走(包括右方和上方),要经过尽量多的点.输出它可能经过的点和一定会经过的点. 思路: 分析一下第一个案例,在坐标图上画出来,可以发现,他最多可以经过4个点,有两种方法可以走. 观察一下,就可以发现这道题目就是要我们求一个LIS. 首先,对输入数据排一下顺序,x小的排前,相等时则将y大的优先排前面. 用二分法求LIS,这样在d数组中就可

Gym 100712I Bahosain and Digits(开关翻转问题)

http://codeforces.com/gym/100712/attachments 题意: 给出一串数字,每次选择连续的k个数字加上任意数(超过10就取余),最后要使得所有数字都相等,求最大的k. 思路: 开关翻转问题. 算法具体可以参考<挑战程序竞赛>常用技巧篇. 这道题目就是在枚举k的同时再枚举一下最后要转换成的数字即可. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring>

很好的脑洞题:dfs+暴力 Gym - 101128A Promotions

http://codeforces.com/gym/101128 题目大意:给你一个a,b,e,p.有e个点,p条有向边,每条边为(x,y),表示x->y,每次我们都取出一个入度为0的,并且一次性取出来的个数为a(或b).当然,取出来的种类可能有很多种(即一个集合),问,这个集合中有多少个数字是相同的. 第一个输出集合长度为a的,第二个输出集合长度为b的,第三个输出无论如何都无法被取出的个数. 思路:建立正向图和反向图. 定义pair<int, int> interval[i] 表示第i

【树状数组】Gym - 101147J - Whistle&#39;s New Car

题意就是对每个点i,统计在其子树内(不含自身),且depj-depi<=xj的点有多少个. 把点分别按照dep-x和dep进行排序,离线处理, 每次把dep-x小于等于当前dep值的点插入树状数组,就变成了询问dfs序在一个区间内的点有多少个,可以用树状数组轻松解决. #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int f,C; void R(int &am

SYSU-7, Gym 100273J, trie+hash

cnm毛子的题是正宗内家拳法啊orz(捶地),拼的就是智商,这题我们队想了老半天后缀自动机,掏出各种黑科技无果 题目大意:构建一个自动机可以表达给定的n个串,询问最小的自动机节点树为多少. 解:最裸的自动机其实就是一棵trie,那么我们考虑优化这棵trie,考虑拓扑排序倒过来做,可以发现其实如果两个节点如果他们指向的节点状态完全一致,那么这两个节点是等价的,所以我们不断合并这些节点即可.但是拓扑可能会慢,而且貌似会退化n方(没细想),但一般地,我们用dfs出栈序去做这个hash去重即可. cnm