NOIP 模拟 $38\; \rm c$
题解 \(by\;zj\varphi\)
发现就是一棵树,但每条边都有多种不同的颜色,其实只需要保留随便三种颜色即可。
直接点分治,将询问离线,分成一端为重心,和两端都不为重心的情况。
每次只关心经过重心的询问,其他询问不管,具体实现就是点分治的套路,每次搜一棵子树,更新标记。
动归有些小细节,尽量边权化点权,不容易出错,式子直接看官方题解。
复杂度 \(\mathcal O\rm(3^3nlogn+3^4q)\)
Code
#include<bits/stdc++.h>
#define Re register
#define ri Re signed
#define p(i) ++i
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++
struct nanfeng_stream{
template<typename T>inline nanfeng_stream &operator>>(T &x) {
Re bool f=0;x=0;Re char ch=gc();
while(!isdigit(ch)) f|=ch=='-',ch=gc();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=gc();
return x=f?-x:x,*this;
}
}cin;
}
using IO::cin;
namespace nanfeng{
#define node(x,y) (node){x,y}
#define pb emplace_back
#define fi first
#define se second
#define mk std::make_pair
#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=1e5+7;
int first[N],dp[N][4][4],W[N][4],nm[N],tmp[4],G[N],siz[N],ans[N<<2],vis[N],dep,rt,pos,q,cnt,t=1,n,m;
struct node{int v,i;}ask;
std::vector<node> vc[N];
struct edge{int v,nxt,w[4],nm;}e[N<<1];
std::map<std::pair<int,int>,std::set<int> > mp;
inline void add(int u,int v,int *w,int nm) {
e[t].v=v,e[t].nm=nm;
for (ri i(1);i<=nm;p(i)) e[t].w[i]=w[i];
e[t].nxt=first[u],first[u]=t++;
e[t].v=u,e[t].nm=nm;
for (ri i(1);i<=nm;p(i)) e[t].w[i]=w[i];
e[t].nxt=first[v],first[v]=t++;
}
void dfs_find(int S,int x,int fa) {
siz[x]=1;
int GS=0;
for (ri i(first[x]),v;i;i=e[i].nxt) {
if ((v=e[i].v)==fa||G[v]) continue;
dfs_find(S,v,x);
siz[x]+=siz[v];
GS=cmax(GS,siz[v]);
}
GS=cmax(GS,S-siz[x]);
if (GS<cnt) cnt=GS,pos=x;
}
void dfs_solve(int x,int fa) {
siz[x]=1;
for (ri i(first[x]),v;i;i=e[i].nxt) {
if ((v=e[i].v)==fa||G[v]) continue;
for (ri j(1);j<=e[i].nm;p(j)) W[v][j]=e[i].w[j];
nm[v]=e[i].nm;
for (ri l(1);l<=nm[rt];p(l))
for (ri j(1);j<=nm[v];p(j))
for (ri k(1);k<=nm[x];p(k))
if (W[x][k]==W[v][j]) dp[v][l][j]=cmax(dp[v][l][j],dp[x][l][k]);
else dp[v][l][j]=cmax(dp[v][l][j],dp[x][l][k]+1);
dfs_solve(v,x);
siz[x]+=siz[v];
}
}
void dfs_query(int x,int fa) {
for (auto nx:vc[x]) {
if (!vis[nx.v]&&nx.v!=pos) continue;
if (nx.v==pos) {
for (ri i(1);i<=nm[rt];p(i))
for (ri j(1);j<=nm[x];p(j))
ans[nx.i]=cmax(ans[nx.i],dp[x][i][j]);
} else {
for (ri i(1);i<=nm[rt];p(i))
for (ri j(1);j<=nm[vis[nx.v]];p(j))
for (ri k(1);k<=nm[x];p(k))
for (ri l(1);l<=nm[nx.v];p(l)) {
if (W[vis[nx.v]][j]==W[rt][i]) ans[nx.i]=cmax(ans[nx.i],dp[x][i][k]+dp[nx.v][j][l]-1);
else ans[nx.i]=cmax(ans[nx.i],dp[x][i][k]+dp[nx.v][j][l]);
}
}
}
for (ri i(first[x]),v;i;i=e[i].nxt) {
if ((v=e[i].v)==fa||G[v]) continue;
dfs_query(v,x);
}
}
void dfs_mark(int x,int fa) {
vis[x]=rt;
for (ri i(first[x]),v;i;i=e[i].nxt) {
if ((v=e[i].v)==fa||G[v]) continue;
dfs_mark(v,x);
}
}
void dfs_init(int x,int fa) {
vis[x]=0;
memset(dp[x],0,sizeof(dp[x]));
for (ri i(first[x]),v;i;i=e[i].nxt) {
if (G[v=e[i].v]||v==fa) continue;
dfs_init(v,x);
}
}
void solve(int S,int x) {
dfs_find(cnt=S,x,0);
dfs_init(pos,0);
int np;
G[np=pos]=1;
for (ri i(first[np]),v;i;i=e[i].nxt) {
if (G[v=e[i].v]) continue;
for (ri j(1);j<=e[i].nm;p(j)) dp[v][j][j]=1,W[v][j]=e[i].w[j];
nm[v]=e[i].nm;
dfs_solve(rt=v,np);
dfs_query(v,np);
dfs_mark(v,np);
}
dfs_init(pos,0);
for (ri i(first[np]),v;i;i=e[i].nxt) {
if (G[v=e[i].v]) continue;
solve(siz[v],v);
}
}
inline int main() {
//FI=freopen("nanfeng.in","r",stdin);
//FO=freopen("nanfeng.out","w",stdout);
cin >> n >> m;
for (ri i(1),u,v,w;i<=m;p(i)) {
cin >> u >> v >> w;
if (u>v) std::swap(u,v);
mp[mk(u,v)].insert(w);
}
for (auto x:mp) {
ri ct=0;
Re std::pair<int,int> tp=x.fi;
Re std::set<int> tps=x.se;
if (tps.size()>3) for (auto w:tps) {tmp[++ct]=w;if (ct==3) break;}
else for (auto w:tps) tmp[++ct]=w;
add(tp.fi,tp.se,tmp,ct);
}
cin >> q;
for (ri i(1),u,v;i<=q;p(i)) cin >> u >> v,vc[u].pb(node(v,i)),vc[v].pb(node(u,i));
solve(n,1);
for (ri i(1);i<=q;p(i)) printf("%d\n",ans[i]);
return 0;
}
}
int main() {return nanfeng::main();}
NOIP 模拟 $38\; \rm c$的更多相关文章
- NOIP 模拟 $38\; \rm b$
题解 \(by\;zj\varphi\) 考虑转化问题,将计算最大公约数换为枚举最大公约数. 设 \(sum_i\) 为最大公约数为 \(i\) 的方案数,可以容斥求解,\(sum_i=f_i-\su ...
- NOIP 模拟 $38\; \rm a$
题解 \(by\;zj\varphi\) 压行. 枚举两行,将中间的行压成一行,然后直接前缀和加二分. 注意边界细节问题. Code #include<bits/stdc++.h> #de ...
- 2021.5.22 noip模拟1
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...
- NOIP模拟3
期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...
- 7.22 NOIP模拟7
又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
- 20190725 NOIP模拟8
今天起来就是虚的一批,然后7.15开始考试,整个前半个小时异常的困,然后一看题,T1一眼就看出了是KMP,但是完了,自己KMP的打法忘的一干二净,然后开始打T2,T2肝了一个tarjan点双就扔上去了 ...
- 20190902+0903合集-NOIP模拟
一直没时间写QwQ 于是补一下. Day 1 晚饭吃的有点恶心…… $1s\,2s\,5s$ 还开 -O2 ?? 有点恐怖. T1 猛的一想: 把外面设成一个点, 向入口连一条权为排队时间的边 从出口 ...
- 5.23考试总结(NOIP模拟2)
5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...
随机推荐
- 全网唯一开源java开发的支持高扩展,高性能的Mqtt集群broker!
SMQTT是一款开源的MQTT消息代理Broker, SMQTT基于Netty开发,底层采用Reactor3反应堆模型,支持单机部署,支持容器化部署,具备低延迟,高吞吐量,支持百万TCP连接,同时支持 ...
- [源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练发现节点 & State
[源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练发现节点 & State 目录 [源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练 ...
- ROS2学习之旅(21)——创建一个动作服务和客户节点(C++)
动作是ROS中的一种异步通信形式,动作客户端向动作服务器发送目标请求,目标服务器向操作客户端发送目标反馈和结果.本文基于前一篇自定义动作博文. 1.创建一个action_turtorials_cpp包 ...
- java二叉树的遍历(1)
树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合 节点:上图的圆圈,比如A,B,C等都是表示 ...
- Python单元测试框架unittest之单用例管理(二)
概述 利用python进行测试时,测试用例的加载方式有2种: 一种是通过unittest.main()来启动所需测试的测试模块,上篇文章就是使用的这种方式: 一种是添加到testsuite集合中再加载 ...
- 没事就要多做多练,Shell脚本循环例题做一做
Shell脚本循环例题 一.示例1 二.示例2 三.示例3 四.示例4 ...
- IDEA 生成类注释和方法注释
目录 一.生成类注释-01 1.1.生成类注解模板 1.2.把模板设置到IDEA中 1.3.效果图 二.生成类注释-02 2.1.生成类注释模板 2.2.把模板设置到IDEA中 2.3.效果图 2.4 ...
- 【转载】Java学习笔记
转载:博主主页 博主的其他笔记汇总 : 学习数据结构与算法,学习笔记会持续更新: <恋上数据结构与算法> 学习Java虚拟机,学习笔记会持续更新: <Java虚拟机> 学习Ja ...
- xampp的Apache服务无法启动 Apache的443端口被占用解决方法
今天在使用本地的XAMPP的时候,发现Apache服务不能正常启动,根据以往的经验,可能是80端口或者443端口被占用导致的,所以对端口占用情况进行排查. 1. 执行xampp/apache/bin中 ...
- 在Vue中echarts可视化组件的使用
echarts组件官网地址:https://echarts.apache.org/examples/zh/index.html 1.找到脚手架项目所在地址,执行cnpm install echarts ...