Description

【题目描述】:

最近有一场战争发生,Duff是战争里一名士兵,Malek是她的长官。

他们的国家——Andarz Gu有n个城市(编号为1到n),总共有n-1条道路,每条道路连接着不同的两个城市,保证两两城市间必定可以通过道路到达。

Andarz Gu总共有m个人,每个人分别对应着编号1到m,对于第i个人,我们可以知道他还有一个编号ci,表示这个编号为i的人住在编号为ci的城市。注意一个城市里可能有不止一个人,也可能没有人住在这个城市。

Malek喜欢下达指令,这也是她要问DuffQ(Q个问题,不是DuffQ 个问题)个问题的原因。每一个询问包含三个数u,v,a,Malek要问你的问题就是u到v最短的那条路径上前a小的人的编号分别是什么,如果路径上的人小于a个,就有多少个就输出多少个,如果一个也没有,直接输出0。

但是Duff现在十分的忙,所以她来向你寻求帮助,请你帮助她回答这q个询问。

【输入描述】:

第一行输入n,m,q(1<=n,m,q<=10^5)

接下来n-1行,一行输入两个数v和u,表示城市v和城市u之间有一条双向道路。

再接下来一行输入m个数,对于ci表示编号为i的人居住的城市。(1<=ci<=n)

再再接下来q行,每行三个数u,v,a表示一组询问(1<=v,u<=n;1<=a<=10)

【输出描述】:

对于每组询问,输出它要的答案。

【样例输入】:

5 4 5
1 3
1 2
1 4
4 5
2 1 4 3
4 5 6
1 5 2
5 5 10
2 3 3
5 3 1

【样例输出】:

1 3
2 2 3
0
3 1 2 4
1 2

 
题解思路
由于a<=10,所以只需要在LCA中维护路径中编号最小的十个人即可。
然后就是一个裸的LCA板子了
时间复杂度O(nlogn)
#include<iostream>
#include<cstdio>
using namespace std;
struct data{
int x,y;
}t[200001];
struct node{
int p[11],cnt,fa;
}f[100001][21],ans;
int n,m,q,x,y,c,k[100001],d[100001],h[100001],fa;
void add(int a,int b,int id){
t[id].x=b;
t[id].y=h[a];
h[a]=id;
}
node ins(node a,node b){
node g;
int l=1,r=1;
g.cnt=0;
g.fa=b.fa;
while(l<=a.cnt||r<=b.cnt){
if(g.cnt==10)break;
if(l>a.cnt){
g.cnt++;
g.p[g.cnt]=b.p[r];
r++;
}else if(r>b.cnt){
g.cnt++;
g.p[g.cnt]=a.p[l];
l++;
}else if(a.p[l]<b.p[r]){
g.cnt++;
g.p[g.cnt]=a.p[l];
l++;
}else{
g.cnt++;
g.p[g.cnt]=b.p[r];
r++;
}
}
return g;
}
void dfs(int a){
for(int i=1;i<=20;i++)f[a][i]=ins(f[a][i-1],f[f[a][i-1].fa][i-1]);
for(int i=h[a];i;i=t[i].y){
if(!d[t[i].x]){
d[t[i].x]=d[a]+1;
f[t[i].x][0].fa=a;
dfs(t[i].x);
}
}
}
void lca(int a,int b){
if(d[a]>d[b]){
for(int i=20;i>=0;i--){
if(d[f[a][i].fa]>=d[b]){
ans=ins(ans,f[a][i]);
a=f[a][i].fa;
}
}
}
if(d[a]<d[b]){
for(int i=20;i>=0;i--){
if(d[f[b][i].fa]>=d[a]){
ans=ins(ans,f[b][i]);
b=f[b][i].fa;
}
}
}
for(int i=20;i>=0;i--){
if(f[b][i].fa!=f[a][i].fa){
ans=ins(ans,f[b][i]);
ans=ins(ans,f[a][i]);
b=f[b][i].fa;
a=f[a][i].fa;
}
}
if(a!=b){
ans=ins(ans,f[b][0]);
ans=ins(ans,f[a][0]);
a=f[a][0].fa;
}
ans=ins(ans,f[a][0]);
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
add(x,y,i*2);
add(y,x,i*2+1);
}
for(int i=1;i<=m;i++){
scanf("%d",&x);
if(f[x][0].cnt<10){
f[x][0].cnt++;
f[x][0].p[f[x][0].cnt]=i;
}
}
d[1]=1;
dfs(1);
for(int i=1;i<=q;i++){
scanf("%d%d%d",&x,&y,&c);
ans.cnt=0;
lca(x,y);
ans.cnt=min(ans.cnt,c);
printf("%d ",ans.cnt);
for(int j=1;j<=ans.cnt;j++)printf("%d ",ans.p[j]);
printf("\n");
}
}

  

