【BZOJ4285】使者

Description

公元 8192 年,人类进入星际大航海时代。在不懈的努力之下,人类占领了宇宙中的 n 个行星,并在这些行星之间修建了 n - 1 条星际航道,使得任意两个
行星之间可以通过唯一的一条路径互相到达。
同时,在宇宙中还有一些空间跳跃点,有些跳跃点已经被发现,还有一些是未知的,每个跳跃点连接了两个行星,使得这两个行星中的任意一个都可以通过这个跳跃点到达另外一个行星。这些跳跃点因为充斥着巨大的能量,所以它们很容易崩溃。
宇宙中还有一些意图毁灭人类的外星人,他们派出了一些使者潜伏在行星上。现在这些使者想要离开他们各自藏身的行星u,到其他行星 v 去搜集情报。
由于这些使者十分小心, 他们不会经过任意一条属于这两个行星的路径上的星际航道(即不会走在 u 到 v 路径上的星际航道) 。这样他们就只能借助一些跳跃点
来到达目的地,但是这些外星人的身体十分脆弱,所以他们只能通过最多一个跳跃点。
现在告诉你若干个按照时间顺序给出的事件,每个事件可能是一个跳跃点又被发现了,也可能是一个跳跃点崩溃了,还有可能是一个外星使者想离开行星u到行星v去。
请问每个外星使者有多少条不同的路径可以选择?

Input

第一行一个正整数n。
接下来n - 1 行每行两个整数u, v,表示一条星际航道连接行星 u 与行星 v。
接下来一行一个正整数m,表示已经被发现的跳跃点个数。
接下来m行每行两个整数s, t,表示一个跳跃点连接行星 s与行星 t。
接下来一行一个正整数q,表示事件个数。
接下来q 行每行为以下三种事件中的一种:
“1 x y” :表示有一个连接行星x与行星 y的跳跃点被发现了;
“2 x y” :表示有一个连接行星 x 与行星 y 的跳跃点崩溃了(保证存在这样
一个跳跃点) ;
“3 x y” :表示有一个外星使者想从行星x到行星 y去搜集情报。

Output

对于每个外星使者输出一行一个整数, 表示这个外星使者可以选择的不同路径条数。

Sample Input

13
1 2
1 3
1 4
2 5
5 9
5 10
5 11
10 13
3 6
4 7
4 8
7 12
6
2 4
10 12
9 8
6 7
3 11
7 10
5
1 1 5
3 5 4
2 7 10
2 10 12
3 5 4

Sample Output

3
1

HINT

对于100%的数据,n ≤ 10^5,m ≤ 5 × 10^4,q ≤ 5 × 10^4 数据保证x不等于y

题解:又是精神污染。

我们将每个跳跃点看成在DFS序中二维平面上的一个点,将询问看成若干个矩形,那么就是问你矩形中点的个数,用树状数组+扫描线即可。但是有加点删点怎么办呢?套上cdq分治即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100010;
int n,m,Q,cnt,np,nq,now;
int to[maxn<<1],next[maxn<<1],head[maxn],fa[20][maxn],Log[maxn],dep[maxn],siz[maxn],p1[maxn],p2[maxn];
int s[maxn],tim[maxn],op[maxn],ans[maxn];
struct point
{
int x,y,k,org;
point() {}
point(int a,int b,int c,int d) {x=a,y=b,k=c,org=d;}
}p[maxn];
struct QUERY
{
int l,r,x,k,org;
QUERY() {}
QUERY(int a,int b,int c,int d,int e) {l=a,r=b,x=c,k=d,org=e;}
}q[maxn<<1];
inline void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x)
{
siz[x]=1,p1[x]=++p2[0];
for(int i=head[x];i!=-1;i=next[i]) if(to[i]!=fa[0][x])
fa[0][to[i]]=x,dep[to[i]]=dep[x]+1,dfs(to[i]),siz[x]+=siz[to[i]];
p2[x]=p2[0];
}
inline int FA(int x,int y)
{
for(int i=Log[y];i>=0;i--) if(y>=(1<<i)) y-=(1<<i),x=fa[i][x];
return x;
}
bool cmpx(const point &a,const point &b)
{
return a.x<b.x;
}
bool cmqx(const QUERY &a,const QUERY &b)
{
return a.x<b.x;
}
inline void updata(int x,int v)
{
for(int i=x;i<=n;i+=i&-i)
{
if(tim[i]<now) tim[i]=now,s[i]=0;
s[i]+=v;
}
}
inline int query(int x)
{
int ret=0,i;
for(i=x;i;i-=i&-i)
{
if(tim[i]<now) tim[i]=now,s[i]=0;
ret+=s[i];
}
return ret;
}
void solve(int l,int r,int L,int R)
{
if(l==r)
{
for(int i=L;i<=R;i++) if(p[l].org<q[i].org&&p[l].x<=q[i].x&&p[l].y>=q[i].l&&p[l].y<=q[i].r)
ans[q[i].org]+=p[l].k*q[i].k;
return ;
}
if(L>R) return ;
int mid=(l+r)>>1,MID,i,j;
for(i=L;i<=R;i++) if(q[i].org>p[mid].org) break;
MID=i-1;
solve(l,mid,L,MID),solve(mid+1,r,MID+1,R);
sort(p+l,p+mid+1,cmpx),sort(q+MID+1,q+R+1,cmqx);
now++;
for(i=MID+1,j=l;i<=R;i++)
{
for(;j<=mid&&p[j].x<=q[i].x;j++) updata(p[j].y,p[j].k);
ans[q[i].org]+=(query(q[i].r)-query(q[i].l-1))*q[i].k;
}
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
n=rd();
int i,j,a,b,c;
memset(head,-1,sizeof(head));
for(i=1;i<n;i++) a=rd(),b=rd(),add(a,b),add(b,a);
dfs(1);
for(i=2;i<=n;i++) Log[i]=Log[i>>1]+1;
for(j=1;(1<<j)<=n;j++) for(i=1;i<=n;i++) fa[j][i]=fa[j-1][fa[j-1][i]];
m=rd();
for(i=1;i<=m;i++)
{
a=rd(),b=rd();
if(p1[a]>p1[b]) swap(a,b);
p[++np]=point(p1[a],p1[b],1,0);
}
Q=rd();
for(i=1;i<=Q;i++)
{
op[i]=rd(),a=rd(),b=rd();
if(p1[a]>p1[b]) swap(a,b);
if(op[i]==1) p[++np]=point(p1[a],p1[b],1,i);
if(op[i]==2) p[++np]=point(p1[a],p1[b],-1,i);
if(op[i]==3)
{
if(p1[b]<=p2[a])
{
c=FA(b,dep[b]-dep[a]-1);
q[++nq]=QUERY(p1[b],p2[b],p1[c]-1,1,i);
q[++nq]=QUERY(p2[c]+1,n,p1[b]-1,-1,i),q[++nq]=QUERY(p2[c]+1,n,p2[b],1,i);
}
else q[++nq]=QUERY(p1[b],p2[b],p1[a]-1,-1,i),q[++nq]=QUERY(p1[b],p2[b],p2[a],1,i);
}
}
solve(1,np,1,nq);
for(i=1;i<=Q;i++) if(op[i]==3) printf("%d\n",ans[i]);
return 0;
}

