【hdu6334】【2018Multi-University-Training Contest04】Problem C. Problems on a Tree
维护1边的联通块和2边的联通块,合并的时候直接启发式合并。
cdqz的大爷好强啊。
#include<bits/stdc++.h>
#define lson (o<<1)
#define rson (o<<1|1)
#define fi first
#define sc second
#define dbg(x) cout<<#x<<" = "<<(x)<<endl;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
using namespace std;
const double pi=acos(-);
const double eps=1e-;
inline int lowbit(int x){return x&(-x);}
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
template<typename T> inline T max(T x,T y,T z){return max(max(x,y),z);}
template<typename T> inline T min(T x,T y,T z){return min(min(x,y),z);}
template<typename T> inline T sqr(T x){return x*x;}
template<typename T> inline void checkmax(T &x,T y){x=max(x,y);}
template<typename T> inline void checkmin(T &x,T y){x=min(x,y);}
template<typename T> inline void read(T &x){
x=;T f=;char ch;do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do x=x*+ch-'',ch=getchar();while(ch<=''&&ch>='');x*=f;
}
template<typename A,typename B,typename C> inline A fpow(A x,B p,C yql){
A ans=;
for(;p;p>>=,x=1LL*x*x%yql)if(p&)ans=1LL*x*ans%yql;
return ans;
}
struct FastIO{
static const int S=;
int wpos;char wbuf[S];
FastIO():wpos() {}
inline int xchar(){
static char buf[S];
static int len=,pos=;
if(pos==len)pos=,len=fread(buf,,S,stdin);
if(pos==len)return -;
return buf[pos++];
}
inline int read(){
int c=xchar(),x=;
while(c<=&&~c)c=xchar();
if(c==-)return -;
for(;''<=c&&c<='';c=xchar())x=x*+c-'';
return x;
}
}io;
//#define read io.read
const int N=;
int add[N],tag2[N],fa1[N],fa2[N],size1[N],size2[N],fa[N],d[N];
int n,m;
vector<int> G[N];
inline int find(int *fa,int x){return x==fa[x]?x:fa[x]=find(fa,fa[x]);}
inline void merge2(int x,int y){
int xx=find(fa1,x),yy=find(fa1,y);
if(d[xx]<d[yy])swap(xx,yy);
add[yy]-=size2[xx];yy=find(fa2,yy);
fa2[xx]=yy;size2[yy]+=size2[xx];
add[find(fa1,fa[yy])]+=size2[xx];
}
inline void merge1(int x,int y){
int xx=find(fa1,x),yy=find(fa1,y);
if(d[xx]<d[yy])swap(xx,yy);
fa1[xx]=yy;size1[yy]+=size1[xx];
add[yy]+=add[xx];
}
inline void dfs(int u){
d[u]=d[fa[u]]+;
add[u]=;
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(v==fa[u])continue;
fa[v]=u;dfs(v);add[u]++;
}
}
vector<pair<int,int> >p1,p2;
inline void clear(){
memset(add,,sizeof(add));
for(int i=;i<=n;i++){
fa1[i]=i;fa2[i]=i;size1[i]=;size2[i]=;G[i].clear();
}
p1.clear();p2.clear();
}
inline void work(){
for(int i=;i<n;i++){
int u=read(),v=read(),w=read();
G[u].push_back(v);G[v].push_back(u);
if(w==){
p1.push_back(make_pair(u,v));
//merge2(u,v);merge1(u,v);
}
else if(w==)p2.push_back(make_pair(u,v));
}
dfs();
for(int i=;i<p1.size();i++){
pair<int,int> p=p1[i];
merge2(p.fi,p.sc);merge1(p.fi,p.sc);
}
for(int i=;i<p2.size();i++){
pair<int,int> p=p2[i];
merge2(p.fi,p.sc);
}
while(m--){
int u=read(),v=read(),t=read(),s=read();
u=find(fa1,u);v=find(fa1,v);
if(u!=v){
if(find(fa2,u)==find(fa2,v))merge1(u,v);
else merge2(u,v);
}
s=find(fa1,s);t=find(fa1,t);int flag=;
if(find(fa2,s)==find(fa2,t))printf("1 "),flag=;
else{
if(d[find(fa2,s)]>d[find(fa2,t)]){
if(find(fa1,fa[find(fa2,s)])==t)printf("1 "),flag=;
}
else if((t==find(fa2,t)&&find(fa2,fa[t])==find(fa2,s)))printf("1 "),flag=;
}
if(!flag)printf("0 ");
printf("%d\n",size2[find(fa2,t)]+add[t]+(t==find(fa2,t)?size2[find(fa2,fa[t])]:));
}
}
int main(){
int T=read();
while(T--){
n=read();m=read();
clear();
work();
}
}
【hdu6334】【2018Multi-University-Training Contest04】Problem C. Problems on a Tree的更多相关文章
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
- WCF学习系列二---【WCF Interview Questions – Part 2 翻译系列】
http://www.topwcftutorials.net/2012/09/wcf-faqs-part2.html WCF Interview Questions – Part 2 This WCF ...
- 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】
[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...
- 【刷题记录】 && 【算法杂谈】折半枚举与upper_bound 和 lower_bound
[什么是upper_bound 和 lower_bound] 简单来说lower_bound就是你给他一个非递减数列[first,last)和x,它给你返回非递减序列[first, last)中的第一 ...
- SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区
一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...
- SQL Server 解读【已分区索引的特殊指导原则】(2)- 唯一索引分区
一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...
- WCF学习系列三--【WCF Interview Questions – Part 3 翻译系列】
http://www.topwcftutorials.net/2012/10/wcf-faqs-part3.html WCF Interview Questions – Part 3 This WCF ...
- WCF学习系列四--【WCF Interview Questions – Part 4 翻译系列】
WCF Interview Questions – Part 4 This WCF service tutorial is part-4 in series of WCF Interview Qu ...
- Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】
原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...
随机推荐
- BZOJ4553: [Tjoi2016&Heoi2016]序列 树套树优化DP
把pos[i]上出现的平常值定义为nor[i]最大值定义为max[i]最小值定义为min[i],那么我们发现在两个值,i(前),j(后),当且仅当max[i]<=nor[j],nor[i]< ...
- 超计算(Hyper computation)模型
超计算(Hyper computation)模型 作者:Xyan Xcllet链接:https://www.zhihu.com/question/21579465/answer/106995708来源 ...
- 洛谷 P4244 [SHOI2008]仙人掌图 II 解题报告
P4244 [SHOI2008]仙人掌图 II 题目背景 题目这个II是和SHOI2006的仙人掌图区分的,bzoj没有. 但是实际上还是和bzoj1023是一个题目的. 题目描述 如果某个无向连通图 ...
- 解题:USACO15JAN Grass Cownoisseur
解题 首先缩点没啥可说的,然后考虑枚举这次逆行的边.具体来说在正常的图和反图上各跑一次最长路,然后注意减掉起点的贡献,用拓扑排序实现(我这里瞎写了个Bellman_Ford,其实在DAG上这好像和拓扑 ...
- C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}
C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...
- R语言画图
转http://www.cnblogs.com/jiangmiaomiao/p/6991632.html 0 引言 R支持4种图形类型: base graphics, grid graphics, l ...
- 1044 Shopping in Mars
Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...
- Nginx Configuration 免费HTTPS加密证书
Linux就该这么学 2018-05-11 实验环境:CentOS Linux release 7.3.1611 (Core) 内核版本:Linux version 3.10.0-514.el7.x8 ...
- GO_08:GO语言基础之interface
接口interface 1. 接口是一个或多个方法签名的集合 2. 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明实现了哪个接口,这称为 Structural typing 3. ...
- linux下常用的几个时间函数:time,gettimeofday,clock_gettime,_ftime
time()提供了秒级的精确度 1.头文件 <time.h> 2.函数原型 time_t time(time_t * timer) 函数返回从TC1970-1-1 0:0:0开始到现在的秒 ...