HDU4822-Tri-War
题目
给出一颗树,\(m\)次询问树上不相同的三个点\(A,B,C\)。我们称一个点\(x\)被\(A\)占领当且仅当\(dist(A,x)>dist(B,x),dist(A,x)>dist(C,x)\)。
问\(A,B,C\)这三个点分别占领了多少个点。
\(n,m\le 10^5\)。
分析
如果是两个点的话,我们找到他们的中点,讨论一下即可。现在有三个点,那么我们对\(A\),分别算一下与\(B\)和\(C\)的dfn序区间,用线段树做一下区间求交即可。也可以扫描线求交,不过最多就四个区间。
代码
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
int read() {
int x=0,f=1;
char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=1e5+1;
const int maxj=17;
int f[maxn][maxj],dep[maxn],dfx,first[maxn],second[maxn],n;
struct TREE {
vector<int> g[maxn];
inline void clear(int n) {
memset(f,0,sizeof f),memset(dep,0,sizeof dep);
memset(first,0,sizeof first),memset(second,0,sizeof second);
for (int i=1;i<=n;++i) g[i].clear();
dfx=0;
}
inline void add(int x,int y) {g[x].push_back(y);}
void dfs(int x,int fa) {
f[x][0]=fa;
dep[x]=dep[fa]+1;
first[x]=++dfx;
for (int v:g[x]) if (v!=fa) dfs(v,x);
second[x]=dfx;
}
void run() {
dfs(1,1);
for (int j=1;j<maxj;++j) for (int i=1;i<=n;++i) f[i][j]=f[f[i][j-1]][j-1];
}
int lca(int x,int y) {
if (dep[x]<dep[y]) swap(x,y);
for (int j=maxj-1;j>=0;--j) if (dep[f[x][j]]>=dep[y]) x=f[x][j];
if (x==y) return x;
for (int j=maxj-1;j>=0;--j) if (f[x][j]!=f[y][j]) x=f[x][j],y=f[y][j];
return f[x][0];
}
int jump(int x,int y) {
for (int j=maxj-1;j>=0;--j) if ((y>>j)&1) x=f[x][j];
return x;
}
} tree;
struct SGT {
struct node {
int zero,one,two,tag;
int tic;
} t[maxn<<2];
int tim;
SGT ():tim(0) {}
void flow() {++tim;}
void doit(int x) {
t[x].two=t[x].one,t[x].one=t[x].zero,t[x].zero=0;
++t[x].tag;
}
void pushdown(int x,int L,int mid,int R) {
newnode(x<<1,L,mid),newnode(x<<1|1,mid+1,R);
for (int &tmp=t[x].tag;tmp;--tmp) doit(x<<1),doit(x<<1|1);
}
void update(int x,int L,int mid,int R) {
newnode(x<<1,L,mid),newnode(x<<1|1,mid+1,R);
t[x].zero=t[x<<1].zero+t[x<<1|1].zero;
t[x].one=t[x<<1].one+t[x<<1|1].one;
t[x].two=t[x<<1].two+t[x<<1|1].two;
}
void newnode(int x,int L,int R) {
if (t[x].tic!=tim) t[x].tic=tim,t[x].one=t[x].two=0,t[x].zero=R-L+1,t[x].tag=0;
}
void inc(int x,int L,int R,int l,int r) {
newnode(x,L,R);
if (L==l && R==r) {
doit(x);
return;
}
int mid=(L+R)>>1;
pushdown(x,L,mid,R);
if (r<=mid) inc(x<<1,L,mid,l,r); else
if (l>mid) inc(x<<1|1,mid+1,R,l,r); else
inc(x<<1,L,mid,l,mid),inc(x<<1|1,mid+1,R,mid+1,r);
update(x,L,mid,R);
}
void inc(int l,int r) {
if (l>r) return;
inc(1,1,n,l,r);
}
int query() {
return t[1].two;
}
} sgt;
void deal(int a,int b) {
int l=tree.lca(a,b);
if (a==l) {
int d=dep[b]-dep[a];
int jp=d>>1;
int p=tree.jump(b,jp);
sgt.inc(1,first[p]-1);
sgt.inc(second[p]+1,n);
} else if (b==l) {
int d=dep[a]-dep[b];
int jp=(d-1)>>1;
int p=tree.jump(a,jp);
sgt.inc(first[p],second[p]);
} else {
int ad=dep[a]-dep[l],bd=dep[b]-dep[l];
if (ad==bd) {
int p=tree.jump(a,ad-1);
sgt.inc(first[p],second[p]);
} else if (ad>bd) {
int d=ad+bd,jp=(d-1)>>1;
int p=tree.jump(a,jp);
sgt.inc(first[p],second[p]);
} else if (ad<bd) {
int d=ad+bd,jp=d>>1;
int p=tree.jump(b,jp);
sgt.inc(1,first[p]-1);
sgt.inc(second[p]+1,n);
}
}
}
int Ans(int a,int b,int c) {
sgt.flow();
deal(a,b);
deal(a,c);
return sgt.query();
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
int T=read();
while (T--) {
n=read();
tree.clear(n);
for (int i=1;i<n;++i) {
int x=read(),y=read();
tree.add(x,y),tree.add(y,x);
}
tree.run();
int q=read();
while (q--) {
int fir=read(),sec=read(),thr=read();
int afir=Ans(fir,sec,thr);
int asec=Ans(sec,fir,thr);
int athr=Ans(thr,fir,sec);
printf("%d %d %d\n",afir,asec,athr);
}
}
return 0;
}
HDU4822-Tri-War的更多相关文章
- poj 1085 Triangle War (状压+记忆化搜索)
Triangle War Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2685 Accepted: 1061 Desc ...
- 用Maven部署war包到远程Tomcat服务器
过去我们发布一个Java Web程序通常的做法就是把它打成一个war包,然后用SSH这样的工具把它上传到服务器,并放到相应的目录里,让Tomcat自动去解包,完成部署. 很显然,这样做不够方便,且我们 ...
- 多War项目中静态文件的共享方案
[原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源] 在互联网产品中,一般会有多个项目(Jar.WAR)组成一个产品线.这些WAR项目,因为使用相同的前端架构(jQuery.easyui等) ...
- war 文件打包技巧
1.首先是工具比如Eclipse很方便了. 2.用winrar之类的工具,把web-info目录,及跟它同级的所有目录及文件,打包成 zip文件就行了,然后把扩展名改成war! 3 Jar命令: 假定 ...
- Windows 安装JRuby 生成 war 到 tomcat 运行
Windows安装JRuby Rails 直接下载 JRuby,不装 Ruby. http://jruby.org/download 该安装包可以配好环境变量 %JRUBY_HOME% 等 安装 bu ...
- war项目在tomcat上面部署
1.war包放到webapps根目录下. 2.修改tomcat目录下的conf文件夹里面的的server.xml,在<Host></Host>之间加入: <Context ...
- Ansible-playbook批量部署,更新war脚本,可以再完善----后续再update
- name: install tomcat admin hosts: all sudo: True vars: war_file: /root/test.war tomcat_root: /data ...
- 基于Java的打包jar、war、ear包的作用与区别详解
本篇文章,小编为大家介绍,基于Java的打包jar.war.ear包的作用与区别详解.需要的朋友参考下 以最终客户的角度来看,JAR文件就是一种封装,他们不需要知道jar文件中有多少个.cla ...
- 用于部署war并重启Tomcat的脚本
只需要定义两个变量, 一个是目标tomcat实例的目录, 另一个是war包的名称 # Please define the absolute path of tomcat instance THIS_T ...
- maven install Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project web_nanchang
maven打包成war时,报错:Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default- ...
随机推荐
- Zabbix学习之路(八)之自动化监控网络发现和主动注册
1.网络发现 分两步走:创建发现规则(rule)和执行的动作(Action)(1)创建发现规则"Configuration"-->"Create discover ...
- hive 空值、NULL判断
hive中空值判断基本分两种 (1)NULL 与 \N hive在底层数据中如何保存和标识NULL,是由 alter table name SET SERDEPROPERTIES('serializa ...
- cocos2dx2.0 帧动画的创建和播放过程 深入分析
一.帧动画的创建过程帧动画的实现有四个不可或缺的类,如下:1.CCSpriteFrame:精灵帧信息.存储帧动画的每一帧的纹理基本信息. class CC_DLL CCSpriteFrame : pu ...
- 使用GitLab创建项目
- 第一篇:一天学会MongoDB数据库之Python操作
本文仅仅学习使用,转自:https://www.cnblogs.com/suoning/p/6759367.html#3682005 里面新增了如果用用Python代码进行增删改查 什么是MongoD ...
- mac安装pkg 一直“正在验证” 卡着
今天换了新mac, 但是之前wireshark(抓包工具) 不能用了 ,要安装Xquartz. 下载之后一直卡着, 网上找了半天没有解决方法. 最后我重启一下就好了... 重启一下. 2. 15款ma ...
- idea 临时文件
idea可以直接创建一个 scratch file (mac os快捷键 cmd+shift+n) 在里面可以自由的编辑文档, 配合vim使用很方便, 我使用的频率还比较高. 大概是这样的. 这个临时 ...
- Centos7部署Kubernetes集群(单工作节点)+配置dashboard可视化UI
目标:docker+kubernetes+cadvosor+dashboard 一:物理硬件 两台虚拟机(centos7):一台做为主节点(master),一台做为工作节点(node) [root@M ...
- Altera FPGA AS,PS,Jtag配置模式区别
Altera FPGA AS,PS,Jtag配置模式区别 FPGA器件有三类配置下载方式:主动配置方式(AS)和被动配置方式(PS)和最常用的(JTAG)配置方式. AS模式(active seri ...
- 使用 Mesos 管理虚拟机
摘要 为了满足渲染.基因测序等计算密集型服务的需求,UCloud 推出了“计算工厂”产品,让用户可以快速创建大量的计算资源(虚拟机).该产品的背后,是一套基于 Mesos 的计算资源管理系统.本文简要 ...