正题

题目链接:https://www.luogu.org/problemnew/show/P4556


题目大意

nnn个点的一棵树,给出mmm个操作(x,y,z)(x,y,z)(x,y,z)表示将xxx到yyy的路径上的所有点给与一个zzz类型的食量。

最后对于每个点输出最多的粮食类型。


解题思路

先对这棵树进行树剖,然后对于每个x,yx,yx,y我们将其拆成若干条在重链上连续的路径,然后我们就可以对于每一条重链单独进行操作,这样就成为了一个序列问题。

将zzz离散化以后再线段树上进行操作,维护一个(w,loc)(w,loc)(w,loc)表示最多的粮食数,这个粮食的类型。然后每次遇到一个左端点就在zzz处+1+1+1,遇到右端点就在zzz处−1-1−1。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=110000;
struct Edge_node{int to,next;
}a[N<<1];
struct Path_node{int w,z;
}q[N*30];
struct Tree_node{int l,r,w,loc;
};
int n,m,cnt,tot,ls[N],fa[N],from[N],ans[N];
int b[N],seg[N],id[N],siz[N],son[N],dep[N],top[N];
struct Seg_Tree{Tree_node t[N<<2]; void Merge(int x,int ls,int rs){t[x].w=max(t[ls].w,t[rs].w);if(t[x].w==t[ls].w) t[x].loc=t[ls].loc;else t[x].loc=t[rs].loc;}void Build(int x,int l,int r){t[x].l=l;t[x].r=r;if(l==r){t[x].w=0;t[x].loc=0;return;}int mid=(l+r)/2;Build(x*2,l,mid);Build(x*2+1,mid+1,r);Merge(x,x*2,x*2+1);}void Change(int x,int pos,int w){if(t[x].l==t[x].r){t[x].w+=w;t[x].loc=pos;if(!t[x].w) t[x].loc=0;return;}if(pos<=t[x*2].r) Change(x*2,pos,w);else Change(x*2+1,pos,w);Merge(x,x*2,x*2+1);}int Query(){return t[1].loc;}
}Tree;
void addl(int x,int y)
{a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void dfs1(int x)
{siz[x]=1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa[x]) continue;dep[y]=dep[x]+1;fa[y]=x;dfs1(y);siz[x]+=siz[y];if(siz[y]>siz[son[x]]) son[x]=y;}
}
void dfs2(int x)
{seg[x]=++cnt;id[cnt]=x;from[cnt]=top[x];if(son[x]){top[son[x]]=top[x];dfs2(son[x]);}for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa[x]||y==son[x]) continue;top[y]=y;dfs2(y);}
}
void Apart_path(int x,int y,int z)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);q[++cnt]=(Path_node){seg[top[x]],z};q[++cnt]=(Path_node){seg[x]+1,-z};x=fa[top[x]];}if(dep[x]>dep[y]) swap(x,y);q[++cnt]=(Path_node){seg[x],z};q[++cnt]=(Path_node){seg[y]+1,-z};
}
bool cmp(Path_node x,Path_node y)
{return x.w<y.w;}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}dfs1(1);dfs2(1);cnt=0;for(int i=1;i<=m;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);Apart_path(x,y,w);b[i]=w;}sort(b+1,b+1+m);m=unique(b+1,b+1+m)-b-1;sort(q+1,q+1+cnt,cmp);int l=1;Tree.Build(1,1,max(m,1));for(int i=1;i<=n;i++){while(q[l].w<=i&&l<=cnt){int w=lower_bound(b+1,b+1+m,abs(q[l].z))-b;Tree.Change(1,w,(q[l].z<0)?-1:1);l++;}ans[id[i]]=b[Tree.Query()];}for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
}

P4556,jzoj3397-[GDOI2014模拟]雨天的尾巴【树链剖分,线段树】相关推荐

  1. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1153  Solved: 421 [Submit][Sta ...

  2. BZOJ3862Little Devil I——树链剖分+线段树

    题目大意: 给一棵树,每条边可能是黑色或白色(起始都是白色),有三种操作: 1.将u到v路径上所有边颜色翻转(黑->白,白->黑) 2.将只有一个点在u到v路径上的边颜色翻转 3.查询u到 ...

  3. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...

  4. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  5. P2486 [SDOI2011]染色(树链剖分+线段树)

    题干描述 输入描述 输出格式 对于每个询问操作,输出一行答案. 输入输出样例 输入 #1 复制 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C 2 1 1 Q ...

  6. BZOJ4127Abs——树链剖分+线段树

    题目描述 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 输入 第一行两个整数n和m,表示结点个数和操作数 ...

  7. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  8. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  9. BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树

    题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...

  10. YbtOJ-染色计划【树链剖分,线段树,tarjan】

    正题 题目大意 给出nnn个点的一棵树,每个点有个颜色aia_iai​,你每次可以选择一个颜色全部变成另一个颜色. 求最少多少次操作可以把一种颜色变成一个完整的连通块. 1≤k≤n≤2×1051\le ...

最新文章

  1. TypeError(“cannot concatenate ‘str‘ and ‘instancemethod‘ objects“,)
  2. 大型网站架构系列:分布式消息队列
  3. Python - - 项目实战 -- pygame 快速入门
  4. Angel Borja博士教你如何撰写科学论文一:Six things to do before writing your manuscript
  5. centos7 LNMP
  6. ImageView一例
  7. 苏宁易购发全员信:双十一销售目标全面完成 力争11月EBITDA转正
  8. 【MySQL】mysql The server time zone value “乱码” 错误
  9. 电子邮件传输算法-Base64
  10. android获取根视图
  11. Modelsim下载、注册与添加仿真库(LATTICE DIAMOND)
  12. 农业信息技术基础知识(1)
  13. 【Java】NIO 仿照zookeeper 写的 nio客户端
  14. docker网络端口映射
  15. 畅享9能改鸿蒙,华为畅享9 root教程_畅享9卡刷root包来获取root权限的方法
  16. Termux搭建图形化环境及tk开发
  17. Icon图标 [Java]
  18. FFmpeg入门详解之43:FFmpeg解封装的原理与实战
  19. epson连接计算机后无法打印,epson打印机无法打印,教您epson打印机无法打印怎么解决...
  20. 什么是聚合路由器?主要运用在哪些方面?

热门文章

  1. php 获取对象所有成员变量,PHP成员变量获取对比
  2. 设置mysql表myisam_mysql myisam 优化设置设置
  3. 怎么用计算机计算出选手最后得分,WPS技巧:TRIMMEAN函数计算选手得分
  4. java实现网页保存_详解Java两种方式简单实现:爬取网页并且保存
  5. vs 2019 aspx灰色_蛇纹当道,豹纹在侧:穿成动物园是2019时尚大势?
  6. C++的new、delete需要注意的一点:使用危险函数导致的越界CRT detected that the application wrote to memory after end of heap
  7. [C++11]统一的数据初始化方式 - 初始化列表
  8. [Java基础]System类的常用方法
  9. [蓝桥杯2017初赛]包子凑数-模拟+巧妙枚举
  10. JAVA JDBC连接mysql编程