(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 ...
随机推荐
- 用IIS怎样在局域网内建网站
IIS服务器组建一览 IIS(Internet Information Server,互联网信息服务)是一种Web(网页)服务组件,其中包括Web服务器.FTP服务器.NNTP服务器和SMTP服务器, ...
- 随手记之TCP Keepalive笔记-tcp_keepalive_timer
这里可以找到大部分处理逻辑,net/ipv4/Tcp_timer.c: static void tcp_keepalive_timer (unsigned long data) { struct so ...
- Unity 自己旋转 方法
transform.Rotate(Vector3.up * Time.deltaTime * 100);
- servlet缺省路径
servlet缺省路径 servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径.该路径对应的是一个Defaul ...
- nodejs+express搭建服务器
1.Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速地搭建一个完整功能 ...
- 倍增算法总结 ( 含RMQ模板)
部分题目来自<算法竞赛设计进阶> 问题 给定一个长度为n的数列A,有m个询问,每次给定一个整数T,求出最大的k,满足a[1],a[2]……a[k]的和小于等于T(不会打sigm ...
- vue实现双向绑定原理
- Spring中的InitializingBean接口
InitializingBean接口为bean提供了初始化方法的方式,它只有afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: impo ...
- 【codeforces 505D】Mr. Kitayuta's Technology
[题目链接]:http://codeforces.com/problemset/problem/505/D [题意] 让你构造一张有向图; n个点; 以及所要求的m对联通关系(xi,yi) 即要求这张 ...
- 在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性
在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性 Maven 项目生成jar运行时提示“没有主清单属性” 新建了一个Maven的项目,mvn compile和mvn packag ...