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的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...
随机推荐
- CGLib动态代理原理及实现
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采 ...
- 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下
阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...
- GL.IssuePluginEvent 发布插件事件
Description 描述 Send a user-defined event to a native code plugin. 发送一个用户定义的事件到一个本地代码插件. Rendering in ...
- Linux 命令学习
当前登陆目录:
- KVM 网络虚拟化基础 - 每天5分钟玩转 OpenStack(9)
网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大. 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来. 为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图 这是 Open ...
- 微信公众平台开发——微信授权登录(OAuth2.0)
1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...
- log4j 不同模块输出到不同的文件
1.实现目标 不同业务的日志信息需要打印到不同的文件中,每天或者每个小时生成一个文件.如,注册的信息打印到register.log,每天凌晨生成一个register-年月日.log文件, 登录信息的日 ...
- 博客代码美化(SyntaxHighlighter)
这篇博文主要讲解自己使用SyntaxHighlighter对代码进行美工中遇见的问题以及如何使用SyntaxHighlighter? 首先来看看SyntaxHighlighter对代码美工的效果吧! ...
- C# random helper class
项目中经常需要模拟些假数据,来做测试.这个随机生成数据的helper类就应用而生: using System; using System.Text; using System.Windows.Me ...
- hibernate概述
转自:http://www.cnblogs.com/eflylab/archive/2007/01/09/615338.html Hibernate的核心组件在基于MVC设计模式的JAVA WEB应用 ...