Gym - 101243F Vitamins(思维+并查集)

题意
有三种药丸,白色W>红色R>蓝色B,给你m个约束条件,问你n个药丸的颜色,不能确定颜色输出‘?’
题解
如果1<2<3,只要找到2就能确定1和3的颜色
如果2=4,只要确定一个就能确定另一个
处理的时候先把=用并查集处理一下
在处理<和>号
代码
#include<bits/stdc++.h>
using namespace std; const int maxn=;
const int maxm=maxn*maxn/;
int f[maxn];
int u[maxm],v[maxm],op[maxm];
vector<int>big[maxn],small[maxn];
char s[];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)f[i]=i;
for(int i=;i<=m;i++)
{
scanf("%s",s);
int l=strlen(s),sum=;
for(int j=;j<=l;j++)
{
if(j==l)
{
v[i]=sum;
continue;
}
if(s[j]>=''&&s[j]<='')
sum=sum*+s[j]-'';
else
{
if(s[j]=='>')op[i]=;
if(s[j]=='<')op[i]=;
if(s[j]=='=')op[i]=;
u[i]=sum,sum=;
}
}
if(op[i]==)f[find(u[i])]=find(v[i]);
}
for(int i=;i<=m;i++)
if(op[i]==)
{
int fu=find(u[i]),fv=find(v[i]);
small[fu].push_back(fv);
big[fv].push_back(fu);
}
else if(op[i]==)
{
int fu=find(u[i]),fv=find(v[i]);
small[fv].push_back(fu);
big[fu].push_back(fv);
}
char ans[maxn];
memset(ans,'?',sizeof ans);
for(int i=;i<=n;i++)
{
if(small[i].size()>&&big[i].size()>)
{
ans[i]='R';
for(int j=;j<small[i].size();j++)
ans[small[i][j]]='B';
for(int j=;j<big[i].size();j++)
ans[big[i][j]]='W';
}
}
for(int i=;i<=n;i++)
if(f[i]==i)
{
for(int j=;j<=n;j++)
{
if(ans[j]=='?'&&find(j)==f[i])
ans[j]=ans[i];
}
}
for(int i=;i<=n;i++)
printf("%c",ans[i]);
printf("\n");
return ;
}
Gym - 101243F Vitamins(思维+并查集)的更多相关文章
- 【枚举】【并查集】Gym - 101243F - Vitamins
题意:有n片药,有三种颜色,白色比红色重,红色比蓝色重,给你一些它们之间的重量关系,比如1>3,2=4之类,问你它们的颜色,如果没法判断的输出?. 先并查集把等于号全缩起来,然后按照大于号建图, ...
- Gym 100814C Connecting Graph 并查集+LCA
Description standard input/output Statements Alex is known to be very clever, but Walter does not be ...
- 思维+并查集 hdu5652
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意: 输入T,接下来T个样例,每个样例输入n,m代表图的大小,接下来n行,每行m个数,代表图, ...
- cf 之lis+贪心+思维+并查集
https://codeforces.com/contest/1257/problem/E 题意:有三个集合集合里面的数字可以随意变换位置,不同集合的数字,如从第一个A集合取一个数字到B集合那操作数+ ...
- 牛客网多校第4场 J Hash Function 【思维+并查集建边】
题目链接:戳这里 学习博客:戳这里 题意: 有n个空位,给一个数x,如果x%n位数空的,就把x放上去,如果不是空的,就看(x+1)%n是不是空的. 现在给一个已经放过数的状态,求放数字的顺序.(要求字 ...
- codeforces 1013B 【思维+并查集建边】
题目链接:戳这里 转自:参考博客 题意:给一个n*m的矩阵,放入q个点,这q个点之间的关系是,若已知这样三个点(x1,y1),(x2,y1),(x1,y2),可以在(x2,y2)处生成一个新的点,对于 ...
- CodeForces - 1243D (思维+并查集)
题意 https://vjudge.net/problem/CodeForces-1243D 有一张完全图,n个节点 有m条边的边权为1,其余的都为0 这m条边会给你 问你这张图的最小生成树的权值 思 ...
- Codeforces Gym 100463E Spies 并查集
Spies Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463/attachments Desc ...
- hdu6074[并查集+LCA+思维] 2017多校4
看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...
随机推荐
- Redis-Desktop-Manager的下载与使用
redis可视化工具 参考 https://blog.csdn.net/Future_LL/article/details/84591057
- UI5-学习篇-18-云端UI5应用部署到Fiori Launchpad
UI5应用发布SCP 选择UI5应用项目,右键 Deploy - Deploy to SAP Cloud Platform 输入云平台子账号,项目名称,应用名称,如下图所示: 点击Open the r ...
- OC copy mutableCopy, 浅拷贝,深拷贝
copy与mutableCopy都是深拷贝,区别是mutableCopy拷贝出的对象是可变的. OC对象基本都是通过指针访问,所以一般情况下,通过对指针的赋值都是浅拷贝,即只是拷贝了一份对象的指针,对 ...
- JDK1.8 LocalDateTime 时间类与字符互转
public static void main(String[] args) { DateTimeFormatter dateTimeFormatter=DateTimeFormatter.ofPat ...
- linux终端发送邮件
使用mail: echo "This is message to send" | mail -a /tmp/attachment.txt -s "This is Subj ...
- groovy语法
1.注释1.1. 单行注释1.2. 多行注释1.3. GroovyDoc注释1.4. Shebang线2.关键词3.标识符3.1. 普通标识符3.2. 带引号的标识符4.字符串4.1. 单引号字符串4 ...
- Java API下载和查阅方法
使用来自API的类是简单的.只要把它当做自己写的就可以,采用import来引用,可以节省自己编程的气力~ 1.API文档下载地址 https://www.oracle.com/technetwork/ ...
- Jsp基本语法 第二节
关于JSP的声明 即在JSP页面定义方法或者变量: <%!Java代码%> 在JSP页面中执行的表达式:<%=表达式%> 这个里尤其注意不能以:结束 JSP页面生命周期 ...
- SQL Server Assembly (SQL CLR) 还原数据库后的问题
最近弄项目迁移的时候遇到还原数据库(SQL Server 2008)后遇到的一个问题: 消息 10314,级别 16,状态 11,第 1 行 在尝试加载程序集 ID 65536 时 Microsoft ...
- 将一个dropdownlist从一个div复制到另一个div
<select id="dropdwon1"> <option value=">Item1</option> <option v ...