(WC2016模拟十八)Gangsters of Treeland

HINT:
$1\leq N,Q\leq 10^5$
原题:CodeChef November Challenge 2013 - MONOPLOY
题解:
其实这题是【SDOI2017】树点涂色的弱化版。。。
然后树点涂色这题甚至是[LOJ6022]【BZOJ3779】重组病毒的弱化版。。。
首先题目中的距离就是求路径上不同颜色的数目;
容易发现修改操作看起来很像LCT里的轻重边切换,那么以dfs序为下标建一颗线段树维护每个点到根节点的距离和,外面用一颗LCT维护,每次access轻重边切换的时候在线段树上修改即可。
时间复杂度:$O(nlog^2n)$
1A就是爽
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
struct edge{
int v,next;
}a[];
int n,q,u,v,x,tim=,tot=,head[],dep[],siz[],in[],out[],nmd[];
char op[];
namespace sgt{
struct node{
ll v,laz;
}t[];
void pd(int u,int l,int r){
if(t[u].laz){
int mid=(l+r)/;
t[u*].v+=t[u].laz*(mid-l+);
t[u*].laz+=t[u].laz;
t[u*+].v+=t[u].laz*(r-mid);
t[u*+].laz+=t[u].laz;
t[u].laz=;
}
}
void build(int l,int r,int u){
if(l==r){
t[u].v=dep[nmd[l]]-;
return;
}
int mid=(l+r)/;
build(l,mid,u*);
build(mid+,r,u*+);
t[u].v=t[u*].v+t[u*+].v;
}
void updata(int l,int r,int u,int L,int R,ll v){
if(L<=l&&r<=R){
t[u].v+=v*(r-l+);
t[u].laz+=v;
return;
}
int mid=(l+r)/;
pd(u,l,r);
if(L<=mid)updata(l,mid,u*,L,R,v);
if(mid<R)updata(mid+,r,u*+,L,R,v);
t[u].v=t[u*].v+t[u*+].v;
}
ll query(int l,int r,int u,int L,int R){
if(L<=l&&r<=R){
return t[u].v;
}
int mid=(l+r)/;
ll ret=;
pd(u,l,r);
if(L<=mid)ret=query(l,mid,u*,L,R);
if(mid<R)ret+=query(mid+,r,u*+,L,R);
return ret;
}
}
namespace lct{
struct node{
int son[],fa,v;
}t[];
bool ntrt(int u){
return t[t[u].fa].son[]==u||t[t[u].fa].son[]==u;
}
bool lr(int u){
return t[t[u].fa].son[]==u;
}
void rotate(int u){
int f=t[u].fa,ff=t[f].fa,ch=lr(u);
if(ntrt(f))t[ff].son[lr(f)]=u;
t[f].son[ch]=t[u].son[ch^];
t[t[f].son[ch]].fa=f;
t[u].son[ch^]=f;
t[f].fa=u;
t[u].fa=ff;
}
void splay(int u){
//printf("in splay %d %d\n",u,t[u].fa);
while(ntrt(u)){
int f=t[u].fa;
if(ntrt(f))rotate(lr(u)^lr(f)?f:u);
rotate(u);
}
}
int get(int u){
while(t[u].son[])u=t[u].son[];
return u;
}
void access(int u){
for(int now=;u;now=u,u=t[u].fa){
//printf("%d %d\n",u,now);
splay(u);
if(t[u].son[]){
int x=get(t[u].son[]);
sgt::updata(,n,,in[x],out[x],);
}
if(now){
int x=get(now);
sgt::updata(,n,,in[x],out[x],-);
}
t[u].son[]=now;
}
}
}
void add(int u,int v){
a[++tot].v=v;
a[tot].next=head[u];
head[u]=tot;
}
void dfs(int u,int fa,int dpt){
dep[u]=dpt;
siz[u]=;
in[u]=++tim;
nmd[tim]=u;
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
if(v!=fa){
lct::t[v].fa=u;
dfs(v,u,dpt+);
siz[u]+=siz[v];
}
}
out[u]=tim;
}
int main(){
memset(head,-,sizeof(head));
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d%d",&u,&v);
u++,v++;
add(u,v);
add(v,u);
}
dfs(,,);
sgt::build(,n,);
scanf("%d",&q);
for(int i=;i<=q;i++){
scanf("%s%d",op,&x);
x++;
if(op[]=='O')lct::access(x);
else printf("%.8lf\n",(double)sgt::query(,n,,in[x],out[x])/(double)(siz[x]));
}
return ;
}
(WC2016模拟十八)Gangsters of Treeland的更多相关文章
- (WC2016模拟十八)【BZOJ4299】[CodeChef]FRBSUM
咕了若干天我终于来补坑了qwq HINT $1\leq N,M\leq 10^5$ $1\leq \sum A_i\leq 10^9$ 题解: 虽然场上做出来了但还是觉得好神啊! 假设当前集合能凑出$ ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- NeHe OpenGL教程 第四十八课:轨迹球
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
原文:WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化 [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制 ...
- Java进阶(三十八)快速排序
Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...
- 《条目十八》避免使用vector<bool>
<条目十八>避免使用vector 先说结论: 一是:vector<bool>不是标准容器,因为标准容器的对于T *p = &c[0];必须是可编译的. 二是:vecto ...
- 《手把手教你》系列技巧篇(二十八)-java+ selenium自动化测试-处理模态对话框弹窗(详解教程)
1.简介 在前边的文章中窗口句柄切换宏哥介绍了switchTo方法,这篇继续介绍switchTo中关于处理alert弹窗的问题.很多时候,我们进入一个网站,就会弹窗一个alert框,有些我们直接关闭, ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存
很久没有更新dapr系列了.今天带来的是一个小的组件集成,通过多级缓存框架来实现对服务的缓存保护,依旧是一个简易的演示以及对其设计原理思路的讲解,欢迎大家转发留言和star 目录:一.通过Dapr实现 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能
在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...
随机推荐
- 理解UIView的绘制-孙亚洲
前言 最近研究OpenGL ES相关和 GPU 相关 发现这篇文章很具有参考的入门价值. 理解 UIView 的绘制, UIView 是如何显示到 Screen 上的? 首先要从Runloop开始说, ...
- struts2配置 匹配原则 配置各项默认
struts开发流程 1,引入jar包 2,配置web.xml 3,开发action类 4,配置struts.xml 版本: 2.3 引入jar文件 commons-fileupload-1.2. ...
- Pyhton学习——Day9
#文件操作的其他方法 ###############################################################################文件的内置操作函数# ...
- 3D立体方块旋转图册
代码可直接复制使用看效果 这个文章参考了Lazy.Cat的文章:https://www.cnblogs.com/Lazy-Cat/p/9750244.html,大家也可以去看看,他讲的还是比较详细的. ...
- elementUI 上传.csv文件不成功 导入功能
前言:element上传excel文件 导入功能 目标:点击导入,将excel表格的数据填充到表格. <el-upload class="upload-demo" :ac ...
- python位操作(进制)与ascii
位操作符 位操作的操作符与python的set的操作符一样.与C语言中的位操作符也是一样的. a = 60 #60的二进制为 0011 1100b = 13 #13的二进制为 00001101 c = ...
- Extjs iconCls 的用法
如何在按钮中加icon: 1.在Extjs中 { xtype:'button', text:'学生档案', iconCls:'file', }, 2.在css中写: .file{ background ...
- CF739E Gosha is hunting(费用流,期望)
根据期望的线性性答案就是捕捉每一只精灵的概率之和. 捕捉一只精灵的方案如下: 1.使用一个\(A\)精灵球,贡献为\(A[i]\) 2.使用一个\(B\)精灵球,贡献为\(B[i]\) 3.使用一个\ ...
- [CTSC1999][网络流24题]补丁VS错误
题目:洛谷P2761.vijos P1019.codevs1239.codevs2218. 题目大意:有n个错误,m个不同的补丁. 对于一个补丁,有两个不同的字符串描述.具体如下: 如果当前错误包含第 ...
- linux 模块编译步骤(原)
linux 模块编译步骤(原) 博主推荐:<Linux命令模板Licote(原)> 本文将直接了当的带你进入linux的模块编译.当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者 ...