当前位置: 首页 > news >正文

洛谷P5838 [USACO19DEC] Milk Visits G

洛谷P5838 [USACO19DEC] Milk Visits G

洛谷题目传送门

题目描述

Farmer John 计划建造 NNN 个农场,用 N−1N-1N1 条道路连接,构成一棵树(也就是说,所有农场之间都互相可以到达,并且没有环)。每个农场有一头奶牛,品种为 111NNN 之间的一个整数 TiT_iTi

Farmer John 的 MMM 个朋友经常前来拜访他。在朋友 iii 拜访之时,Farmer John 会与他的朋友沿着从农场 AiA_iAi 到农场 BiB_iBi 之间的唯一路径行走(可能有 Ai=BiA_i = B_iAi=Bi)。除此之外,他们还可以品尝他们经过的路径上任意一头奶牛的牛奶。由于 Farmer John 的朋友们大多数也是农场主,他们对牛奶有着极强的偏好。他的每个朋友都只喝某种特定品种的奶牛的牛奶。任何 Farmer John 的朋友只有在他们访问时能喝到他们偏好的牛奶才会高兴。

请求出每个朋友在拜访过后是否会高兴。

输入格式

输入的第一行包含两个整数 NNNMMM

第二行包含 NNN 个空格分隔的整数 T1,T2,…,TNT_1,T_2,\ldots, T_NT1,T2,,TN。第 iii 个农场内的奶牛的品种用 TiT_iTi 表示。

以下 N−1N-1N1 行,每行包含两个不同的整数 XXXYYY1≤X,Y≤N1 \leq X, Y \leq N1X,YN),表示农场 XXXYYY 之间有一条边。

以下 MMM 行,每行包含整数 AiA_iAiBiB_iBi,以及CiC_iCiAiA_iAiBiB_iBi 表示朋友 iii 拜访时行走的路径的端点,CiC_iCi1≤Ci≤N1\le C_i\le N1CiN)表示这个朋友喜欢的牛奶的奶牛品种。

输出格式

输出一个长为 MMM 的二进制字符串。如果第 iii 个朋友会感到高兴,则字符串的第 iii 个字符为 1,否则为 0

输入输出样例 #1

输入 #1

5 5
1 1 2 1 2
1 2
2 3
2 4
1 5
1 4 1
1 4 2
1 3 2
1 3 1
5 5 1

输出 #1

10110

输入输出样例 #2

输入 #2

6 4
1 2 3 3 3 3
1 2
2 3
3 4
2 5
5 6
4 6 1
4 6 2
4 6 3
4 6 4

输出 #2

0110

说明/提示

测试点性质:

测试点 222 为以下第二个样例。

测试点 333 满足 N≤103N\le 10^3N103M≤2⋅103M\le 2\cdot 10^3M2103

测试点 4∼74\sim 747 满足 Ci≤10C_i\le 10Ci10

对于 100%100\%100% 的数据,1≤N≤1051 \leq N \leq 10^51N1051≤M≤1051 \leq M \leq 10^51M105

供题:Spencer Compton

思路详解

确定算法

首先,一眼看到NNN个点与N−1N-1N1条边,很明显是树链剖分
考虑如何求(u,v)(u,v)(u,v)的链上有无我们想要的颜色???
先想我们如果只有一个颜色,我们应如何判断一条链上有没有。显然,在不需要修改的情况下,我们只需要使用一个前缀和数组维护即可。
我们现在有多个颜色,那考虑对每个颜色开一个数组,可是我们发现若每个数组都开10510^{5}105的话,那我们的空间肯定会爆炸,那我们考虑使用动态数组,将每个节点uuudfsdfsdfsiduid_{u}idu压入对应颜色的动态数组即可。不过动态数组查询过于复杂,居然需要用到lower_bound这种高科技(doge),所以我直接选用万能的FHQTreapFHQ TreapFHQTreap

具体实现

  1. 对于FHQTreapFHQ TreapFHQTreap:我们只需要维护一个有序序列,用于保存对应颜色节点的dfsdfsdfs序即可,还需要完成求在值域[l,r][l,r][l,r]内的数有几个。
  2. 对于树剖:没什么好说的,就是普通的树剖模板,查询就是查询在[u,v][u,v][u,v]的链上有多少个要求颜色的个数即可。

