BZOJ 4285 使者
我TM再也不写BIT套主席树了。。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 200500
#define maxe 200500
using namespace std;
int n,m,q,type,x,y,g[maxv],nume=,dfn[maxv],mx[maxv],fdfn[maxv],dis[maxv],anc[maxv][],times=;
int root[maxv*],sum[maxv*],tot=,ls[maxv*],rs[maxv*];
struct edge
{
int v,nxt;
}e[maxe];
void addedge(int u,int v)
{
e[++nume].v=v;
e[nume].nxt=g[u];
g[u]=nume;
}
int lowbit(int x)
{
return (x&(-x));
}
void dfs(int x,int fath)
{
dfn[x]=++times;fdfn[times]=x;mx[x]=dfn[x];
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v!=fath)
{
anc[v][]=x;dis[v]=dis[x]+;
dfs(v,x);
mx[x]=max(mx[x],mx[v]);
}
}
}
void build(int &now,int left,int right)
{
now=++tot;sum[now]=;
if (left==right) return;
int mid=(left+right)>>;
build(ls[now],left,mid);
build(rs[now],mid+,right);
}
void get_table()
{
for (int e=;e<=;e++)
for (int i=;i<=n;i++)
anc[i][e]=anc[anc[i][e-]][e-];
}
int lca(int x,int y)
{
if (dis[x]<dis[y]) swap(x,y);
if (dis[x]!=dis[y])
{
for (int e=;e>=;e--)
{
if ((dis[anc[x][e]]>=dis[y]) && (anc[x][e]))
x=anc[x][e];
}
}
if (x==y) return x;
for (int e=;e>=;e--)
{
if (anc[x][e]!=anc[y][e])
{
x=anc[x][e];
y=anc[y][e];
}
}
return anc[x][];
}
int find(int x,int pos)
{
for (int e=;e>=;e--)
if (dis[anc[x][e]]>dis[pos])
x=anc[x][e];
return x;
}
void modify(int last,int x,int pos,int val)
{
root[x]=++tot;
int now=root[x];sum[now]=sum[last]+val;
int left=,right=n;
while (left<right)
{
int mid=(left+right)>>;
ls[now]=ls[last];rs[now]=rs[last];
if (pos<=mid)
{
ls[now]=++tot;
sum[ls[now]]=sum[ls[last]]+val;
now=ls[now];last=ls[last];right=mid;
}
else
{
rs[now]=++tot;
sum[rs[now]]=sum[rs[last]]+val;
now=rs[now];last=rs[last];left=mid+;
}
}
}
void add(int x,int pos,int val)
{
for (int i=x;i<=n;i+=lowbit(i))
modify(root[i],i,pos,val);
}
void build_tree()
{
build(root[],,n);
for (int i=;i<=n;i++)
{
root[i]=++tot;
ls[root[i]]=ls[root[i-]];rs[root[i]]=rs[root[i-]];
}
scanf("%d",&m);
for (int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(dfn[x],dfn[y],);
add(dfn[y],dfn[x],);
}
}
int ask(int now,int left,int right,int l,int r)
{
if ((left==l) && (right==r))
return sum[now];
int mid=(left+right)>>;
if (r<=mid) return ask(ls[now],left,mid,l,r);
else if (l>=mid+) return ask(rs[now],mid+,right,l,r);
else return ask(ls[now],left,mid,l,mid)+ask(rs[now],mid+,right,mid+,r);
}
int ask_(int now,int left,int right)
{
int ret=;
for (int i=now;i>=;i-=lowbit(i))
ret+=ask(root[i],,n,left,right);
return ret;
}
int main()
{
scanf("%d",&n);
for (int i=;i<=n-;i++)
{
scanf("%d%d",&x,&y);
addedge(x,y);addedge(y,x);
}
dfs(,);
get_table();
build_tree();
scanf("%d",&q);
for (int i=;i<=q;i++)
{
scanf("%d%d%d",&type,&x,&y);
if (type==)
{
add(dfn[x],dfn[y],);
add(dfn[y],dfn[x],);
}
else if (type==)
{
add(dfn[x],dfn[y],-);
add(dfn[y],dfn[x],-);
}
else
{
int t=lca(x,y);
if (t==y)
{
int r=find(x,y);
int ret1=ask_(mx[x],,n)-ask_(dfn[x]-,,n);
int ret2=ask_(mx[x],dfn[r],mx[r])-ask_(dfn[x]-,dfn[r],mx[r]);
printf("%d\n",ret1-ret2);
}
else if (t==x)
{
int r=find(y,x);
int ret1=ask_(n,dfn[y],mx[y]);
int ret2=ask_(mx[r],dfn[y],mx[y])-ask_(dfn[r]-,dfn[y],mx[y]);
printf("%d\n",ret1-ret2);
}
else
printf("%d\n",ask_(mx[x],dfn[y],mx[y])-ask_(dfn[x]-,dfn[y],mx[y]));
}
}
return ;
}
BZOJ 4285 使者的更多相关文章
- BZOJ 4285 使者 (CDQ分治+dfs序)
题目传送门 题目大意:给你一棵树,有三种操作,在两个点之间连一个传送门,拆毁一个已有的传送门,询问两个点之间的合法路径数量.一条合法路径满足 1.经过且仅经过一个传送门 2.不经过起点终点简单路径上的 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- hdu 4155 The Game of 31 博弈论
给出序列,在剩下的卡中选择,谁先拿到大于31的输,搜一下就可以了! 代码如下: #include<cstdio> #include<cstring> ]; ],sum; boo ...
- JAVA容器
JAVA容器 一.容器体系结构 java.util 二.迭代器Iterator<E> 迭代器是一种设计模式,可以遍历并选择序列中的对象,而开发人员并不需要了解该序列的底层结构.迭代器通常被 ...
- Codeforces Round #336 (Div. 2) A. Saitama Destroys Hotel 模拟
A. Saitama Destroys Hotel Saitama accidentally destroyed a hotel again. To repay the hotel company ...
- HDU 4169 树形DP
Wealthy Family Problem Description While studying the history of royal families, you want to know ho ...
- yarn介绍
hadoop 1.0 mapreduce过程 主要问题: JobTracker 是 Map-reduce 的集中处理点,存在单点故障. JobTracker 完成了太多的任务,造成了过多的资源消耗,当 ...
- APM (应用性能管理)
在信息科学和系统控制领域,APM是用来监控和管理应用软件是否有效运行的.APM通过监测和分析应用的表现去保证软件应用的良好运行,APM已经商用. 基本定义 APM = Application Perf ...
- 图解TCP/IP读书笔记(四)
第四章.IP协议 IP(Internet Protocol,网际协议),作为整个TCP/IP中至关重要的协议,主要负责将数据包发送给最终的目标计算机.因此,IP能够让世界上任何两台计算机之间进行通信. ...
- apache 的ab 工具
ab是apache 进行http服务器压力测试的一个工具.用来衡量apache 服务器的执行效率,能够检测出apache每秒能够处理的请求数. 一个使用的例子如下(windows下) ab -n -c ...
- CentOS中的chkconfig命令
chkconfig: chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接.语法: ...
- QQ2013手工去广告
QQ的广告令人讨厌,虽然网上有很多去广告补丁或者是去广告版,但是总是害怕有被盗号的风险,那除了付费会员还有其他什么方法可以安全的去除qq广告吗?显然有,那就是手动去广告. 很简单,不会比使用去广告补丁 ...