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 ...
随机推荐
- 体验了把做HR的感觉,上午看了40份简历,说说感受
原文链接:http://huachichi.info/2013/06/26/experience-of-being-a-hr/ 这两天准备从IBM离职,不要问我为什么要在这么bug的时间离职,总之 ...
- Android 混淆代码总结
为了防止自己的劳动成果被别人窃取,混淆代码能有效防止被反编译,下面来总结以下混淆代码的步骤: 1. 大家也许都注意到新建一个工程会看到项目下边有这样proguard-project.txt一个文件,这 ...
- Python读取键盘输入
Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘.例如以下: raw_input input raw_input函数 raw_input() 函数从标准输入读取一个行.并返回 ...
- NOIP2007:纪念品分组
#include<stdio.h> #include<stdlib.h> int a[100]; int main(){ int i,j,k,m,n,w; scanf(&quo ...
- chrome 浏览器设置字体大小,方便调试
H5开发的时候,有时候明明字体没有那么大,但在chrome中看上去依然很大.就像型号不对一样,但在手机端是正常的. 这是因为chrome浏览器设置了默认字体.只需要设置一下即可. 「chrome:/ ...
- unity, 在surface shader中访问顶点色
//ref: Custom data computed per-vertex: http://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html ...
- Html Agility Pack/SgmlReader 解析html
Html Agility Pack/SgmlReader 解析html HtmlDocument htmlDoc = new HtmlDocument(); //输出成xml格式 htmlDoc.Op ...
- 495. Implement Stack【easy】
Implement a stack. You can use any data structure inside a stack except stack itself to implement it ...
- [JNA系列]Java调用Delphi编写的Dll之Delphi与JAVA基本数据类型对比
Delphi与JAVA基本数据类型对比 类型 Delphi关键字 JAVA关键字 字节 备注 范围 整型 Shortint byte 1 有符号8位 -128..127 Byte 1 无符号8位 0 ...
- love2d教程33--window模块
--love的window模块比较简单,直接贴代码了function love.load() io.stdout:setvbuf("no") -- 设置io为无缓存模式 --获取显 ...