题目

给出一颗树,\(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的更多相关文章

  1. poj 1085 Triangle War (状压+记忆化搜索)

    Triangle War Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2685   Accepted: 1061 Desc ...

  2. 用Maven部署war包到远程Tomcat服务器

    过去我们发布一个Java Web程序通常的做法就是把它打成一个war包,然后用SSH这样的工具把它上传到服务器,并放到相应的目录里,让Tomcat自动去解包,完成部署. 很显然,这样做不够方便,且我们 ...

  3. 多War项目中静态文件的共享方案

    [原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源] 在互联网产品中,一般会有多个项目(Jar.WAR)组成一个产品线.这些WAR项目,因为使用相同的前端架构(jQuery.easyui等) ...

  4. war 文件打包技巧

    1.首先是工具比如Eclipse很方便了. 2.用winrar之类的工具,把web-info目录,及跟它同级的所有目录及文件,打包成 zip文件就行了,然后把扩展名改成war! 3 Jar命令: 假定 ...

  5. Windows 安装JRuby 生成 war 到 tomcat 运行

    Windows安装JRuby Rails 直接下载 JRuby,不装 Ruby. http://jruby.org/download 该安装包可以配好环境变量 %JRUBY_HOME% 等 安装 bu ...

  6. war项目在tomcat上面部署

    1.war包放到webapps根目录下. 2.修改tomcat目录下的conf文件夹里面的的server.xml,在<Host></Host>之间加入: <Context ...

  7. Ansible-playbook批量部署,更新war脚本,可以再完善----后续再update

    - name: install tomcat admin hosts: all sudo: True vars: war_file: /root/test.war tomcat_root: /data ...

  8. 基于Java的打包jar、war、ear包的作用与区别详解

      本篇文章,小编为大家介绍,基于Java的打包jar.war.ear包的作用与区别详解.需要的朋友参考下   以最终客户的角度来看,JAR文件就是一种封装,他们不需要知道jar文件中有多少个.cla ...

  9. 用于部署war并重启Tomcat的脚本

    只需要定义两个变量, 一个是目标tomcat实例的目录, 另一个是war包的名称 # Please define the absolute path of tomcat instance THIS_T ...

  10. 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- ...

随机推荐

  1. 20155305《信息安全系统设计基础》10月18日课堂 fork,exic,wait

    20155305<信息安全系统设计基础>10月18日课堂 fork,exic,wait fork()函数 1.fork函数作用 一般来讲, 我们编写1个普通的c程序, 运行这个程序直到程序 ...

  2. 2016-2017-20155329 《Java程序设计》第十周学习总结

    学号 2016-2017-20155329 <Java程序设计>第十周学习总结 教材学习内容总结 学习目标 了解计算机网络基础 OSI分层(7层):物理层.数据链路层.网络层.传输层.会话 ...

  3. (转) 转换Drupal7模块到Drupal8

    转载地址:http://verynull.com/2015/11/02/Converting-7-x-modules-to-8-x/ 本节主要介绍如何把drupal7的模块转化为drupal8.参考资 ...

  4. Android开源的精美日历控件,热插拔设计的万能自定义UI

    Android开源的精美日历控件,热插拔设计的万能自定义UI UI框架应该逻辑与界面实现分离,该日历控件使用了热插拔的设计 ,简单几步即可实现你需要的UI效果,热插拔的思想是你提供你的实现,我提供我的 ...

  5. oracle 查看锁表及解锁的语句

    解锁语句: alter system kill session 'sid, serial#'; alter system kill session '23, 1647'; 查询那些对象被锁: sele ...

  6. clean code(一)

    代码整洁之道对于程序的重构及可读性至关重要.开始整洁之道吧!!! 一.抽离try catch 模块 public void delete(Page page){ try { deletePageAnd ...

  7. 面向 Unity* 软件和虚拟现实的优化:运行时生成内容

    优化游戏以实现高性能一直是游戏开发过程中的一个重要因素.虽然开发人员一直尝试将硬件推向极致,但当移动游戏成为主流时,优化技术变得尤为突出.Unity* 软件.Unreal* 等常见引擎最初都是面向 P ...

  8. TW实习日记:第六天

    今日的一整天都是在开发微信相关的接口,因为项目的系统是嵌在企业微信中,所以不可避免的要产生微信UserID和企业系统ID的匹配关系,那么就需要用手机号或是邮箱这种两边都存在的唯一参数进行匹配.然后再将 ...

  9. Atom 插件 Sync Settings 备份与恢复

    当使用 Atom IDEA.随着使用的越来越多,安装的插件也越来越多,一旦电脑重装后需要复原开发环境,这将是一件比较头疼的事.「Sync Settings」插件可以帮助我们解决这个问题. 操作流程 安 ...

  10. [转载] Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例

    1.环境准备 ​ 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0.33 c4 -&g ...