题目戳我

\(\text{Solution:}\)

这题不要把思想局限到线段树上……这题大意就是求路径经过的值中\(x\)的出现性问题。

最开始的想法是值域线段树……看了题解发现直接\(vector\)加二分即可\(O(n\log^2 n)\)解决。

思路:

用\(vector\)存下颜色\(i\)所出现的所有节点,对每一个\(vector\)排序后,考虑跳链的过程中二分第一个大于链头\(dfs\)序的点并判断它是不是在当前查询区间的范围内。最终复杂度是跳链的\(log\)和二分的\(\log.\)

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10;
int top[MAXN],id[MAXN],rk[MAXN],son[MAXN],siz[MAXN],pa[MAXN];
int head[MAXN],tot,cnt,rt,n,m,dep[MAXN],ls[MAXN],rs[MAXN],val[MAXN];
struct E{int nxt,to;}e[MAXN];
vector<int>v[MAXN];
inline void add(int x,int y){e[++tot]=(E){head[x],y};head[x]=tot;}
void dfs1(int x,int fa){
pa[x]=fa,siz[x]=1,dep[x]=dep[fa]+1;
for(int i=head[x];i;i=e[i].nxt){
int j=e[i].to;
if(j==fa)continue;
dfs1(j,x);siz[x]+=siz[j];
if(siz[j]>siz[son[x]])son[x]=j;
}
}
void dfs2(int x,int t){
top[x]=t,rk[id[x]=++cnt]=x;
if(!son[x])return;
dfs2(son[x],t);
for(int i=head[x];i;i=e[i].nxt){
int j=e[i].to;
if(j!=pa[x]&&j!=son[x])dfs2(j,j);
}
}
void dfs3(int x){
v[val[x]].push_back(id[x]);
for(int i=head[x];i;i=e[i].nxt){
int j=e[i].to;
if(j==pa[x])continue;
dfs3(j);
}
}
void solve(int x,int y,int c){
int fg=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
vector<int>::iterator it=lower_bound(v[c].begin(),v[c].end(),id[top[x]]);
if(it!=v[c].end()&&*it<=id[x])fg=1;
x=pa[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
vector<int>::iterator it=lower_bound(v[c].begin(),v[c].end(),id[y]);
if(it!=v[c].end()&&*it<=id[x])fg=1;
printf("%d",fg);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)scanf("%d",&val[i]);
for(int i=1;i<n;++i){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs1(1,0);dfs2(1,1);dfs3(1);
for(int i=1;i<=n;++i)sort(v[i].begin(),v[i].end());
for(int i=1;i<=m;++i){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
solve(x,y,z);
}
return 0;
}

【题解】[USACO19DEC]Milk Visits G的更多相关文章

  1. P5838 [USACO19DEC]Milk Visits G

    发现是一道比较裸的树上莫队,于是就开始刚,然后发现好像是最难的一道题--(本题解用于作者加深算法理解,也欢迎各位的阅读) 题意 给你一棵树,树有点权,询问一条路径上是否有点权为 \(c\) 的点. 题 ...

  2. P5836 [USACO19DEC]Milk Visits S 从并查集到LCA(最近公共祖先) Tarjan算法 (初级)

    为什么以它为例,因为这个最水,LCA唯一黄题. 首先做两道并查集的练习(估计已经忘光了).简单来说并查集就是认爸爸找爸爸的算法.先根据线索理认爸爸,然后查询阶段如果发现他们的爸爸相同,那就是联通一家的 ...

  3. 洛谷 P5837 [USACO19DEC]Milk Pumping G (单源最短路,dijkstra)

    题意:有一\(n\)个点,\(m\)条边的双向图,每条边都有花费和流量,求从\(1\)~\(n\)的路径中,求\(max\frac{min(f)}{\sum c}\). 题解:对于c,一定是单源最短路 ...

  4. P5837 [USACO19DEC]Milk Pumping G

    题目描述 Farmer John 最近为了扩张他的牛奶产业帝国而收购了一个新的农场.这一新的农场通过一个管道网络与附近的小镇相连,FJ 想要找出其中最合适的一组管道,将其购买并用来将牛奶从农场输送到小 ...

  5. Milk Pumping G&Milk Routing S 题解

    Milk Pumping G&Milk Routing S 双倍经验时间 洛谷P5837 [USACO19DEC]Milk Pumping G 洛谷P3063 [USACO12DEC]Milk ...

  6. 题解 P5837 【[USACO19DEC]Milk Pumping】

    这题其实想法挺简单的,因为他只需要简单的把每个点的花费和流量用dp记下来就好了 1.怎么记: 首先考虑dp的状态.由于所在的点和流量都要记,所以dp开二维,一维记所在的点,另一维记去哪 //dp[i] ...

  7. ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)

     目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...

  8. 【题解】[USACO07OPEN]Dining G

    \(Link\) \(\text{Solution:}\) 这一题,我们要做到,食物和牛.牛和饮料均为一对一的关系.我们发现这个图不好建立. 经典技巧:将牛拆边,拆成入点和出点,并连容量为\(1\)的 ...

  9. 【题解】[USACO07NOV]Sunscreen G

    \(Link\) \(\text{Solution:}\) 把奶牛的忍耐度转化为线段,则题目转化为选择一些点使得覆盖的线段尽可能多.一个点只能覆盖一条线段. 考虑将点按照位置排序,线段按照右端点排序. ...

