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栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- MFC单文档程序结构
MFC单文档程序结构三方面: Doc MainFrame View
- iOS第三方(ActionSheet)-JTSActionSheet
外观和系统的基本一样 github地址:https://github.com/jaredsinclair/JTSActionSheet 百度云下载: http://pan.baidu.com/s/1q ...
- 视频转换工具 Transmageddon
点这里 Transmageddon 是一个采用 Python 语言开发的视频转换工具,支持输出几乎所有的视频格式,同时也可以生成指定平台下的视频格式. 软件界面如下图所示
- HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)
题目链接 题意 : 给你N个数,进行M次操作,0操作是将区间内的每一个数变成自己的平方根(整数),1操作是求区间和. 思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的 ...
- Heroku 与 ASP.NET 5
一. Heroku 简单来讲,Heroku是一个支持多种语言.极易部署.多价位可免费的 Pass 平台,通过 Buildpack 搭建语言运行环境, 默认内建的大部分是 Web 开发中较为常见的语言, ...
- iis 重启 (三种方法)
iis 重启 (三种方法) WINDOWS提供WEB服务的IIS有时候会出现访问过大导致网站打不开,这时重启IIS是最好的选择. 方法/步骤 1 1.界面操作 打开“控制面板”->“管理工具”- ...
- RadioButtonList js获取选择的项
<asp:RadioButtonList ID="RadioButtonList1" runat="server"> <asp:ListIte ...
- 经典SQL查询语句大全
一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数 ...
- Linux Command Line 解析
Linux Command Line 解析 0 处理模型 Linux kernel的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line进行配置的.在进行后续分析之前,先 ...
- C++的优势以及用途
C++不一定更快,但C++给你更快的机会 C++始终没有放弃的东西,一是代码表达力,二是对机器的控制力,这是其长处也是其短处,但是如果不想绑死在某平台的战车上,这两处绝对必要. 所有的平台厂商都会自称 ...