【BZOJ4285】使者 cdq分治+扫描线+树状数组的更多相关文章

  1. [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)

    [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...

  2. bzoj 1176 cdq分治套树状数组

    题面: 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000. Inp ...

  3. bzoj 4991 [Usaco2017 Feb]Why Did the Cow Cross the Road III(cdq分治,树状数组)

    题目描述 Farmer John is continuing to ponder the issue of cows crossing the road through his farm, intro ...

  4. HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)

    Jam's problem again Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  5. BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...

  6. UVA 11990 `Dynamic'' Inversion CDQ分治, 归并排序, 树状数组, 尺取法, 三偏序统计 难度: 2

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  7. 【CJOJ2616】 【HZOI 2016】偏序 I(cdq分治,树状数组)

    传送门 CJOJ Solution 考虑这是一个四维偏序对吧. 直接cdq套在一起,然后这题有两种实现方法(树状数组的更快!) 代码实现1(cdq+cdq+cdq) /* mail: mleautom ...

  8. bzoj2253纸箱堆叠(动态规划+cdq分治套树状数组)

    Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , 之后,即可自动化生产三边边长为 (a mod P,a^2 mod p,a^3 mod P) (a^4 ...

  9. 【模板】cdq分治代替树状数组(单点修改,区间查询)

    #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #in ...

随机推荐

  1. div绝对定位针对手机浏览器的区别

    最近在对ipad和安卓平板做测试,发现我自己写的一个下拉控件在安卓浏览器里面被遮盖了,但是PC或者ipad都没有这个现象,一开始以为是z-index 可是无论我调多少都没有用,研究了好久,发现是代码的 ...

  2. windows宿主机ping不通Docker容器的解决办法

      网卡上有       docker is not a virtual machine, and you don't get access to the docker host via IP add ...

  3. TinyOS节点间通信相关接口和组件介绍

    一.基本通信接口:   Packet:提供了对message_t抽象数据类型的基本访问.这个接口的命令有:清空消息内容,获得消息的有效载荷区长度,获得消息有效载荷区的指针. //tos/interfa ...

  4. CIRI 识别circRNA的原理

    CIRI 根据circRNA 连接点处的reads来识别circRNA, 在连接点处的reads 其比对情况非常特殊: CIRI 根据3种模型来识别circRNA, 连接点处的read 叫做junct ...

  5. 如何使用GameObject类发送消息

    一.GameObject发送消息的方法 GameObject类有三个方法可以实现发送消息,即SendMessage.BroadcastMessage和SendMessageUpwards.但是它们之间 ...

  6. Cookie文件格式解析

    原文参考:http://blog.csdn.net/lixianlin/article/details/2738229 1.Cookie文件的实质 Cookie实际上是Web服务端与客户端(典型的是浏 ...

  7. 【R markdown】rmysql乱码问题

    统计数据遇到在Rmarkdown文档中通过rmysql查询中文结果乱码的现象. 数据库编码 utf8 rmd编码utf8 猜测是生成的html编码非utf8 解决方案是: dbSendQuery(co ...

  8. mongodb php auto increment 自增

    mongodb的自增实现根oracle,postgresql是差不多,都是通过计数器来实现的. oracle自增实现: 实例说明oracle序列用法 postgresql自增实现: postgresq ...

  9. matlab彩色图像插值

    软件是MATLAB R2014b 使用的是matlab中已有的函数imresize(); 彩色图像分别对R.G.B三个通道进行插值,之后融合.[imresize函数不用,可以直接插值] clear;c ...

  10. 移动端web开发技巧 -- 转载

    META相关 1. 添加到主屏后的标题(IOS)<meta name="apple-mobile-web-app-title" content="标题"& ...