BZOJ4285 : 使者

假设询问两点中d[x]<d[y]。

若x是y的祖先,那么就是求起点不在x到y方向的第一个点的子树中,且终点在y子树中的跳跃点个数。

若x不是y的祖先,那么就是求起点在x子树中,且终点在y子树中的跳跃点个数。

利用DFS序可以将转化成矩形,于是利用CDQ分治+扫描线+树状数组即可做到$O(n\log^2n)$。

#include<cstdio>
#include<algorithm>
#define N 200010
using namespace std;
int n,m,q,i,op,x,y,T,pos[N],bit[N],ans[N],cb,cc;
int g[N],v[N],nxt[N],ed,f[N],size[N],son[N],top[N],d[N],st[N],en[N],dfn;
struct P{int x,y,t;P(){}P(int _x,int _y,int _t){x=_x,y=_y,t=_t;}}a[N],b[N];
inline bool cmpb(const P&a,const P&b){return a.x<b.x;}
struct C{int x,l,r,t,p;C(){}C(int _x,int _l,int _r,int _t,int _p){x=_x,l=_l,r=_r,t=_t,p=_p;}}c[N];
inline bool cmpc(const C&a,const C&b){return a.x<b.x;}
inline void read(int&a){char c;while(!(((c=getchar())>=‘0‘)&&(c<=‘9‘)));a=c-‘0‘;while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;}
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
void dfs(int x){
  size[x]=1;
  for(int i=g[x];i;i=nxt[i])if(v[i]!=f[x]){
    d[v[i]]=d[f[v[i]]=x]+1;dfs(v[i]);size[x]+=size[v[i]];
    if(size[v[i]]>size[son[x]])son[x]=v[i];
  }
}
void dfs2(int x,int y){
  st[x]=++dfn;top[x]=y;
  if(son[x])dfs2(son[x],y);
  for(int i=g[x];i;i=nxt[i])if(v[i]!=son[x]&&v[i]!=f[x])dfs2(v[i],v[i]);
  en[x]=dfn;
}
inline int lca2(int x,int y){
  int t;
  while(top[x]!=top[y])t=top[y],y=f[top[y]];
  return x==y?t:son[x];
}
inline void ins(int x,int y){for(;x<=n;x+=x&-x)if(pos[x]<T)pos[x]=T,bit[x]=y;else bit[x]+=y;}
inline int ask(int x){int t=0;for(;x;x-=x&-x)if(pos[x]==T)t+=bit[x];return t;}
void solve(int l,int r){
  if(l==r)return;
  int mid=(l+r)>>1;
  solve(l,mid),solve(mid+1,r);
  int i,j;
  cb=cc=0;
  for(i=l;i<=mid;i++){
    if(a[i].t<0){
      b[cb++]=P(a[i].x,a[i].y,-1);
      b[cb++]=P(a[i].y,a[i].x,-1);
    }
    if(!a[i].t){
      b[cb++]=P(a[i].x,a[i].y,1);
      b[cb++]=P(a[i].y,a[i].x,1);
    }
  }
  if(!cb)return;
  for(i=r;i>mid;i--){
    if(a[i].t==1){
      c[cc++]=C(n,st[a[i].y],en[a[i].y],1,i);
      c[cc++]=C(st[a[i].x]-1,st[a[i].y],en[a[i].y],1,i);
      c[cc++]=C(en[a[i].x],st[a[i].y],en[a[i].y],-1,i);
    }
    if(a[i].t==2){
      c[cc++]=C(st[a[i].x]-1,st[a[i].y],en[a[i].y],-1,i);
      c[cc++]=C(en[a[i].x],st[a[i].y],en[a[i].y],1,i);
    }
  }
  if(!cc)return;
  if(cb>1)sort(b,b+cb,cmpb);
  if(cc>1)sort(c,c+cc,cmpc);
  for(T++,i=j=0;i<cc;i++){
    while(j<cb&&b[j].x<=c[i].x)ins(b[j].y,b[j].t),j++;
    ans[c[i].p]+=c[i].t*(ask(c[i].r)-ask(c[i].l-1));
  }
}
int main(){
  read(n);
  for(i=1;i<n;i++)read(x),read(y),add(x,y),add(y,x);
  dfs(1),dfs2(1,1);
  read(q);
  while(q--)read(x),read(y),a[++m]=P(st[x],st[y],0);
  read(q);
  while(q--){
    read(op),read(x),read(y);
    if(op==1)a[++m]=P(st[x],st[y],0);
    if(op==2)a[++m]=P(st[x],st[y],-1);
    if(op==3){
      if(d[x]>d[y])swap(x,y);
      if(st[x]<=st[y]&&en[y]<=en[x])a[++m]=P(lca2(x,y),y,1);else a[++m]=P(x,y,2);
    }
  }
  solve(1,m);
  for(i=1;i<=m;i++)if(a[i].t>0)printf("%d\n",ans[i]);
  return 0;
}

  

