题意 是 有n个花园 一个花园内所有的花的颜色都是一样的 有很多种不同的颜色  花园到花园之间有路,走不同的路有不同的代价
   如果选一个点作为起点 只走小于等于w的路  可以经过的这些花园里  那种颜色最多  多组询问 强制在线
   
解法   对于这个影响这个答案有两个因素 不可以把所有答案求出  一个一个求的话复杂度太高  因为强制在线所以我们需要先预处理一部分数据 然后根据预处理的数据 再进行求解 答案, 对于这个题面 很明显可以想到 先把边权最小的连起来 然后是次最大 然后再大点  依次
明显就是一个 求最小生成树的过程  每次链接一条边的时候 我们都可以 从当前局面 计算出一个答案 明确可以知道 存在一组询问的答案都是这个  用并差集维护 集合   当我们把两个集合 连接起来的时候 就把这两个 集合 链接到一个 点上  用这个点来代码 这个两个集合合并后的状态 一共有n个点 所以我们需要建立n-1个点   按照最小生成树建树的顺序 可以获得一个二叉树  对于这个二叉树 每一个节点都可以求一个答案  这些答案 可以回答所有询问,   这些节点一共是 2n-1个(前n个几乎不用考虑 就是本身)  我们只需要先把这n-1个结点的答案预处理出来就可以了  对于之后的询问 我们就可以使用 倍增 直接找到 从x点最高可以到的位置 从而得出答案   
对于那n-1的节点的答案维护 要使用线段树合并(合并树 最初的线段树要使用动态开点线段树 动态开点的话也就是一共树就是一条链 log2e5 不会超过20个  n个线段树的话直接开个n*20的内存就可以了)

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 2e5+;
int color[maxn],f[maxn];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
void init(int N){for(int i=;i<=N;i++)f[i]=i;}
struct edge{int x,y,l;}E[maxn];
bool com(edge a,edge b){return a.l<b.l;}
struct Node{int l,r,mx;}node[maxn*];
int N,M,tot,root[maxn];
void pushup(int rt){node[rt].mx=max(node[node[rt].l].mx,node[node[rt].r].mx);}
void bulit(int l,int r,int &rt,int pos)
{
node[++tot]=(Node){,,};rt=tot;
if(l==r){node[rt].mx=;return;}
int m=(l+r)>>;
if(pos<=m)bulit(l,m,node[rt].l,pos);
else bulit(m+,r,node[rt].r,pos);
pushup(rt);
}
void merge(int l,int r,int&x,int y)
{
if(!x||!y){ x= x+y;return ;}
if(l==r)node[x].mx+=node[y].mx;
else{
int m=(l+r)>>;
merge(l,m,node[x].l,node[y].l);
merge(m+,r,node[x].r,node[y].r);
pushup(x);
}
}
int ans[maxn],limt[maxn];
int getans(int l,int r,int x){
if(l==r)return l;
int m=(l+r)>>;
if(node[x].mx==node[node[x].l].mx)return getans(l,m,node[x].l);
return getans(m+,r,node[x].r);
}
int p[maxn][];
int main()
{
int T,cases=,Q;
scanf("%d",&T);
while(T--)
{
memset(p,,sizeof(p));
scanf("%d%d",&N,&M);
for(int i=;i<=N;i++)scanf("%d",color+i);
for(int i=;i<M;i++)scanf("%d%d%d",&E[i].x,&E[i].y,&E[i].l);
sort(E,E+M,com);
init(N*+);tot=;int cnt=N;
for(int i=;i<=N;i++)bulit(,N,root[i],color[i]),ans[i]=color[i];
for(int i=;i<M;i++)
{
int x=find(E[i].x),y=find(E[i].y);
if(x==y)continue;
merge(,N,root[x],root[y]);
root[++cnt]=root[x];
ans[cnt]=getans(,N,root[x]);
limt[cnt]=E[i].l;
p[x][]=p[y][]=cnt;
f[y]=f[x]=cnt;
}
for(int i=;i<;i++)
for(int j=;j<=cnt;j++)
p[j][i]=p[p[j][i-]][i-];
scanf("%d",&Q);
printf("Case #%d:\n",++cases);
int x,w,last=;
while(Q--){
scanf("%d%d",&x,&w);
x^=last;w^=last;
for(int i=;i>=;i--)if(limt[p[x][i]]<=w&&p[x][i])x=p[x][i];
printf("%d\n",last=ans[x]);
}
}
return ;
}

