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- ...
随机推荐
- 20155336 2016-2017-2《JAVA程序设计》第二周学习总结
20155336 2016-2017-2 <JAVA 程序设计>第二周学习总结 教材学习内容 1: GIT版本检测 2: JAVA中基本类型 整数 字节 浮点数 字符 布尔(▲) 通过AP ...
- vim 中文乱码问题
编辑~/.vimrc文件,加上如下几行: set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936 set termencoding=utf ...
- 【LG3835】可持久化平衡树
[LG3835]可持久化平衡树 题面 洛谷 解法一 参考文章 rope大法好 \(rope\)基本操作: #include<ext/rope> using namespace __gnu_ ...
- 用php做个简单的日历
存档: index.php <html> <head> <title>日历</title> <style> table{border:1px ...
- .net mvc 使用ueditor的开发(官网没有net版本?)
1.ueditor的下载导入 官网下载地址:https://ueditor.baidu.com/website/download.html · 介绍 有两种,一种开发版,一种Mini版,分别长这样: ...
- vue异步分页+初始化页面
html代码: <section class="container page-home"> <div id="main-content" cl ...
- mnist手写数字识别(神经网络)
import numpy as np from sklearn.neural_network import MLPClassifier path = 'mnist.npz' f = np.load(p ...
- 二、Django快速安装
一.安装Python 作为一个Python Web框架,Django依赖Python.从Django适用于哪些版本的Python可以获取更多信息.较新版本的Python内置一个轻量级的数据库SQLit ...
- Wacom发布Cintiq Companion 2
全新的Cintiq Companion 2是一款强大的平板电脑,让创意专业人士获得最佳的屏幕笔触,让创意随时随地进行.用户还可以在家中或工作时连接到Mac或PC电脑获得无与伦比的灵活性! 2015年1 ...
- [redis] linux下安装篇(1)
一.redis是什么redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有 ...