CodeForces - 763A(并查集/思维)
题意
https://vjudge.net/problem/CodeForces-763A
一棵无根树中各个节点被染上了一种颜色c[i]
现在让你选择一个点作为根节点,使得这个根节点的所有儿子满足以该儿子节点的作为根的子树中所有点颜色均相同(不同儿子为根的子树颜色可以不同)
思路
俺的方法:
暴力水过。用并查集把相同颜色的连了边的点缩点,然后枚举每个点作为答案,判断这个点所连的的所有点的所在相同颜色连通块的大小之和是否等于n-1即可(除去自己这个点)。
正解:
先计算每个点与所连的点的颜色不同的点数,把两端颜色不同的边数也记录。如果某个点与连的点的不同颜色的个数==所有颜色不同的边数,那么这个点就是满足条件的。
这样想,作为根的这个点连的其他连通块肯定每个连通块颜色都是相同的,那么颜色不同的边只能在根这个点产生。
代码
俺的:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=100005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int c[N],pre[N];
vector<int> g[N];
int flag=0;
int find(int x)
{
if(x==pre[x])
return x;
return pre[x]=find(pre[x]);
}
set<int> s[N];
int main()
{
std::ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1; i<n; i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
int q,mx=0;
for(int i=1; i<=n; i++)
{
cin>>c[i];
pre[i]=i;
}
for(int i=1; i<=n; i++)
{
int sz=g[i].size();
for(int j=0; j<sz; j++)
{
if(c[i]==c[g[i][j]])
{
int fi=find(i),fj=find(g[i][j]);
if(fi!=fj)
pre[fj]=fi;
}
}
}
for(int i=1; i<=n; i++)
{
s[find(i)].insert(i);
}
int p,f=0;
for(int i=1; i<=n; i++)
{
int sum=0;
int sz=g[i].size();
for(int j=0; j<sz; j++)
{
int v=g[i][j];
sum+=s[find(v)].size();
}
// cout<<i<<" "<<sum<<endl;
if(s[i].size()!=1)
{
sum--;
}
if(sum==n-1)
{
p=i;
flag=1;
break;
}
}
if(!flag)
cout<<"NO"<<endl;
else
{
cout<<"YES"<<endl;
cout<<p<<endl;
}
return 0;
}
/*
7
1 7
1 3
1 4
4 5
1 2
2 6
3 2 1 2 2 2 2
*/
/*
8
1 4
2 4
3 4
4 8
1 7
2 5
2 6
2 1 8 2 1 1 2 6
*/
正解:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=100005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int c[N],s[N],u[N],v[N];
int main()
{
std::ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1; i<n; i++)
{
cin>>u[i]>>v[i];
}
int q,mx=0;
for(int i=1; i<=n; i++)
{
cin>>c[i];
}
int sum=0;
for(int i=1;i<n;i++)
{
if(c[u[i]]!=c[v[i]])
s[u[i]]++,s[v[i]]++,sum++;
}
for(int i=1;i<=n;i++)
{
if(s[i]==sum)
{
cout<<"YES"<<endl<<i<<endl;
return 0;
}
}
cout<<"NO"<<endl;
return 0;
}
CodeForces - 763A(并查集/思维)的更多相关文章
- Codeforces 722C(并查集 + 思维)
本文链接:http://www.cnblogs.com/Ash-ly/p/5932712.html 题目链接:http://codeforces.com/problemset/problem/722/ ...
- [codeforces 859 E] Desk Disorder 解题报告 (并查集+思维)
题目链接:http://codeforces.com/problemset/problem/859/E 题目大意: 有$n$个人,$2n$个座位. 给出这$n$个人初始的座位,和他们想坐的座位. 每个 ...
- Codeforces Round #600 (Div. 2) D题【并查集+思维】
题意:给你n个点,m条边,然后让你使得这个这个图成为一个协和图,需要加几条边.协和图就是,如果两个点之间有一条边,那么左端点与这之间任意一个点之间都要有条边. 思路:通过并查集不断维护连通量的最大编号 ...
- Codeforces 980 并查集/模拟贪心最小字典序 找规律/数去除完全平方因子 逆思维倍增预处理祖先标记点
A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...
- Vladik and Entertaining Flags CodeForces - 811E (并查集,线段树)
用线段树维护每一块左右两侧的并查集, 同色合并时若不连通则连通块数-1, 否则不变 #include <iostream> #include <algorithm> #incl ...
- F - Number of Connected Components UVALive - 7638 (并查集 + 思维)
题目链接:https://cn.vjudge.net/contest/275589#problem/F 题目大意:就是给你n个数,如果说两个数之间的gcd!=1,那么就将这两个点连起来,问你最终这些点 ...
- CodeForces - 893C-Rumor(并查集变式)
Vova promised himself that he would never play computer games... But recently Firestorm - a well-kno ...
- 并查集+思维——The Door Problem
一.问题描述(题目链接) 有n个门和m个开关,每个开关可以控制任意多的门,每个门严格的只有两个开关控制,问能否通过操作某些开关使得所有门都打开.(给出门的初始状态). 二.问题分析 大部分开关问题首先 ...
- 并查集+思维——X-Plosives
一.问题描述(题目链接) 有n种化合物,每种化合物由两种元素组成.当几种的化合物数量等于他们所含不同元素的数量时,就会发生爆炸.现在依次给出化合物的组成,当新的化合物与之前的化合物放在一起会发生爆炸时 ...
随机推荐
- JS完美拖拽
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>& ...
- Jmeter性能测试分布式技术
一.什么是分布式测试 分布式测试是指通过局域网和Internet,把分布于不同地点.独立完成特定功能的测试计算机连接起来,以达到测试资源共享.分散操作.集中管理.协同工作.负载均衡.测试过程监控等目的 ...
- 一起学SpringMVC之异常处理
在系统开发过程中,异常处理是不可避免,如果异常处理不好,会给用户造成很差的体验,本文主要讲解在SpringMVC开发过程中,异常处理的相关知识点,仅供学习分享使用,如有不足之处,还请指正. 概述 在S ...
- 《Python3 网络爬虫开发实战》开发环境配置过程中踩过的坑
<Python3 网络爬虫开发实战>学习资料:https://www.cnblogs.com/waiwai14/p/11698175.html 如何从墙内下载Android Studio: ...
- synchronized到底锁住的是谁?
本文代码仓库:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/sync 先来一道校招级并发编程笔试题 题 ...
- QT--动态人流量监测系统
QT--动态人流量监测系统 简介: 本项目使用了百度AI的动态人流量监测api,以人体头肩为主要识别目标,适用于低空俯拍,出入口场景,可用于统计当前图像的锁定人数和经过的人数 项目功能 本项目分为相机 ...
- SQL Server之批量清理数据库的死锁
DECLARE killspid CURSOR FOR (SELECT CONVERT(VARCHAR(100), request_session_id) FROM sys.dm_tran_l ...
- Tornado—添加请求头允许跨域请求访问
跨域请求访问 如果是前后端分离,那就肯定会遇到cros跨域请求难题,可以设置一个BaseHandler,然后继承即可. class BaseHandler(tornado.web.RequestHan ...
- Linux禁用root用户
在创建各种云主机的时候,云服务商给的都是root用户,这很方便,但是有某些时候会造成一些困扰,日后在服务器上启动各种服务后,仅仅拥有root权限的用户才能访问更改这些服务,这样会造成一些不必要的困扰, ...
- Hive参数调优
调优 Hive提供三种可以改变环境变量的方法,分别是: (1)修改${HIVE_HOME}/conf/hive-site.xml配置文件: 所有的默认配置都在${HIVE_HOME}/conf/hiv ...