Pandaria(Kruskal重构树+线段树合并)的更多相关文章

  1. isaster(Comet OJ - Contest #11D题+kruskal重构树+线段树+倍增)

    目录 题目链接 思路 代码 题目链接 传送门 思路 \(kruskal\)重构树\(+\)线段树\(+\)倍增 代码 #include <set> #include <map> ...

  2. luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)

    题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...

  3. [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)

    题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...

  4. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

  5. CF1131F Asya And Kittens(Kruskal重构树,启发式合并)

    这题难度1700,我感觉又小了…… 这题虽然没几个人是用kruskal重构树的思想做的,但是我是,所以我就放了个kruskal重构树的标签. 题目链接:CF原网 题目大意:有一个长为 $n$ 的排列, ...

  6. 【BZOJ3545】Peaks(Kruskal重构树 主席树)

    题目链接 大意 给出有\(N\)个点\(M\)条边的一张图,其中每个点都有一个High值,每条边都有一个Hard值. 再给出\(Q\)个询问:\(v\) \(x\) \(k\) 每次询问查询从点\(v ...

  7. UOJ#407. 【IOI2018】狼人 Kruskal,kruskal重构树,主席树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ407.html 题解 套路啊. 先按照两个节点顺序各搞一个kruskal重构树,然后问题转化成两棵krus ...

  8. LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)

    LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...

  9. BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增

    题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...

随机推荐

  1. Java内部类成员

    内部类可以访问其所有实例成员,实例字段和其封闭类的实例方法.参考如下实例 - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 ...

  2. zoom:1总结

    zoom:1确实帮我们解决了不少ie下的bug,但是它的来龙去脉,又有多少人知道呢? 所以我老生常谈,说一下它的来龙去脉. Zoom属性是IE浏览器的专有属性, 它可以设置或检索对象的缩放比例.先来一 ...

  3. FZU 2079 最大获利(线段树+DP)

    Description Sean准备投资一些项目.有n个投资项目,投资第i个项目需要花费Ci元.Sean发现如果投资了某些编号连续的项目就能赚得一定的钱.现在给出m组连续的项目和每组能赚得的钱,请问采 ...

  4. 《代码大全2》读书笔记 week 7

    博主终于继续更<代码大全2>了 (*´・ω・`)⊃,课上老师一再强调读书笔记要写出自己的心得不能简单摘抄,所以我现在基本上只会写一下自己在阅读过程中印象深刻或者有发散思考的地方,字数可能 ...

  5. 在Feign中添加自定义配置

    首先先创建一个FeignConfig类,代码如下: package com.xing.config; import org.springframework.context.annotation.Bea ...

  6. Galaxy

    Galaxy 在一维坐标轴上给出n个点,第i个点坐标为\(x_i\),现在你可以任意移动k个点的,最小化它们的方差,\(n\leq 50000\). 解 感觉以前写的太乱了,补一篇可以供快速阅读的题解 ...

  7. jstl jsp long to date

    jsp 页面中使用jstl el 将long转换为时间类型,并格式化输出 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" ...

  8. 电子商务B2B的发展趋势

    B2B的发展趋势 尽管B2B市场发展势头良好,但B2B市场还是存在发育不成熟的一面.这种不成熟表现在B2B交易的许多先天性交易优势,比如在线价格协商和在线协作等还没有充分发挥出来. 报告指出,到200 ...

  9. 利用SparkSQL(java版)将离线数据或实时流数据写入hive的用法及坑点

    1. 通常利用SparkSQL将离线或实时流数据的SparkRDD数据写入Hive,一般有两种方法.第一种是利用org.apache.spark.sql.types.StructType和org.ap ...

  10. cmake build

    { //cmake CMakeLists.txt -G "Visual Studio 15 2017" }