计蒜客NOIP模拟赛4 D1T3 小X的佛光

小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水。

小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X 城时只建造 N – 1 条边,使得城市的各个地点能够相互到达。

小 X 计划蒸发 Q 天的学水,每一天会有一名学水从 A 地走到 B 地,并在沿途各个地点留下一个水塘。此后,小 X 会从 C 地走到 B 地,并用佛光蒸发沿途的水塘。由于 X 城是一个学佛横行的城市,学水留下的水塘即使没有被小 X 蒸发,也会在第二天之前被其他学佛蒸发殆尽。

现在,小 X 想要知道,他每一天能够蒸发多少水塘呢?

输入格式

第一行三个整数 N,Q,num,分别表示 X 城地点的个数,小 X 蒸发学水的天数,以及测试点编号。注意,测试点编号是为了让选手们更方便的获得部分分,你可能不需要用到这则信息,在下发的样例中,测试点编号的含义是该样例满足某一测试点限制。

接下来 N – 1 行,每行两个整数 X,Y,表示 X 地与 Y 地之间有一条边。

接下来 Q 行,每行三个整数 A,B,C,表示一天中,有一名学水从 A 地走到 B 地,而小 X 会从 C 地走到 B 地。

输出格式

输出 Q 行,每行一个整数,表示小 X 能够蒸发的水塘数。

数据规模与约定

特殊性质 1:第 i 条边连接第 i 和第 i+1 个地点。

特殊性质 2:A=C。

样例输入

3 3 1
1 2
2 3
1 2 3
1 1 3
3 1 3

样例输出

1
1
3A->B与B->C的共同路径长为(LAB+LBC-LAC)/2不过因为是点权,所以要+1直接倍增LCA就行了不过建树不能用dfs,会溢出,要用bfs()
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<queue>
 6 using namespace std;
 7 struct Node
 8 {
 9     int next,to;
10 }edge[400001];
11 int num,head[200001];
12 int n,q,dep[200001],fa[200001][20];
13 bool vis[200001];
14 void add(int u,int v)
15 {
16     num++;
17     edge[num].next=head[u];
18     head[u]=num;
19     edge[num].to=v;
20 }
21 void bfs()
22 {int i;
23  queue<int>Q;
24  memset(vis,0,sizeof(vis));
25   dep[1]=1;
26  Q.push(1);
27  vis[1]=1;
28   while (Q.empty()==0)
29   {
30       int u=Q.front();
31       Q.pop();
32       for (i=head[u];i;i=edge[i].next)
33       {
34           int v=edge[i].to;
35           if (vis[v]==0)
36           {
37               vis[v]=1;
38               dep[v]=dep[u]+1;
39               fa[v][0]=u;
40               Q.push(v);
41           }
42       }
43   }
44 }
45 int LCA(int x,int y)
46 {int i;
47     if (dep[x]<dep[y]) swap(x,y);
48     for (i=18;i>=0;i--)
49         if ((1<<i)<=dep[x]-dep[y]) x=fa[x][i];
50  if (x==y) return x;
51  while (x!=y)
52  {
53     for (i=18;i>=0;i--)
54         if (fa[x][i]!=fa[y][i])
55         {
56             x=fa[x][i];
57             y=fa[y][i];
58         }
59
60     if (x==y) return x;
61     x=fa[x][0];
62     y=fa[y][0];
63  }
64     return x;
65 }
66 int main()
67 {int x,y,i,a,b,c,j;
68     cin>>n>>q>>x;
69     for (i=1;i<=n-1;i++)
70     {
71         scanf("%d%d",&x,&y);
72         add(x,y);add(y,x);
73     }
74      bfs();
75  for (i=1;i<=n;i++)
76     {
77      for (j=1;j<=18;j++)
78          fa[i][j]=fa[fa[i][j-1]][j-1];
79     }
80     for (i=1;i<=q;i++)
81     {
82         scanf("%d%d%d",&a,&b,&c);
83         int l1=LCA(a,b),l2=LCA(b,c),l3=LCA(a,c);
84         int s1=dep[a]-dep[l1]+dep[b]-dep[l1];
85         int s2=dep[b]-dep[l2]+dep[c]-dep[l2];
86         int s3=dep[a]-dep[l3]+dep[c]-dep[l3];
87         printf("%d\n",(s1+s2-s3)/2+1);
88     }
89 }
时间: 2024-10-21 21:50:09

计蒜客NOIP模拟赛4 D1T3 小X的佛光的相关文章

计蒜客NOIP模拟赛(3)D1T3 任性的国王

X 国的地图可以被看作一个两行 nn 列的网格状图.现在 X 国需要修建铁路,然而该国的国王非常小气,他只想保证位于某两列之间的所有城市互相可以到达就行了,在此基础上,他希望所花费的代价最小. 铁路可以建在任何两个相邻的点之间,使他们可以互相到达.可以作为工作人员,你已经整理出了为每一对相邻城市架设铁路所需要的花费.你需要准备好回答国王如下形式的问题. 对于 (i,j)(i,j):当前情况下,使第 ii 列到第 jj 列之间的所有城市连通的最小代价是多少(列下标从 11 开始)?注意不能用其他列

计蒜客NOIP模拟赛4 D1T2小X的密室