随机推荐

  1. 自定义吐司以及Toast的各种用法,详解。教你学会使用各种各样的Toast

    package com.david_Custoast; import com.david_Custoast.R; import android.app.Activity; import android ...

  2. JetBrain破解

    https://blog.csdn.net/u014044812/article/details/78727496 https://jetlicense.nss.im/ https://zhile.i ...

  3. 牛客多校训练AFJ(签到)

    题目链接https://ac.nowcoder.com/acm/contest/881/A(单调栈) #include<cstdio> #include<iostream> # ...

  4. Linux服务器被入侵后的处理过程

    突然,频繁收到一组服务器 ping 监控不可达邮件,赶紧登陆 zabbix 监控系统查看流量状况. 可见流量已经达到了 800M 左右,这肯定不正常了,马上尝试 SSH 登陆系统,不幸的事,由于网络堵 ...

  5. Activiti7 网关(排他网关)

    什么是排他网关? 排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用于在流程中实现决策,当流程执行到这个网关,所有分支都会判断条件是否为true,如果为true则执行该分支 注意:排他网关 ...

  6. IDEA Activiti 画图中文乱码

    画流程图时,如果节点的name填写的是中文,再次打开流程图时中文会显示乱码,如下图: 修改idea64.exe.vmoptions文件,在文件中加上如下代码: -Dfile.encoding=utf- ...

  7. Zookeeper启动流程分析

    前言 之前的Zookeeper协议篇-Paxos算法与ZAB协议通过了解Paoxs算法开始,到Zab协议的两大特性:崩溃恢复和消息广播,学习了Zookeeper是如何通过Zab协议实现高可用,本篇主要 ...

  8. leetcode刷题-54螺旋矩阵

    题目 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 思路 对于每个外层,从左上方开始以顺时针的顺序遍历所有元素.假设当前层的左上角位于(to ...

  9. ES6语法笔记

    迭代器 // log let arr = ['一', '二', '三'] let iter = arr[Symbol.iterator]() console.log(iter.next()) cons ...

  10. C#开发PACS医学影像处理系统(六):加载Dicom影像

    对于一款软件的扩展性和维护性来说,上层业务逻辑和UI表现一定要自己开发才有控制权,否则项目上线之后容易被掣肘, 而底层图像处理,我们不需要重复造轮子,这里推荐使用fo-dicom,同样基于Dicom3 ...