BZOJ4285: 使者
搞出dfs序,转化为查询矩形点数,树套树搞定。
#include<cstdio>
#include<cstdlib>
#define N 100005
#define IF else if
struct edge{
edge*s;
int v;
}
z[N*2],*next=z,*h[N];
int n,m,q;
void add(int u,int v){
h[u]=&(*next++=(edge){
h[u],v
}
);
h[v]=&(*next++=(edge){
h[v],u
}
);
}
typedef int ds[N];
ds d,p,r,l,son,y;
void dfs1(int u){
r[u]=1;
d[u]=d[p[u]]+1;
int s=0;
for(edge*i=h[u];i;i=i->s)
if(i->v!=p[u]){
p[i->v]=u;
dfs1(i->v);
r[u]+=r[i->v];
if(s<r[i->v])
s=r[son[u]=i->v];
}
}
void dfs2(int u){
static int j;
l[u]=++j;
if(r[u]!=1){
y[son[u]]=y[u];
dfs2(son[u]);
}
for(edge*i=h[u];i;i=i->s)
if(i->v!=p[u]&&i->v!=son[u])
dfs2(y[i->v]=i->v);
}
int lca(int s,int t){
while(y[s]^y[t])
d[y[s]]<d[y[t]]?(s^=t,t^=s,s^=t):0,s=p[y[s]];
return d[s]<d[t]?s:t;
}
struct node{
int v,s,a,q;
node*l,*r;
void up(){
s=l->s+r->s+a;
}
}
*f[N],e[N*40];
node*back=e+1;
node*create(int v){
return&(*back++=(node){
v,1,1,rand(),e,e
}
);
}
void lturn(node*&s){
node*a=s->r;
s->r=a->l;
s->up(),a->l=s;
a->up(),s=a;
}
void rturn(node*&s){
node*a=s->l;
s->l=a->r;
s->up(),a->r=s;
a->up(),s=a;
}
void ins(int v,node*&s){
if(!s->s)
s=create(v);
IF(v==s->v)++s->a,s->up();
IF(v<s->v){
ins(v,s->l);
if(s->l->q>s->q)
rturn(s);
else s->up();
}
else{
ins(v,s->r);
if(s->r->q>s->q)
lturn(s);
else s->up();
}
}
void del(int v,node*&s){
if(v<s->v)
del(v,s->l),s->up();
IF(s->v<v)del(v,s->r),s->up();
IF(s->a>1)--s->a,s->up();
IF(s->l==e)s=s->r;
IF(s->r==e)s=s->l;
IF(s->l->q>s->r->q)rturn(s),del(v,s->r),s->up();
else lturn(s),del(v,s->l),s->up();
}
int query(int v,node*s){
int k=0;
for(;;s=s->r){
while(s->s&&v<s->v)
s=s->l;
if(!s->s)
break;
k+=s->l->s+s->a;
}
return k;
}
int query(int i,int j){
for(int k=0;;i^=i&-i){
if(!i)
return k;
k+=query(j,f[i]);
}
}
void ins1(int i,int j){
for(;i<=n;i+=i&-i)
ins(j,f[i]);
}
void ins2(int s,int t){
if(l[s]<l[t])
s^=t,t^=s,s^=t;
ins1(l[t],l[s]);
}
void del1(int i,int j){
for(;i<=n;i+=i&-i)
del(j,f[i]);
}
void del2(int s,int t){
if(l[s]<l[t])
s^=t,t^=s,s^=t;
del1(l[t],l[s]);
}
int query(int i,int j,int s,int t){
return query(j,t)-query(j,s-1)-query(i-1,t)+query(i-1,s-1);
}
int find(int s,int t){
static int j;
for(;y[s]^y[t];s=p[j])
j=y[s];
return s^t?son[t]:j;
}
int qtree(int s,int t){
if(d[s]<d[t])
s^=t,t^=s,s^=t;
static int i,j,k;
i=l[s],j=l[s]+r[s]-1;
if(lca(s,t)!=t)
return l[s]<l[t]?query(i,j,l[t],l[t]+r[t]-1):query(l[t],l[t]+r[t]-1,i,j);
k=find(s,t);
return(l[k]+r[k]>n?0:query(i,j,l[k]+r[k],n))+query(1,l[k]-1,i,j);
}
int main(){
struct{
operator int(){
int x;
scanf("%d",&x);
return x;
}
}
it;
n=it;
for(int i=0;i<=n;++i)
f[i]=e;
for(int i=1;i!=n;++i)
add(it,it);
dfs1(1),dfs2(y[1]=1);
for(m=it;m;--m)
ins2(it,it);
for(q=it;q;--q){
int k=it,s=it,t=it;
if(k==3)
printf("%d\n",qtree(s,t));
if(k==1)
ins2(s,t);
if(k==2)
del2(s,t);
}
}
BZOJ4285: 使者的更多相关文章
- 【BZOJ4285】使者 cdq分治+扫描线+树状数组
[BZOJ4285]使者 Description 公元 8192 年,人类进入星际大航海时代.在不懈的努力之下,人类占领了宇宙中的 n 个行星,并在这些行星之间修建了 n - 1 条星际航道,使得任意 ...
- BZOJ 4285 使者
我TM再也不写BIT套主席树了.... #include<iostream> #include<cstdio> #include<cstring> #include ...
- 伟大的通信使者——JSON(JavaScript版本)
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表 ...
- BZOJ 4285 使者 (CDQ分治+dfs序)
题目传送门 题目大意:给你一棵树,有三种操作,在两个点之间连一个传送门,拆毁一个已有的传送门,询问两个点之间的合法路径数量.一条合法路径满足 1.经过且仅经过一个传送门 2.不经过起点终点简单路径上的 ...
- Android 面试题--Service
1.Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?默认情况,如果没有显示的指 servic 所运行的进程, Service 和 activity ...
- C语言 关于内存动态分配问题
全局变量:分配到 内存的静态区. 局部变量(非静态):分配到 内存的动态区.在存储区中称为栈(stack) 临时数据(C允许内存动态分配区域):存放在自由空间区,称为堆区(heap) 内存动态分配 得 ...
- HTML5 WebSocket
在WebSocket API中,浏览器和服务器只需要做一个握手动作,然后,浏览器和服务器之间就形成一条快速通道,两者之间就可以直接进行数据传送,这一个功能可以应用到"字幕",自己做 ...
- Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx
Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx 1. 摘要算法的大概流程2 2. 旧约圣经 (39卷)2 2.1. 与古兰经的对 ...
- React.js入门笔记
# React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...
随机推荐
- Tomcat启动找不到JRE_HOME的解决方法
在配置测试环境时,将生产服务器的Tomcat目录打包过来后解压后,启动Tomcat后,发现如下问题: [tomcat@gsp bin]$ ./shutdown.sh Using CATALINA_BA ...
- MySQL 更新语句技巧
一. 多表更新 1. 数据准备 mysql> mysql> select goods_id, goods_name,goods_cate from tdb_goods; +-------- ...
- 2015年度总结--android开发
虽然农历年才是新的一年的开始,不过关于中西文化的问题这里就不讨论了,所谓“男女平权,公说公有理,婆说婆有理;阴阳合历,你过你的年.” 看到很多朋友在发年度总结,于是想想这一年我都在干什么呢,也总结一下 ...
- Python写地铁的到站的原理简易版
Python地铁的到站流程及原理(个人理解) 今天坐地铁看着站牌就莫名的想如果用Python写其工作原理 是不是很简单就小试牛刀了下大佬们勿喷纯属小弟个人理解 首先来看看地铁上显示的站牌如下: 就想这 ...
- 安装Ubuntu的那些事儿(续)
由于我的第一篇Blog并没有给出完全解决进Ubuntu系统时显卡所造成的问题,至于那个装显卡驱动的方法本人也没有去做,感兴趣的朋友可以在网上教程试一试. 至于我的那个在高系选项中进行配置也不是好的方法 ...
- 2016 最佳 Linux 发行版排行榜
2015年,不管在企业市场还是个人消费市场都是 Linux非常重要的一年.作为一个自2005年起就开始使用 Linux的 Linuxer ,我门见证了 Linux在过去十年的成长.2016 Linux ...
- MalformedByteSequenceException: Invalid byte 1 of 1-byte
修改了线上程序的xml配置文件,重启后报如下错误: MalformedByteSequenceException: Invalid byte 1 of 1-byte 百度了下大体的意思是说文件的编码错 ...
- 【小白的CFD之旅】05 补充基础
黄师姐是一个很干脆果敢的人,从她的日常装扮就能显露出来.卡帕运动装,白色运动鞋,马尾辫,这是小白对黄师姐的第一印象.“明天早上九点钟来实验室,我给你安排这阵子的任务.”黄师姐对小白说.说话语气和老蓝一 ...
- 【2016-11-3】【坚持学习】【Day18】【Oracle 数据类型 与C#映射关系】
大部分类型的对应关系:原文:http://2143892.blog.51cto.com/2133892/499353 序号 Oracle数据类型 .NET类型 GetOracleValue类型 DbT ...
- 《深入理解计算机系统V2》学习指导
<深入理解计算机系统V2>学习指导 目录 图书简况 学习指导 第一章 计算机系统漫游 第二章 信息的表示和处理 第三章 程序的机器级表示 第四章 处理器体系结构 第五章 优化程序性能 第六 ...