(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 ...
随机推荐
- Win10 UI入门 pivot multiable DataTemplate
this is a dynamic pivot with sliderable navigation and multiableDatatemplate Control 看了 alexis 大哥的pi ...
- iOS系统结构
应用交互层.多媒体层.核心服务层.系统层. 参考官方文档apple Develop GuidesiOS Technologies IOS分为四级结构,由上到下为可触摸层,媒体层,核心服务层,核心系统层 ...
- css 书写推荐顺序
1.位置属性(position, top, right, z-index, display, float等)2.大小(width, height, padding, margin)3.文字系列(fon ...
- 【AnjularJS系列前篇 】 适用场景
AngularJS是一个 MV* 框架,最适于开发客户端的单页面应用.它不是个功能库,而是用来开发动态网页的框架. 它专注于扩展HTML的功能,提供动态数据绑定(data binding),而且它能跟 ...
- 页面定制CSS代码初探(一):页面变宽 文本自动换行 图片按比缩放
初识博客 初写博客,先在设置里选了个喜欢的模板 第一眼就爱上了呢!那极简的风格,我喜欢!!但是,应用后,却发现... 纳尼!模板上右侧那张漂亮的图片呢?!我的怎么什么都没有.没有图片好难看啊,瞬间无爱 ...
- BZOJ 2806 [Ctsc2012]Cheat (后缀自动机+二分+单调队列+dp)
题目大意: 给你一堆模式串和文本串 对于每个文本串,我们可以把它不可重叠地拆分成很多子串,如果拆分出的串作为子串出现在了任何一个模式串中,我们称它是“眼熟的”,我们必须保证“眼熟的”子串总长度不小于文 ...
- Linux系统_Ubuntu中Hadoop常用命令
ctrl+alt+t打开终端窗口sudo useradd -m hadoop -s/bin/bash创建新用户ctrl+alt回到自己的笔记本 创建hadoop用户sudo useradd -m ha ...
- webstorm注册码注册
最近jetbrains公司更新软件总是特别的快,很多私人搭建的server服务也失效了,现出一个能够永久破解的方法,非常简单,只需要2步就完成. 第一步 复制下方activation code,直接粘 ...
- git 简单理解
现在git这个版本控制大行其道,弄了半天大概理解了一下他的工作原理. 使用流程 1,安装git ,小乌龟,小乌龟汉化(在设置里面第一项,检查更新,下载中文包安装) 2,设置 小乌龟 ->git ...
- urlEncoder和urlDecoder的作用和使用
1.URLEncoder.encode(String s, String enc) 使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式 URLD ...