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类型的物品.完成 所有发放后 ...
随机推荐
- 一站式学习Wireshark(八):应用Wireshark过滤条件抓取特定数据流
应用抓包过滤,选择Capture | Options,扩展窗口查看到Capture Filter栏.双击选定的接口,如下图所示,弹出Edit Interface Settints窗口. 下图显示了Ed ...
- unsupported major.monor version 51.0 (unable to load *.servlet)………………
unsupported major.monor version 51.0 (unable to load *.servlet)------ 这种异常是因为编译war或者java程序的JDK版本和运行部 ...
- MapReduce的Shuffle过程介绍
MapReduce的Shuffle过程介绍 Shuffle的本义是洗牌.混洗,把一组有一定规则的数据尽量转换成一组无规则的数据,越随机越好.MapReduce中的Shuffle更像是洗牌的逆过程,把一 ...
- Android中新建的文件在R没有显示相应的文件解决的方法总结
我们有时会发现当我们新建一个文件或者目录在Generated Java Files(gen)文件的R.java中没有生成相应的静态类或者静态属性.此时你可能出现了以下的情况.注意參照解决. 一般正常情 ...
- lvm 新建一个vg 逻辑卷 配置启动
fdisk /dev/sdb 格式 t 8e w vgcreate datavg /dev/sdb1lvcreate -L 999G -n lvdata datavgmkfs.xfs /dev/da ...
- linux大小写转换
[root@ob2 mytmp]# cat aa2.txt|sed 's#[a-z]#\u&#g'ETH0 LINK ENCAP:ETHERNET HWADDR 00:0C:29: ...
- cause: java.lang.IllegalStateException: Serialized class com.taotao.pojo.TbItem must implement java.io.Serializable
HTTP Status 500 - Request processing failed; nested exception is com.alibaba.dubbo.rpc.RpcException: ...
- Hibernate- QBC-基本查询
01.环境搭建 02.基本查询 1.方法说明 方法 说明 Restrictions.eq = Restrictions.allEq 利用Map来进行多个等于的限制 Restrictions.gt &g ...
- rails中render 和 redirect_to的区别, each只能用在数组中,如果只有一个或者零个项,用each方法会报错undefined method `each' for #...
在render中,即使有:action,那么也仅仅是取对应的view中的模板(html.erb)而已,所以这里即使浏览器中的url是/orders/xcreate,但是显示的界面是/app/views ...
- Arraylist静态初始化
new ArrayList<String>(Arrays.asList("ab","cd","ef"));