xsy 2414【CF587C】Duff in the Army的更多相关文章

  1. 【CF587F】Duff is Mad AC自动机+分块

    [CF587F]Duff is Mad 题意:给出n个串$s_1,s_2..s_n$,有q组询问,每次给出l,r,k,问你编号在[l,r]中的所有串在$s_k$中出现了多少次. $\sum|s_i|, ...

  2. 【CF587D】Duff in Mafia 二分+前缀优化建图+2-SAT

    [CF587D]Duff in Mafia 题意:给你一张n个点m条边的无向图,边有颜色和边权.你要从中删去一些边,满足: 1.任意两条删掉的边没有公共的顶点.2.任意两条剩余的.颜色相同的边没有公共 ...

  3. xsy 2018 【NOIP2013】货车运输

    [NOIP2013]货车运输 Description A 国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有q辆货车在运输货物,司机们想知道每辆车在不超 ...

  4. 【转】Duff's Device

    在看strcpy.memcpy等的实现发现用了内存对齐,每一个word拷贝一次的办法大大提高了实现效率,参加该blog(http://totoxian.iteye.com/blog/1220273). ...

  5. BSOJ 2414 -- 【JSOI2011】分特产

    Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望 ...

  6. xsy 2412【BZOJ4569】【Scoi2016】萌萌哒

    Description Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四个数,l1,r1,l2, ...

  7. 【Henu ACM Round#14 C】Duff and Weight Lifting

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 2^y可以由两个2^(y-1)相加得到. 则有一个贪心的策略. 就是2^x尽量都变成2^(x+1) (即能够凑就尽量凑) 如果x还有 ...

  8. 【Henu ACM Round#14 B】Duff in Love

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 让你在n的因子里面找一个最大的数字x 且x的因子全都不是完全平方数(y^2,y>1) O(sqrt(n))找出n的所有因子. ...

  9. 【LCA】CodeForce #326 Div.2 E:Duff in the Army

    C. Duff in the Army Recently Duff has been a soldier in the army. Malek is her commander. Their coun ...

随机推荐

  1. Linux文件与文件夹的权限问题

    0x01 修改文件可读写属性的方法 例如:把index.htm 文件修改为可写可读可执行: chmod 777 index.htm 要修改目录下所有文件属性可写可读可执行: chmod 777 *.* ...

  2. css自定义属性和简单效果

    简介 CSS Variables,一个并不是那么新的东西,但对css来说绝对是一场革命. 之前使用变量的时候,需要借助sass.less等预处理工具来实现,现在我们可以直接使用css来声明变量. 兼容 ...

  3. spark-shell启动错误

    18/06/24 16:41:40 ERROR spark.SparkContext: Error initializing SparkContext.java.net.BindException: ...

  4. 在Ubuntu 18.04 下安装mysql,没有初始密码,重设root密码

    在Ubuntu 18.04 下安装mysql 不知道是由于mysql更新为新版还是.Ubuntu18.04中的特性,安装过程中没有设置密码的环节,在网络上找了半天,总算解决了!特此记录下来,以便以后查 ...

  5. Qt 操作QDomDocument对象修改节点

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/liulihuo_gyh/article/d ...

  6. Mac OS -bash: psql: command not found 使用 psql 命令报错

    使用 psql 在 mac os 系统上登录,系统显示没有 psql 这个命令存在 解决方法如下: 将 postgresql 的 bin 目录添加到环境变量中即可 export PATH=" ...

  7. jmeter中特殊的时间处理方式

    需求: 1.获取当前时间的年月日时分秒毫秒 2.生成上一个月的随机某天的一个时间 3.生成一个年月日时分秒毫秒的一个时间戳 1.__time : 获取时间戳.格式化时间 ${__time(yyyy-M ...

  8. osg编译日志-release

    1>------ 已启动生成: 项目: ZERO_CHECK, 配置: Release x64 ------1> Checking Build System1> CMake does ...

  9. Spring cloud微服务安全实战-3-7API安全机制之数据加密

    这一节来聊一下密码的加密. 加密盐,为了避免两个相同的面加密出来的密文是一样的,每个人的盐不一样, 首先引入工具包,lambdaworks <!-- https://mvnrepository. ...

  10. CNN中计算量FLOPs的计算

    1.FLOPs的概念:全称是floating point operations per second,意指每秒浮点运算次数,即用来衡量硬件的计算性能:在CNN中用来指浮点运算次数: 2.计算过程: 如 ...