code

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct lit{int val,siz,pri;lit *l,*r;lit(int v){val=v;siz=1;pri=rand();l=r=nullptr;}
};
class FHQ{
private:lit *root;int getsize(lit *u){return u?u->siz:0;}void pushup(lit *&u){if(!u)return ;u->siz=1+getsize(u->l)+getsize(u->r);}void split(lit *u,int v,lit *&x,lit *&y){if(!u){x=y=nullptr;return ;}if(u->val<=v){x=u;split(u->r,v,x->r,y);pushup(x);}else{y=u;split(u->l,v,x,y->l);pushup(y);}}lit *merge(lit *x,lit *y){if(!x)return y;if(!y)return x;if(x->pri>y->pri){x->r=merge(x->r,y);pushup(x);return x;}else{y->l=merge(x,y->l);pushup(y);return y;}}void _print(lit *u){if(!u)return ;_print(u->l);cout<<u->val<<' ';_print(u->r);}
public:void print(){_print(root);cout<<'\n';}void insert(int v){lit *l,*r;split(root,v,l,r);root=merge(merge(l,new lit(v)),r);}int query_num(int x,int y){lit *l,*mid,*r;split(root,y,mid,r);split(mid,x-1,l,mid);int res=getsize(mid);root=merge(merge(l,mid),r);return res;}
}tr[N];//普通的FHQ Treap
vector<int>e[N];
int fa[N],siz[N],son[N],dep[N];
int id[N],reid[N],top[N],tim=0;
int co[N];
int n,m;
class HCD{//重链剖分
private:void dfs1(int u,int fath,int dp){dep[u]=dp;fa[u]=fath;siz[u]=1;for(int v:e[u]){if(v==fath)continue;dfs1(v,u,dp+1);siz[u]+=siz[v];if(siz[v]>siz[son[u]])son[u]=v;}}void dfs2(int u,int fath,int ori){id[u]=++tim;reid[tim]=u;top[u]=ori;if(son[u])dfs2(son[u],u,ori);for(int v:e[u]){if(v==fath||v==son[u])continue;dfs2(v,u,v);}}
public:void build(int rt){dfs1(rt,0,1);dfs2(rt,0,rt);for(int i=1;i<=n;i++){tr[co[i]].insert(id[i]);}}int find(int u,int v,int c){//查找路径(u,v)上是否有颜色c的节点int res=0;while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]])swap(u,v);res+=tr[c].query_num(id[top[u]],id[u]);u=fa[top[u]];}if(id[u]>id[v])swap(u,v);res+=tr[c].query_num(id[u],id[v]);return res>=1;}
}tre;
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++)cin>>co[i];for(int i=1;i<=n-1;i++){int x,y;cin>>x>>y;e[x].push_back(y);e[y].push_back(x);}tre.build(1);//记得建树!!!for(int i=1;i<=m;i++){int x,y,z;cin>>x>>y>>z;cout<<tre.find(x,y,z);}return 0;
}
http://www.dtcms.com/a/475303.html

相关文章:

  • 南京做网站优化的企业做宣传册的公司
  • 消失模铸造数字化转型-数字化智能制造平台在消失模铸造全过程可追溯的深化案例
  • 淄博学校网站建设方案wordpress子主题安全
  • 网站开发的技术难点专业网站建设常州
  • 网站投票页面怎么做低价网站建设推广优化
  • 宁波网站推广宣传wordpress会员导出
  • 湖南网站推广优化电子商务网站建设运营
  • 城乡建设杂志官方网站seo网站推广优化
  • 兼职做网站挣钱么网站的做用
  • 管理软件开发公司网站内容优化的重要性
  • 对网站策划的看法推动高质量发展发言材料
  • Ubuntu CUDA Toolkit安装失败
  • 取消网站备案号个人网页制作设计模板
  • 宣城市网站建设wordpress支持MySQL5.5
  • 高校后勤网站建设龙口建网站
  • 审计实务网站建设论文简述网站推广的方法
  • 国通快速免费建站国外做宠物产品的网站
  • 成都广告公司网站建设2008 做网站
  • 计算机毕业设计选题推荐:基于SpringBoot和Vue的快递物流仓库管理系统【源码+文档+调试】
  • 郑州哪里有做网站成都哪里做网站备案
  • API开发接入实战避坑指南与经验总结淘宝商品详情API
  • 公司内部网站怎么建设更改网站文章上传时间
  • MySQL 数据库基础:从概念到实战全解析
  • 翻转后1的数量(dp)
  • 【PYTHON学习】推断聚类后簇的类型DAY18
  • 如何做网站的线下推广织梦wordpress百度小程序
  • 【Unity每日一记】Unity三维数学进阶:齐次坐标、万向节锁与四元数详解
  • 桂林北站怎么去阳朔上传网站代码
  • 【完整源码+数据集+部署教程】稻米害虫种类识别检测系统源码和数据集:改进yolo11-AKConv
  • 电商网站建设公司怎么样wordpress排版界面