JZOJ.5257【NOIP2017模拟8.11】小X的佛光
Description
Input
Output
Sample Input
3 3 1
1 2
2 3
1 2 3
1 1 3
3 1 3
Sample Output
1
1
3
Data Constraint
题目就是要求两点到一个点的路径中重叠的点的个数。
特殊性质一是一条链,我们可以通过讨论两个起点和一个终点的相对位置直接得出答案。
特殊性质二的两个起点相同,就是要我们求树上两点之间的点的个数,求出两点LCA,预处理点到根节点的距离,再根据LCA是不是根节点决定距离相减或相加就可以了。
考虑100分的,仍然要LCA,然后分类讨论就可以了......
我们记num[i]为i到根节点的点的个数(包括根节点和它自己)
第一种是LCAab和LCAcb相等,那么我们求LCAac,答案就是num[LCAac]+num[B]-num[LCAab]+1。(这里的一个点到根节点的个数包括根节点和它本身。)
第二种是LCAab和LCAcb不相等,如果LCAab和LCAcb中有一个是B的,那么答案就是1,如果都不是B,那么我们再求LCALCAab LCAcb,这个时候它们的LCA必是其中的一个(可用反证法证明),如果是LCAab,那么答案就是num[B]-num[LCAcb]+1,否则就是LCAcb,答案为num[B]-num[LCAab]+1。
LCA用树上倍增或者欧拉迹+ST就可以啦(欧拉迹数组似乎要开很大QAQRE好久)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define N 600001
using namespace std;
int n,m,p,t,ans,head[N*],next[N*],to[N*],visit[N],deep[N*],ji[N*],num,ti,ge[N],f[N][],qwq[N][];
void add(int u,int v){
num++;
next[num]=head[u];
to[num]=v;
head[u]=num;
num++;
next[num]=head[v];
to[num]=u;
head[v]=num;
}
void dfs(int x,int nu,int d){
if (!visit[x]) visit[x]=++ti;
ji[ti]=x;
deep[ti]=d;
ge[x]=nu;
for (int i=head[x],v;i!=;i=next[i]){
v=to[i];
if (!visit[v]) {
dfs(v,nu+,d+);
ji[++ti]=x;
deep[ti]=d;
}
}
}
void ST(){
int tmp=(int)(log(ti)/log());
for (int i=;i<=ti;i++){
f[i][]=deep[i];
qwq[i][]=ji[i];
}
for (int j=;j<=tmp;j++)
for (int i=;i<=ti;i++){
int k=<<(j-);
if (i-k<=ti)
if (f[i][j-]<f[i+k][j-]){
f[i][j]=f[i][j-];
qwq[i][j]=qwq[i][j-];
}
else{
f[i][j]=f[i+k][j-];
qwq[i][j]=qwq[i+k][j-];
}
}
}
int lca(int x,int y){
int a=min(visit[x],visit[y]);
int b=max(visit[y],visit[x]);
int tmp=(int)(log((b-a)+)/log());
if (f[a][tmp]<f[b-(<<(tmp))+][tmp])
return qwq[a][tmp];
else return qwq[b-(<<(tmp))+][tmp];
}
void work(int a,int b,int c){
int d=,e=;
d=lca(a,b);
e=lca(b,c);
if (d==e){
int x=lca(a,c);
printf("%d\n",ge[x]+ge[b]-*ge[d]+);
}
else if ((d==b)||(e==b)) printf("1\n");
else {
int x=lca(d,e);
if (x==d) printf("%d\n",ge[b]-ge[e]+);
else if (x==e) printf("%d\n",ge[b]-ge[d]+);
}
}
int main(){
scanf("%d%d%d",&n,&m,&p);
for (int i=,u,v;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v);
}
dfs(,,);
ST();
for (int i=,u,v,w;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
work(u,v,w);
}
return ;
}
神奇的代码
(似乎JZ评测集下会爆栈...根节点设为n/2也可以)(明明20万数据莫名60万才过了QAQ)
还有一个水水的程序(输入数据还好良心,告诉你性质)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define N 500001
using namespace std;
int n,m,p,t,ans,head[N*],next[N*],to[N*],visit[N],deep[N*],ji[N*],num,ti,ge[N],f[N][],qwq[N][];
void add(int u,int v){
num++;
next[num]=head[u];
to[num]=v;
head[u]=num;
num++;
next[num]=head[v];
to[num]=u;
head[v]=num;
}
void shui1(){
for (int i=,u,v,w;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
if ((v>=u)&&(v>=w)) printf("%d\n",v-max(u,w)+);
else if (((v>=u)&&(v<=w))||(v<=u)&&v>=w) printf("1\n");
else if ((v<=u)&&(v<=w)) printf("%d\n",min(u,w)-v+);
}
}
void dfs(int x,int nu,int d){
if (!visit[x]) visit[x]=++ti;
ji[ti]=x;
deep[ti]=d;
ge[x]=nu;
for (int i=head[x],v;i!=;i=next[i]){
v=to[i];
if (!visit[v]) {
dfs(v,nu+,d+);
ji[++ti]=x;
deep[ti]=d;
}
}
}
void ST(){
int tmp=(int)(log(ti)/log());
for (int i=;i<=ti;i++){
f[i][]=deep[i];
qwq[i][]=ji[i];
}
for (int j=;j<=tmp;j++)
for (int i=;i<=ti;i++){
int k=<<(j-);
if (i-k<=ti)
if (f[i][j-]<f[i+k][j-]){
f[i][j]=f[i][j-];
qwq[i][j]=qwq[i][j-];
}
else{
f[i][j]=f[i+k][j-];
qwq[i][j]=qwq[i+k][j-];
}
}
}
int lca(int x,int y){
int a=min(visit[x],visit[y]);
int b=max(visit[y],visit[x]);
int tmp=(int)(log((b-a)+)/log());
if (f[a][tmp]<f[b-(<<(tmp))+][tmp])
return qwq[a][tmp];
else return qwq[b-(<<(tmp))+][tmp];
}
void shui2(){
for (int i=,u,v,w,x;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
x=lca(u,v);
if (x==) printf("%d\n",ge[u]+ge[v]-);
else printf("%d\n",ge[u]+ge[v]-*ge[x]+);
}
}
void work(int a,int b,int c){
int d=,e=;
d=lca(a,b);
e=lca(b,c);
if (d==e){
int x=lca(a,c);
printf("%d\n",ge[x]+ge[b]-*ge[d]+);
}
else if ((d==b)||(e==b)) printf("1\n");
else {
int x=lca(d,e);
if (x==d) printf("%d\n",ge[b]-ge[e]+);
else if (x==e) printf("%d\n",ge[b]-ge[d]+);
}
}
int main(){
scanf("%d%d%d",&n,&m,&p);
for (int i=,u,v;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v);
}
if ((p==)||(p==)||(p==)||(p==)||(p==)){
shui1(); return ;
}
ti=;
dfs(,,);
ST();
if ((p==)||(p==)||(p==)){
shui2(); return ;
}
for (int i=,u,v,w;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
work(u,v,w);
}
return ;
}
水水程序
JZOJ.5257【NOIP2017模拟8.11】小X的佛光的更多相关文章
- JZOJ.5258【NOIP2017模拟8.11】友好数对
Description
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
- 常州模拟赛d2t3 小X的佛光
平日里最喜欢做的事就是蒸发学水.[题目描述]小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X 城时只建造 N ...
- JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)
5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ...
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- JZOJ 5257. 小X的佛光 (Standard IO)
5257. 小X的佛光 (Standard IO) Time Limits: 2000 ms Memory Limits: 524288 KB Description Input Output Sam ...
- JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列
5235. [NOIP2017模拟8.7A组]好的排列 (File IO): input:permutation.in output:permutation.out Time Limits: 1000 ...
- JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计
5230. [NOIP2017模拟A组模拟8.5]队伍统计 (File IO): input:count.in output:count.out Time Limits: 1500 ms Memory ...
随机推荐
- win7配置两个tomcat(8 & 7)
背景如下: 电脑中原先tomcat版本是tomcat8,现在要再在其中另配置一个tomcat7,原先tomcat8的配的端口是8089 步骤如下: 1.官网下载tomcat7压缩包解压 2.修改D:\ ...
- js调用打印机 打印整体或部分
有时前端的项目中需要添加打印的功能,首先要知道打印分为整体打印和局部打印两种,而局部打印又可细分为局部打印指定的部分,和局部打印指定部分之外的部分.实例比文字看起来更清晰,下面我将用代码来描述 1.整 ...
- VMware Workstation 8正式版下载+密钥序列号
http://www.cnblogs.com/balaamwe/archive/2011/12/13/2285972.html摘要: 支持Win8安装,虚拟机VMware Workstation 8正 ...
- 两种方法一句代码隐藏Activity的标题栏
把Activity的标题栏隐藏有两种方法.一种是在在Activity里面设置javacode.还有一种是在项目的清单文件AndroidManifest.xml中设置模版样式. 一.在Activity中 ...
- Lintcode---线段树查询(区间最大值)
对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max,值为该节点所代表的数组区间start到end内的最大值. 为SegmentTree设计 ...
- CodeSmith单表生成实体模板与生成多表实体模板
生成单实体模板: <%@ Template Language="C#" TargetLanguage="C#" %> <%@ Assembly ...
- 怎样优化UITableView的性能
在iOS App中,UITableView应该是使用率最高的.同一时候也是最为复杂的视图. 差点儿全部自带的应用中都能看到它的身影,可见它的重要性. 在使用UITableView时,会常常遇到性能上的 ...
- Atitit. http 代理原理 atiHttpProxy 大木马
Atitit. http 代理原理 atiHttpProxy 大木马 1. 面这张图可以清晰地阐明HttpProxy的实现原理:1 2. 代理服务器用途1 3. 其中流程具体如下:2 4. 设计规 ...
- 新型I/O架构引领存储之变(二)
新型I/O架构引领存储之变(二) 作者:廖恒 众所周知,支持存储及网络I/O服务的接口协议有很多种.比方,以太网及Infiniband接口都支持採用iSCSI协议来实现存储业务,它们也因而成为了ser ...
- Javascript网页截屏的方法
最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...