小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条从房间 X 到房间 Y 的通道.另外,想要通过某个传送门,就必须具备一些种类的钥匙(每种钥匙都要有才能通过).幸运的是,钥匙在打开传送门的封印后,并不会消失. 然而,通过密室的传送门需要耗费大量的时间,因此,小 X 希望通过尽可能少的传送门到达出口,你能告诉小 X 这个数值吗? 另外,小 X 有可能

[计蒜客NOIP模拟赛]2017.7.28Day1回顾反思总结

D1T1 打地鼠 题目链接 反思- 比赛得分-0 思考: 比赛时,以为T1是一道常规模拟题目,没怎么看数据范围.直接手动模拟,模拟完之后太自信也没有造数据Hack自己的程序.直接导致爆0.同时发现自己对二维前缀和的学习也只是在皮毛之上,没有深入思考与理解. 解题思路- 将图像旋转45°之后用二维前缀和维护,每次O(1)查询,时间复杂度O(N*N). 但是目前觉得这个图像旋转45°难以理解,打算手动模拟加深理解. 标程 #include<bits/stdc++.h> using namespac

计蒜客NOIP模拟赛4 D2T1 鬼脚图

鬼脚图,又称画鬼脚,在日本称作阿弥陀签,是一种经典游戏,也是一种简易的决策方法,常常用来抽签或决定分配组合. 下图就是一张鬼脚图,其包含若干条竖线和若干条横线.请注意,横线只能水平连接相邻的两条竖线,且 在同一高度只会有一条横线. 在图的上方,我们将这 n 条竖线依次标号为 1 到 n.以数字 3 为例,它会沿着所在的竖线下降,期间如果 遇到横线就会移动到横线的另一端,最终降落至下面的第一条竖线.上图中还标出了另外几种数字的最终位置.奇特的是,开始时每条竖线上都有一个数字,而 最终每条竖线下还是

计蒜客NOIP模拟赛D2T3 数三角形

刚刚上高中的洁洁在学习组合数学的过程中遇到一道麻烦的题目,她希望你能帮助她解决.给定一张无向完全图 G,其中大部分边被染成蓝色,但也有一些边被染成红色或者绿色.现在,洁洁需要给这张图的多样性进行打分.一张图的多样性取决于它的同色和异色三角形的个数.具体来说,G 中每有一个三边颜色都互不同的三角形(异色三角形)可以得 3 分,每有一个三边颜色都相同的三角形(同色三角形)则要被扣掉 6 分,其它三角形不得分也不扣分. 现在,请你写一个程序来计算 G 的多样性分数.输入格式 第一行两个正整数 n 和

计蒜客NOIP模拟赛(3) D1T2 信息传递

一个数据包在一个无向网络中传递.在时刻0,该数据包将依照特定的概率随机抵达网络中的某个节点.网络可以看做一张完全带权无向图,包含N个节点,若t时刻数据包在节点i,则在t+1时刻,数据包被传递到节点j的概率是 d(i,j)/(∑kd(i,k))其中d(i,j)表示节点i到节点j的最短路径的长度.在传递到下一个节点后,该数据包会自动删除在当前节点的备份.现在,给定数据包0时刻在每个节点的概率和网络的每条边权.求T时刻数据包在每个节点的概率.输入格式第一行两个整数N和T.第二行N个实数,表示0时刻数据

计蒜客NOIP模拟赛4 D2T2 跑步爱天天

YOUSIKI 在 noip2016 的一道<天天爱跑步>的题爆零后,潜心研究树上问题,成为了一代大师,于是皮皮妖为了测验他,出了一道题,名曰<跑步爱天天>. 有一个以 1 为根的有根树,初始每个点都有个警卫,每个警卫会按深度优先的顺序周期性的巡逻以其初始点为根的子树(详见样例解释),一个时刻走且仅走一条边. YOUSIKI 初始在 x 点,他要到根结点拜访皮皮妖,他会沿着最短路径走,一个时刻走且仅走一条边,当他走到这个点时,如果遇到了警卫,他会消耗 1点妖气将这个警卫杀死,杀死后

复习---归并排序求逆序对--计蒜客2017noip模拟赛二--蒜头君的排序

题目链接:https://nanti.jisuanke.com/t/16443 我不会矩阵快速幂,所以只拿了60分, 发现归并排序掌握的并不熟练,借此良机复习一下. 重在归并排序分治思想,要牢记! #include<iostream> #include<cstring> using namespace std; int n,m,a[30005],s[30005],ans,d[30005]; void msort(int l,int r) { if(l==r)return;//如果只

计蒜课 八月模拟赛题解

看见机房有大佬上周写了上面的普及信心赛 于是我康了康 8月的提高组模拟赛 9月的还没开始qwq 真的 有点难 主要是我先打开了T2 我再次 对自己的数学产生了怀疑 我现在还是不会写T2 T1 又又又又都错题了 下次重建图 尽量写vector 都写 邻接表 变量差不多的容易搞混 我这个同学变又写错了 T1 :https://nanti.jisuanke.com/t/41086 题目大意就是 一个有向图 删一个点 把与他直接和间接 相连的点 删掉 然后 求删掉所有点的最小最大代价 : 为了避免这个环