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 ...
随机推荐
- 利用Git上传项目到github以及遇到的问题
今天学习如何利用git从本地端上传项目,以及遇到问题的解决方法 1.要有自己的github账号,并创建一个仓库, 2.输入仓库的名称,直接Create 注:记住常见成功后的这个地址,后边要用到: 3. ...
- Shell登陆远程服务器
现场服务器较多,密码3个月过期,在到期时需更改密码. 使用expect编写,尝试登陆2次后退出(防止密码错误时账号锁定),超时重试一次. shell脚本调用并定时执行,登陆成功后执行一条命令,如:ho ...
- 解决无法将java项目部署到tomcat中去
project facets java转成web项目 用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个Java工程,将无法在Tomcat中进行部署运行. 方法: 1. ...
- python自动化登录获取图片登录验证码
主要记录一下:图片验证码1.获取登录界面的图片2.获取验证码位置3.在登录页面截取验证码保存4.调用百度api识别(目前准确率较高的识别图片api)本次登录的系统页面,可以看到图片验证码的位置登录页面 ...
- Linux服务器下日志截取
我们经常需要去Linux服务器上查看服务运行日志,但是有时候日志文件很大看起来很不方便,这个时候我们需要对日志进行切割筛选出自己需要的日志,比如查看某段时间内的日志,命令如下: sed -n '/ ...
- docker 安装redis 并配置外网可以访问
1, docker 拉去最新版本的redis docker pull redis #后面可以带上tag号, 默认拉取最新版本 2, docker安装redis container 安装之前去定义我们的 ...
- linux内核中的电源管理接口
1. pm_runtime_enable/pm_runtime_disable 使能/禁止runtime PM,分别对dev->power.disable_depth执行++和--操作,这个变量 ...
- Python3基础 str ljust-rjust-center 左、右对齐 居中
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- IMDB-WIKI – 500k+ face images with age and gender labels论文学习
DEX: Deep EXpectation of apparent age from a single image 这个论文我们使用深度学习解决了在静态人脸图像中面部年龄的估计.我们的卷积神经网络使用 ...
- QML随机颜色
color=Qt.rgba(Math.random(),Math.random(),Math.random(),1)