时间: 2024-10-15 04:29:17

BZOJ4285 : 使者的相关文章

为民请命书--关于当前国家建设的建议 弥勒观音使者紫薇真人—李万鸿

为民请命书--关于当前国家建设的建议 转载▼ 标签: 毛主席 张宏良 何新 改革 政治   制定政策要从中国的实际出发,考虑大多数穷困人口,要切实保障他们的收入和生活水平,要全国一盘棋,运用马列主义毛主席老人家思想和系统工程的原理,全面正确科学合理地解决问题,实现精神文明.物质文明.生态文明和政治文明的繁荣.本着道德和良知,根据公平和正义的原则,目前,我认为以下问题比较重要,希望政府拿出魄力和勇气下大力气解决.今天的中国,广大人民呼吁打土豪,分田地!      现在天津工厂爆炸,死亡104人,人

SSL加密技术:数据传输的网络安全使者

SSL协议是目前全球等级较高的加密安全协议,为网络传输提供加密安全通道,保护信息传递安全. 什么是SSL加密? SSL 的英文全称是 "Secure Sockets Layer" ,中文名为 " 安全套接层协议层 " ,SSL 协议指定了一种在应用程序协议(如 HTTP . Telenet . NMTP 和 FTP 等)和 TCP/IP 协议之间提供数据安全性分层的机制,它为 TCP/IP 连接提供数据加密.服务器认证.消息完整性以及可选的客户机认证. SSL加密技

【Floyd】文化之旅

[NOIP2012]文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同文化的国家对其他文化的看法不同,有些文化会排斥外来 文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家). 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这 位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路

Atitit 创业好处 Atitit 为什么我们要创业

Atitit 创业好处 Atitit 为什么我们要创业 1.1. 提升学历 1 1.2. 提升自己的能力 1 1.3. 拓展视野 站在高层ceo 才能掌握全局.站在产业链高层,才可看到趋势. 1 1.4. 提升自己的知识体系,完成从打工到ceo的转变 1 1.5. 事业有成带来成就感 1 1.6. 圆梦计划 现在就是圆梦的时候到了 2 1.7. 为了更好的普度众生,是我们大神的神圣使命感 2 1.8. 提升职位 3 1.9. 增强团队凝聚力 3 1.10. 建立自己的商业帝国 3 1.11. 说

在Swift语言中,关于Any,AnyObject,AnyClass的区别与联系

在Swift语言中,协议定义类或结构体应该遵守的变量和方法集合,如下所示,这个一个标准的协议的声明: protocol NSObjectProtocol { func isEqual(object: AnyObject?) -> Bool var hash: Int { get } var superclass: AnyClass? { get } func `self`() -> Self! func isProxy() -> Bool func isKindOfClass(aClas

我们为什么会孤独?

你有过孤独的时候吗?比如走在繁华的大街,看着周围喧闹的人群,却没有一张熟悉的面孔,好像自己只是一个局外人,热闹是她们的,和我无关:比如在安静的夜里,看着窗外漆黑一片,整个世界都已经熟睡,好像自己被整个世界抛弃,晚安是属于他们的,和我无关:比如某个时刻,好想找个人陪着自己说说话,却发现通讯录里面的所有人好像都不那么合适,好像自己的心里被瞬间掏空,孤独是属于自己的,和其他人不沾边. 昨天晚上看到微博里面"说说你最孤独的夜",感触颇深,我想我最孤独的夜里就是毕业前夕,同学们都赶到了学校,准备

【管理心得之二十二】小人物 仰视 大授权

场景再现====================Boss:小王,来我办公室一下.小王: 嗯Boss:近期总公司有会,需要到外地出差几日.我不在的这段期间里,公司大小事务你帮忙处理一下.          如果有什么难决定的事,第一时间电话.邮件联系我商定即可.小王:  明白.放心吧领导,绝不会让你失望的Boss:嗯,那就好,没事了. {小王走出办公室} 心中暗喜,"难道这就是传说中的授权,Boss不在的时候,我岂不是最高权力的行使者." ==================== 从场景

为什么国外程序员爱用 Mac?

from http://www.vpsee.com/2009/06/why-programmers-love-mac/ Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里.普通用户喜欢 Mac 可以理解,毕竟 Mac 设计美观,简单好用,没有病毒.那么为什么专业人士也对 Mac 情有独钟呢?从个人使用经验来看我想有下面几个原因: 1.Mac OS X 是基于 Unix 的.这一点太重要了,尤其是对开发人员,至少对于我来说很重要,这意味着Unix 下一堆好用的工具都可以随手捡到.

DNF NPK包名对照一览表

文章转载自:http://bbs.exrpg.com/thread-107917-1-1.html ┌ sprite.NPK                                                  登陆界面├ sprite_character.NPK                                        默认角色头像和角色轮廓├ sprite_character_common.NPK