bzoj 3307 雨天的尾巴
题目链接:传送门
题目大意:中文题,略
题目思路:网上有题解说是合并线段树的,但是太难蒟蒻不会,只能用树剖求解
如果不是树而是一维数组我们会怎么解?
当然是利用前缀和思想标记 (L) v+1,(R+1) v-1,然后扫一遍
用线段树取最大复杂度 nlogn
现在是搬到了树上,怎么做?
利用树链剖分拆成链然后在像一维那样做就行,复杂度n(logn)^2
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 100005
#define maxn 30010
typedef pair<int,int> PII;
typedef long long LL;
LL read(){
LL x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
vector<int>V[N];
map<int,int>M;
int num[N],ncnt,head[N],hcnt,ans[N];
int n,m,k,L,R,sz,v;
int son[N],siz[N],id[N],tid;
int top[N],dep[N],fa[N],posi[N];
struct Node{int to,nxt,v;}node[N<<];
struct Seg{int v,va;}seg[N<<];
inline void add(int x,int y,int v){
node[hcnt].to=y,node[hcnt].nxt=head[x],node[hcnt].v=v,head[x]=hcnt++;
}
void dfs1(int u,int f,int deep){
fa[u]=f,++siz[u],dep[u]=deep;
for(int e:V[u]){
if(e==f)continue;
dfs1(e,u,deep+);siz[u]+=siz[e];
if(!son[u]||siz[son[u]]<siz[e])son[u]=e;
}
}
void dfs2(int u,int tp){
id[u]=++tid,posi[tid]=u,top[u]=tp;
if(!son[u])return; dfs2(son[u],tp);
for(int e:V[u])if(!id[e])dfs2(e,e);
}
void pushup(int rt){
if(seg[rt<<].v>seg[rt<<|].v)seg[rt]=seg[rt<<];
else if(seg[rt<<].v<seg[rt<<|].v)seg[rt]=seg[rt<<|];
else if(num[seg[rt<<].va]<num[seg[rt<<|].va])seg[rt]=seg[rt<<];
else seg[rt]=seg[rt<<|];
}
void update(int rt,int l,int r){
if(l==r){seg[rt].v+=v;seg[rt].va=l;return;}
int mid=l+r>>;
if(L<=mid)update(lson);
else update(rson);
pushup(rt);
}
void build(int rt,int l,int r){
if(l==r){seg[rt].va=l;return;}
int mid=l+r>>;
build(lson);build(rson);
}
int main(){
int i,j,group,x,y,Case=;
n=read(),m=read();
mst(head,-);
for(i=;i<n;++i){
x=read(),y=read();
V[x].push_back(y);
V[y].push_back(x);
}
dfs1(,,);dfs2(,);
for(i=;i<=m;++i){
x=read(),y=read();v=read();
if(!M[v]){
M[v]=++ncnt;
num[ncnt]=v;
}
v=M[v];
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
L=id[top[x]],R=id[x];
add(L,v,);add(R+,v,-);
x=fa[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
L=id[y],R=id[x];
add(L,v,);add(R+,v,-);
}
build(,,m);
for(i=;i<=n;++i){
for(j=head[i];~j;j=node[j].nxt){
L=node[j].to;v=node[j].v;
update(,,m);
}
ans[posi[i]]=num[seg[].va];
}
for(i=;i<=n;++i)printf("%d\n",ans[i]);
return ;
}
bzoj 3307 雨天的尾巴的更多相关文章
- BZOJ 3307: 雨天的尾巴( LCA + 线段树合并 )
路径(x, y) +z : u处+z, v处+z, lca(u,v)处-z, fa(lca)处-z, 然后dfs一遍, 用线段树合并. O(M log M + M log N). 复杂度看起来不高, ...
- Bzoj 3307 雨天的尾巴(线段树合并+树上差分)
C. 雨天的尾巴 题目描述 N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入格式 第 ...
- BZOJ.3307.雨天的尾巴(dsu on tree/线段树合并)
BZOJ 洛谷 \(dsu\ on\ tree\).(线段树合并的做法也挺显然不写了) 如果没写过\(dsu\)可以看这里. 对修改操作做一下差分放到对应点上,就成了求每个点子树内出现次数最多的颜色, ...
- BZOJ 3307 雨天的尾巴 (树上差分+线段树合并)
题目大意:给你一棵树,树上一共n个节点,共m次操作,每次操作给一条链上的所有节点分配一个权值,求所有节点被分配到所有的权值里,出现次数最多的权值是多少,如果出现次数相同就输出最小的. (我辣鸡bzoj ...
- bzoj 3307: 雨天的尾巴 线段树合并
题目大意: N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.问完成所有发放后,每个点存放最多的是哪种物品. 题解: 首先我们为每一个节 ...
- bzoj 3307: 雨天的尾巴【树剖lca+树上差分+线段树合并】
这居然是我第一次写线段树合并--所以我居然在合并的时候加点结果WAWAWAMLEMLEMLE--!ro的时候居然直接指到la就行-- 树上差分,每个点建一棵动态开点线段树,然后统计答案的时候合并即可 ...
- 【BZOJ 3307】 3307: 雨天的尾巴 (线段树+树链剖分)
3307: 雨天的尾巴 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 458 Solved: 210 Description N个点,形成一个树状结 ...
- P4556 [Vani有约会]雨天的尾巴(线段树合并+lca)
P4556 [Vani有约会]雨天的尾巴 每个操作拆成4个进行树上差分,动态开点线段树维护每个点的操作. 离线处理完向上合并就好了 luogu倍增lca被卡了5分.....于是用rmq维护.... 常 ...
- BZOJ_3307_雨天的尾巴_线段树合并+树上差分
BZOJ_3307_雨天的尾巴_线段树合并 Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y 对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成 所有发放后 ...
随机推荐
- jffs2制作与烧写
JFFS2全名是Journalling Flash File System Version2.最早只支持Nor Flash,自2.6版以后开始支持Nand Flash. JFFS2是Flash上应用最 ...
- MongoDB(五):MongoDB操作文档
本篇文章中将讲解如何使用MongoDB操作文档. 文档的数据结构和JSON基本一致,所有存储在集合中的数据都是BSON格式.BSON是一种类似json格式的一种二进制形式的存储格式,简称Binary ...
- ubuntu workbench
先安装环境 sudo apt-get install python-paramikosudo apt-get install python-pysqlite2 当然mysql要装好 还要装 sudo ...
- jsp页面积累
out.print(页面html);response.setContexttype("");以页面的形式展现java
- 数据库之“on”“where”区别
数据库在通过连接两张或者多张表返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户 在使用inner join(内连接)没有区别,但是 在使用left jion时,on和where条件的 ...
- thinkphp 3.2跟3.1 区别
1.ThinkPHP3.2 主要整合了3.1以及之前版本的分组问题.3.2之前有普通分组和独立分组,还需要在配置文件中配置.3.2已经不需要配置了,直接使用独立分组就可以了.2.ThinkPHP3.2 ...
- 竟然没有转载。。。A Few of My Favorite HTML5 and CSS3 Online Tools
HTML5 Boilerplate HTML5 Boilerplate provides a great way to get started building HTML5 sites. It inc ...
- imx6 读取CPU温度
imx6 读取CPU温度 cat /sys/class/thermal/thermal_zone0/temp Tony Liu 2017-2-11, Shenzhen
- PHP wamp server问题
只能说各种不顺,天热人烦! 问题一.wampapache服务不能启动之VCRUNTIME140.DLL文件丢失. 这个是缺少VC运行库,查找并安装相应的文件即可. 问题二.wampapche服务不能启 ...
- C++类的成员函数的形参列表后面的const
看到(C++ Primer)类的成员函数这里,突然对成员函数形参列表后面的const感到迷惑. 因为书中开始说是修饰隐含形参this的,然后又说是声明该函数是只读的. 大为不解! 翻资料.找人讨论.. ...