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- ...
随机推荐
- 20155307 2016-2017第三次《Java程序设计》课堂实践项目
码云链接 我使用电脑端登录的云班课,截图已经放上去了,却忘了点提交.
- 《Java 程序设计》课堂实践一
由于我的IDEA在课堂上临时崩坏导致当时无法编程,修了很长一段时间解决了诸多问题才修好 现将三个题目解答如下 一.MySort 模拟实现Linux下Sort -t : -k 2的功能.参考 Sort的 ...
- 【CF908G】New Year and Original Order
[CF908G]New Year and Original Order 题面 洛谷 题解 设\(f[i][j][k][l]\)表示当前在第\(i\)位有\(j\)位大于等于\(k\),当前有没有卡上界 ...
- 关于解决idea 输入法不跟随问题
网上查了很多方法 自己试验了一种方式 jdk版本采用的是 java version "1.8.0_191"Java(TM) SE Runtime Environment (bui ...
- Python和Pycharm的安装
目录 安装Python 安装Pycharm IDE 破解Pycharm 用Pycharm创建Python工程 安装Python 去Python官网下载Python软件,网址:https://www.p ...
- CentOS7.2安装mysql-5.7.19多实例
安装多实例之前首先需要先安装mysql,这里就不介绍如何安装mysql了,参考前面的博客:https://www.cnblogs.com/hei-ma/p/9505509.html 安装多实例之前需要 ...
- CentOS 7.2二进制安装mysql-5.7.19
官方文档地址:https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html 开始安装 1.下载mysql二进制包 # cd /usr ...
- Tess4J -4.0.2- Linux 实践 [解决:Tess4J - Native library (linux-x86-64/libtesseract.so) not found in resource path]
[本文编写于2018年7月5日] Tess4J是Tesseract的Java JNA wrapper.本文介绍了在CentOS 7 操作系统中使用Tess4J的步骤及注意事项.在正式开始之前,先花一点 ...
- 美国警察iPhone数据线挡住歹徒子弹获救
泡泡网手机频道11月1日 现在手机的功能越来越丰富,不仅可以接打电话.收发短信.玩游戏聊天,关键时刻还能救命.前天HTC手机再次忠心护主,让许多同学对HTC赞赏有加.而现在又有人捡了一条命,不过这次救 ...
- Js 问题分析--js 影响页面性能
文档下载链接:http://pan.baidu.com/s/1i4Hci4d (失效请留言)