bzoj3307: 雨天的尾巴
3307: 雨天的尾巴
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 479 Solved: 214
[Submit][Status][Discuss]
Description
N个点,形成一个树状结构。有M次发放,每次选择两个点x,y
对于x到y的路径上(含x,y)每个点发一袋Z类型的物品。完成
所有发放后,每个点存放最多的是哪种物品。
Input
第一行数字N,M
接下来N-1行,每行两个数字a,b,表示a与b间有一条边
再接下来M行,每行三个数字x,y,z.如题
Output
输出有N行
每i行的数字表示第i个点存放最多的物品是哪一种,如果有
多种物品的数量一样,输出编号最小的。如果某个点没有物品
则输出0
题解
这题有点奥妙重重啊……我数组开大了不到十分之一就卡着内存过了
考虑每种颜色,我们可以树上差分,x,y处+1,xy的lca处-1,lca的father-1,然后子树和就是颜色在这个点的数量。然后我们用一个线段树来维护每个节点所有的颜色的值(这个用差分做)和他们的最大值,然后从底向上一路线段树合并上去就行了
1 program j01; 2 const maxn=100086; 3 type xx=record l,r,mx,id:longint; end; 4 lsh=record id,w:longint; end; 5 var head:array[0..maxn]of longint; 6 q,next:array[0..2*maxn]of longint; 7 t:array[0..65*maxn]of xx; 8 st:array[0..20,0..2*maxn]of longint; 9 dep,fir,dfn,fa,root:array[0..maxn]of longint; 10 tot,dfnt,tt,n,m,u,v,w,cnt,lc,p,i,mx:longint; 11 op:array[0..maxn]of record u,v,w:longint;end; 12 ls:array[0..maxn]of lsh; 13 bin,ps:array[0..maxn]of longint; 14 ans:array[0..maxn]of longint; 15 16 procedure swap(var a,b:longint); 17 var c:longint; 18 begin 19 c:=a;a:=b;b:=c; 20 end; 21 22 procedure add(u,v:longint); 23 begin 24 inc(tt);q[tt]:=v;next[tt]:=head[u];head[u]:=tt; 25 end; 26 27 procedure dfs(i,pre:longint); 28 var j:longint; 29 begin 30 inc(tot);st[0,tot]:=i;fir[i]:=tot; 31 inc(dfnt);dfn[dfnt]:=i; 32 j:=head[i]; 33 while j>0 do 34 begin 35 if(q[j]<>pre)then 36 begin 37 dep[q[j]]:=dep[i]+1;fa[q[j]]:=i; 38 dfs(q[j],i); 39 inc(tot);st[0,tot]:=i; 40 end; 41 j:=next[j]; 42 end; 43 end; 44 45 function min_st(a,b:longint):longint; 46 begin 47 if dep[a]<dep[b] then exit(a) else exit(b); 48 end; 49 50 procedure getst; 51 var i,j:longint; 52 begin 53 bin[1]:=0; 54 for i:=2 to tot do 55 if i and(i-1)=0 then bin[i]:=bin[i-1]+1 else bin[i]:=bin[i-1]; 56 for i:=1 to bin[tot] do 57 for j:=1 to tot+1-(1 shl i) do 58 st[i,j]:=min_st(st[i-1,j],st[i-1,j+(1 shl(i-1))]); 59 end; 60 61 function lca(u,v:longint):longint; 62 var k:longint; 63 begin 64 if u=v then exit(u); 65 u:=fir[u];v:=fir[v]; 66 if u>v then swap(u,v);k:=bin[v-u]; 67 exit(min_st(st[k,u],st[k,v+1-(1 shl k)])); 68 end; 69 70 procedure update(i:longint); 71 begin 72 if t[t[i].l].mx>=t[t[i].r].mx then 73 begin 74 t[i].mx:=t[t[i].l].mx;t[i].id:=t[t[i].l].id; 75 end else 76 begin 77 t[i].mx:=t[t[i].r].mx;t[i].id:=t[t[i].r].id; 78 end; 79 if t[i].mx=0 then t[i].id:=0; 80 end; 81 82 procedure ins(var i:longint;l,r,ps,dd:longint); 83 var mid:longint; 84 begin 85 if i=0 then 86 begin 87 inc(cnt);i:=cnt; 88 end; 89 if l=r then 90 begin 91 inc(t[i].mx,dd);t[i].id:=l;exit; 92 end; 93 mid:=(l+r)div 2; 94 if ps<=mid then ins(t[i].l,l,mid,ps,dd) else ins(t[i].r,mid+1,r,ps,dd); 95 update(i); 96 end; 97 98 function merge(x,y,l,r:longint):longint; 99 var mid:Longint; 100 begin 101 if(x=0)or(y=0)then exit(x+y); 102 if l=r then 103 begin 104 inc(t[x].mx,t[y].mx);t[x].id:=l;exit(x); 105 end; 106 mid:=(l+r)div 2; 107 t[x].l:=merge(t[x].l,t[y].l,l,mid); 108 t[x].r:=merge(t[x].r,t[y].r,mid+1,r); 109 update(x);exit(x); 110 end; 111 112 procedure qsort(l,r:longint); 113 var i,j,x:longint;y:lsh; 114 begin 115 i:=l;j:=r;x:=ls[(i+j)div 2].w; 116 repeat 117 while ls[i].w<x do inc(i); 118 while x<ls[j].w do dec(j); 119 if i<=j then 120 begin 121 y:=ls[i];ls[i]:=ls[j];ls[j]:=y; 122 inc(i);dec(j); 123 end; 124 until i>j; 125 if i<r then qsort(i,r); 126 if l<j then qsort(l,j); 127 end; 128 129 procedure disc; 130 var i:longint; 131 begin 132 qsort(1,m); 133 op[ls[1].id].w:=1;mx:=1; 134 ps[1]:=ls[1].w; 135 for i:=2 to m do 136 begin 137 if ls[i].w<>ls[i-1].w then inc(mx); 138 op[ls[i].id].w:=mx; 139 ps[mx]:=ls[i].w; 140 end; 141 end; 142 143 begin 144 readln(n,m); 145 fillchar(head,sizeof(head),0);tt:=0; 146 for i:=1 to n-1 do 147 begin 148 readln(u,v);add(u,v);add(v,u); 149 end; 150 dfs(1,0); 151 getst; 152 for i:=1 to m do 153 begin 154 readln(op[i].u,op[i].v,op[i].w); 155 ls[i].w:=op[i].w;ls[i].id:=i; 156 end; 157 disc; 158 for i:=1 to m do 159 begin 160 u:=op[i].u;v:=op[i].v;w:=op[i].w; 161 lc:=lca(u,v); 162 ins(root[u],1,mx,w,1); 163 ins(root[v],1,mx,w,1); 164 ins(root[lc],1,mx,w,-1); 165 if fa[lc]<>0 then ins(root[fa[lc]],1,mx,w,-1); 166 end; 167 for i:=n downto 1 do 168 begin 169 p:=dfn[i]; 170 ans[p]:=ps[t[root[p]].id]; 171 if fa[p]>0 then root[fa[p]]:=merge(root[fa[p]],root[p],1,mx); 172 end; 173 for i:=1 to n do writeln(ans[i]); 174 end.
转载于:https://www.cnblogs.com/oldjang/p/6663809.html
bzoj3307: 雨天的尾巴相关推荐
- bzoj3307 雨天的尾巴
3307: 雨天的尾巴 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 258 Solved: 121 [Submit][Status][Discu ...
- bzoj-3307 雨天的尾巴
题意: 给出一个n个点的树,有m个事件: 每次是将x到y的路径上所有点都投放一个z的物品: 求最后每个点上那个物品最多: n,m<=100000: 题解: 一道数据结构好题: 首先这道题问的是最 ...
- 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解
题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...
- P4556 雨天的尾巴
题目背景 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地 ...
- 【JZOJ3397】【luoguP4556】雨天的尾巴
description 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连 ...
- [线段树][树上差分] Jzoj P3397 雨天的尾巴
Description 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连 ...
- 线段树分裂与合并 ---- 树上差分 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
题目链接 解题思路: 首先题目是对u,vu,vu,v这两条路径上面添加一个zzz,然后运用树上点的差分思想,对于分发路径u,vu,vu,v,我们在uuu上+1+1+1,在vvv上+1+1+1,在lca ...
- [Vani有约会]雨天的尾巴 (线段树合并)
题目链接 Solution 树上差分+线段树合并. 在每个节点上维护一棵权值线段树. 然后如果需要修改 \(x,y\) 两点,则在 \(x\) 处和 \(y\) 处分别加上 \(1\) 的权值. 然后 ...
- 洛谷 - P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并(树上差分+线段树合并)
题目链接:点击查看 题目大意:给出一棵树,再给出 m 次操作,每次操作会选择两个点 ( x , y ) ,使得这条路径上的所有点的种类 z 加一,最后问每个点的哪个种类出现的频率最高,若多个种类出现频 ...
最新文章
- 财务大数据比赛有python吗-如何在一个月之内掌握python数据分析,参加大数据比赛?...
- 【转】深入浅出REST
- mac python3 安装mysqlclient
- 关于网络投票的反思2018-11-11
- linux 文档操作,Linux学习之文档操作
- 从CLI监视OpenJDK
- 回顾2009,展望2010
- java程序移植_java JDBC 提高程序可移植性
- 我是买家项目随想-展望2011
- staf工作笔记-对STAX进行扩展(配置并运行官方的Delay实例)
- 阿里二面:外部接口大量超时,把整个系统拖垮,引发雪崩!如何解决?熔断......
- JAVA maven Spring 开发 webservice 步骤
- Script - MapSubString()使用
- php高德地图坐标在多边形,多边形的绘制和编辑
- 客户忠诚度及会员等级划分
- DaleCloud(原NFine)介绍三:后台业务功能开发实战演示
- 魔方口诀(个人备忘)
- 电脑屏幕键盘关闭方法
- 2D游戏引擎开发入门(二)
- Mr.Alright--- Android 11(R)桌面文件夹预览布局类似9宫格的实现
热门文章
- iPhone5C三大看点:性能不输iPhone5 或售3399元
- 图书管理系统学习与总结
- 记录linux使用QT检测U盘的方式
- 固态硬盘之模组(成品)厂商
- php手册下载打开没有内容,php pdf文件下载:无法加载PDF文档
- Progressive Minimal Path Method for Segmentation of 2D and 3D Line Structures论文学习
- 5个月前,如果你没有不屑于刷这份《字节内推+面试宝典》,今天坐到字节Android部门,年薪70w+的人就是你了......
- 手把手带你安装GNS3。我的天,太详细了!
- 百度语音识别开放平台SDK用法
- Excel表格如何输出为清晰图片