NOIP 模拟 $28\; \rm 割海成路之日$
题解 \(by\;zj\varphi\)
用两个集合分别表示 \(1\) 边联通块,\(1,2\) 边联通块 。
\(\rm son_x\) 表示当前节点通过 \(3\) 类边能到的 \(2\) 联通块的数量,\(tw\) 表示当前节点 \(2\) 联通块的大小。
这些都可以预处理出来,最后在计算答案时不要忘了加上父亲的贡献。
最后因为并查集只有合并而没有拆开,所以复杂度为 \(\mathcal O\rm (nlogn)\)。
Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf,OPUT[100];
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++;
template<typename T>inline void read(T &x) {
ri f=1;x=0;register char ch=gc();
while(!isdigit(ch)) {if (ch=='-') f=0;ch=gc();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
template<typename T>inline void print(T x,char t) {
if (x<0) putchar('-'),x=-x;
if (!x) return putchar('0'),(void)putchar(t);
ri cnt(0);
while(x) OPUT[p(cnt)]=x%10,x/=10;
for (ri i(cnt);i;--i) putchar(OPUT[i]^48);
return (void)putchar(t);
}
}
using IO::read;using IO::print;
namespace nanfeng{
#define FI FILE *IN
#define FO FILE *OUT
template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
static const int N=3e5+7;
int first[N],w[N],f[N],tw[N],son[N],n,m,t=1;
struct edge{int v,nxt,w;}e[N<<1];
inline void add(int u,int v,int w) {
e[t].v=v,e[t].w=w,e[t].nxt=first[u],first[u]=t++;
e[t].v=u,e[t].w=w,e[t].nxt=first[v],first[v]=t++;
}
struct UDS{
int fa[N];
UDS(){for (ri i(1);i<=N-7;p(i)) fa[i]=i;}
int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
}O,T;
void dfs(int x,int fa) {
tw[x]=1;
for (ri i(first[x]),v;i;i=e[i].nxt) {
if ((v=e[i].v)==fa) continue;
f[v]=x,w[v]=e[i].w;
dfs(v,x);
if (w[v]==1) {
O.fa[v]=x;
son[x]+=son[v];
}
if (w[v]!=3) {
T.fa[v]=x;
tw[x]+=tw[v];
}
if (w[v]==3) son[x]+=tw[v];
}
}
inline void solve2(int u,int v) {
int k=O.find(u);
O.fa[v]=u;
son[k]+=son[v];
}
inline void solve3(int u,int v) {
int k=O.find(u);
son[k]-=tw[v];
u=T.find(u);
T.fa[v]=u;
tw[u]+=tw[v];
k=O.find(f[u]);
if (w[u]==3&&k) son[k]+=tw[v];
}
inline int check(int u,int v) {
return O.find(f[T.find(v)])==O.find(u)||T.find(f[O.find(u)])==T.find(v)
||T.find(u)==T.find(v);
}
inline int count(int x) {
int ans=tw[T.find(x)]+son[O.find(x)];
x=O.find(x);
if (w[x]==3) ans+=tw[T.find(f[x])];
return ans;
}
inline int main() {
//FI=freopen("nanfeng.in","r",stdin);
//FO=freopen("nanfeng.out","w",stdout);
read(n),read(m);
for (ri i(1),u,v,nw;i<n;p(i)) read(u),read(v),read(nw),add(u,v,nw);
dfs(1,0);
for (ri i(1),u,v,a,b;i<=m;p(i)) {
read(u),read(v),read(a),read(b);
if (f[v]!=u) swap(u,v);
if (w[v]==2) solve2(u,v);
else if (w[v]==3) solve3(u,v);
--w[v];
print(check(a,b),' '),print(count(a),'\n');
}
return 0;
}
}
int main() {return nanfeng::main();}
NOIP 模拟 $28\; \rm 割海成路之日$的更多相关文章
- lfyzoj103 割海成路之日
问题描述 现在,摆在早苗面前的是一道简单题.只要解决了这道简单题,早苗就可以发动她现人神的能力了: 输出 \[1\ \mathrm{xor}\ 2\ \mathrm{xor} \cdots \math ...
- Solution -「LOCAL」割海成路之日
\(\mathcal{Description}\) OurOJ. 给定 \(n\) 个点的一棵树,有 \(1,2,3\) 三种边权.一条简单有向路径 \((s,t)\) 合法,当且仅当走过一条 ...
- NOIP 模拟 $28\; \rm 客星璀璨之夜$
题解 \(by\;zj\varphi\) 概率与期望,考虑 \(\rm dp\) 设 \(dp_{i,j}\) 为消除 \(i-j\) 这一段行星的期望,转移: 枚举 \(k\) 为当前状态下第一个撞 ...
- NOIP 模拟 $28\; \rm 遗忘之祭仪$
题解 \(by\;zj\varphi\) 直接贪心模拟即可,对于每个点,如果它未被覆盖,直接在这覆盖一次. 每个黑点只会被扫一次,所以总复杂度为 \(\mathcal O\rm (nm)\) Code ...
- 将linux下的rm命令改造成移动文件至回收站【转】
转自:http://blog.csdn.net/a3470194/article/details/16863803 [-] 将linux下的rm命令改造成移动文件至回收站 将AIX下的rm命令改造成移 ...
- 将linux下的rm命令改造成移动文件至回收站
将linux下的rm命令改造成移动文件至回收站 rm是Linux下文件删除的命令,它是Linux下非常强大却又非常危险的一条命令,特别是rm -rf有时候强大到让你欲哭无泪,当你想清除当前目录下的所有 ...
- BZOJ 1001 狼抓兔子 (最小割转化成最短路)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 27715 Solved: 7134[Submit][ ...
- 2021.5.22 noip模拟1
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...
- 道路 [NOIP模拟]
Description 我们看见了一个由 m 行 n 列的 1*1 的格子组成的矩阵,每个格子(I,j)有对应的高度 h[i][j]和初始的一个非负权值 v[i][j].我们可以随便选择一个格子作为起 ...
随机推荐
- PHP大文件分片上传的实现方法
一.前言 在网站开发中,经常会有上传文件的需求,有的文件size太大直接上传,经常会导致上传过程中耗时太久,大量占用带宽资源,因此有了分片上传. 分片上传主要是前端将一个较大的文件分成等分的几片,标识 ...
- idea本地调式tomcat源码
前言 上篇文章中一直没搞定的tomcat源码调试终于搞明白了,p神的代码审计星球里竟然有,真的好b( ̄▽ ̄)d ,写一下过程,还有p神没提到的小坑 准备阶段 1.去官网下东西:https://tomc ...
- 基于Mininet的网络拓扑搭建代码
1 import logging 2 import os 3 import time 4 import thread 5 import multiprocessing 6 7 from mininet ...
- CTF-Streamgame2-writeup
Streamgame2 题目信息: 附件: streamgame2.py from flag import flag assert flag.startswith("flag{") ...
- 【剑指offer】77.调整数组顺序使奇数位于偶数前面
77.调整数组顺序使奇数位于偶数前面 知识点:数组:快速排序:冒泡排序: 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部 ...
- artTemplate学习
参考:https://www.2cto.com/kf/201711/699818.html 参考:https://blog.csdn.net/ruisenLi/article/details/8841 ...
- 分别在Update和FixedUpdate使用GetKeyDown
测试目的 探究分别在Update和FixedUpdate使用GetKeyDown执行次数,会不同的 测试开始 在Update测试 我们先在Update测试,很正常是一帧重置一下状态,以防止点击一下执行 ...
- vue(23)Vuex的5个核心概念
Vuex的核心概念 Vuex有5个核心概念,分别是State,Getters,mutations,Actions,Modules. State Vuex使用单一状态树,也就是说,用一个对象包含了所 ...
- Python中input()函数用法
input()函数获取用户输入数据,实现用户交互 语法格式: 变量 = input("提示信息") input()返回的是字符串,无论输入的是数字还是字符串,默认的输入结束键是回车 ...
- 攻防世界Web区部分题解
攻防世界Web区部分题解 前言:PHP序列化就是把代码中所有的 对象 , 类 , 数组 , 变量 , 匿名函数等全部转换为一个字符串 , 提供给用户传输和存储 . 而反序列化就是把字符串重新转换为 ...