xsy 2414【CF587C】Duff in the Army
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
#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的更多相关文章
- 【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|, ...
- 【CF587D】Duff in Mafia 二分+前缀优化建图+2-SAT
[CF587D]Duff in Mafia 题意:给你一张n个点m条边的无向图,边有颜色和边权.你要从中删去一些边,满足: 1.任意两条删掉的边没有公共的顶点.2.任意两条剩余的.颜色相同的边没有公共 ...
- xsy 2018 【NOIP2013】货车运输
[NOIP2013]货车运输 Description A 国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有q辆货车在运输货物,司机们想知道每辆车在不超 ...
- 【转】Duff's Device
在看strcpy.memcpy等的实现发现用了内存对齐,每一个word拷贝一次的办法大大提高了实现效率,参加该blog(http://totoxian.iteye.com/blog/1220273). ...
- BSOJ 2414 -- 【JSOI2011】分特产
Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望 ...
- xsy 2412【BZOJ4569】【Scoi2016】萌萌哒
Description Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四个数,l1,r1,l2, ...
- 【Henu ACM Round#14 C】Duff and Weight Lifting
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 2^y可以由两个2^(y-1)相加得到. 则有一个贪心的策略. 就是2^x尽量都变成2^(x+1) (即能够凑就尽量凑) 如果x还有 ...
- 【Henu ACM Round#14 B】Duff in Love
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 让你在n的因子里面找一个最大的数字x 且x的因子全都不是完全平方数(y^2,y>1) O(sqrt(n))找出n的所有因子. ...
- 【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 ...
随机推荐
- Nginx+Tomcat多实例及负载均衡配置
Nginx+Tomcat多实例及负载均衡配置 采用nginx的反向代理负载均衡功能,配合后端的tomcat多实例来实现tomcat WEB服务的负载均衡 01 安装nginx服务 安装所需的pcre库 ...
- linux设置定时任务的方法步骤
一,首先登录 二,找到文件夹 三,查看定时任务 crontab -l 四,vi root 编辑定时任务 编辑完成后,点ESC,然后:wq 时间格式 分钟 小时 日期 月份 周 命令 数字范围 0-59 ...
- Image.FromFile 之后无法删除这个文件
Image.FromFile 之后无法删除这个文件 pictrue图片是从文件加载的,现在想换张图片,更改之前要删除原有的文件,在删除原有的文件出现了异常 string path = @" ...
- CORS & CSP笔记
1.CORS & CSP 浏览器跨域相关的安全策略主要存在于两个方面: 浏览器是否发送ajax 浏览器是否加载返回数据 假设从a.com 向b.com发送ajax请求.此时浏览器当前页面为a. ...
- Android Mboot mmc命令介绍
mmc command. 目前Mboot支持以下mmc命令: 1) mmc read/write. 读写命令.Addr = 内存地址, blk# = 起始block数, size ...
- 方法重载与invokevirtual字节码指令的关系
1.方法重载 创建MyTest5类 public class MyTest5 { public void test(Grandpa grandpa){ System.out.println(" ...
- JVM 修改类加载器启动类加载器
1.类加载器加载路径 public class MyTest18 { public static void main(String[] args) { //系统类加载器加载路径 System.out. ...
- 官方Android Camera2 录像示例--停止录像时崩溃修正
官方Android 使用Camera2示例项目地址:https://github.com/android/camera-samples 视频录像示例:https://github.com/androi ...
- Delphi 操作SQL 插入一万条数据 三种方式速度测试
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- source insight 使用配置(私人)
1.输入两个空格,两个空格全消失,前后的字粘在一起显示,不想这样,就取消下图的勾.