BZOJ 1787 Ahoi2008 Meet紧急集合

1787: [Ahoi2008]Meet 紧急集合

Time Limit: 20 Sec  Memory Limit: 162 MB
Submit: 3590  Solved: 1642
[Submit][Status][Discuss]

Description

Input

Output

Sample Input

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

Sample Output


5 2
2 5
4 1
6 0

HINT

Source

设自己在x点,小可可在y点,小可可的朋友在z点,那么设xy为x和y的lca,xz为x和z的lca,yz为y和z的lca

那么汇聚点要么在xy要么在yz要么在xz

三个进行比较即可

代码如下

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 inline int read()
  4 {
  5  int x=0;int f=1;char ch=getchar();
  6  while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
  7  while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
  8  return x*f;
  9 }
 10 const int MAXN=1e6+10;
 11 int fa[MAXN][25],linkk[MAXN*2],depth[MAXN],len,n,m;
 12 struct node
 13 {
 14  int y,next;
 15 }e[MAXN*2];
 16 inline void insert(int xx,int yy)
 17 {
 18  e[++len].y=yy;e[len].next=linkk[xx];linkk[xx]=len;
 19 }
 20 void dfs(int father,int st,int dep)
 21 {
 22  fa[st][0]=father;depth[st]=dep;
 23  for(int i=linkk[st];i;i=e[i].next)
 24  {
 25   if(e[i].y!=father) dfs(st,e[i].y,dep+1);
 26  }
 27 }
 28 void getfather()
 29 {
 30   for(int i=1;i<=20;i++)
 31   {
 32    for(int j=1;j<=n;j++)
 33    {
 34     if(fa[j][i-1]!=0) fa[j][i]=fa[fa[j][i-1]][i-1];
 35    }
 36   }
 37 }
 38 int LCA(int x,int y)
 39 {
 40  if(x==y) return x;
 41  if(depth[x]<depth[y]) swap(x,y);
 42  for(int i=20;i>=0;i--)
 43  {
 44   if(depth[x]-(1<<i)>=depth[y]) x=fa[x][i];
 45  }
 46  if(x==y) return x;
 47  for(int i=20;i>=0;i--)
 48  {
 49   if(fa[x][i]!=fa[y][i]) {x=fa[x][i];y=fa[y][i];}
 50  }
 51  return fa[x][0];
 52 }
 53 void find()
 54 {
 55  int xx=read();int yy=read();int zz=read();
 56  int xy=LCA(xx,yy);int xz=LCA(xx,zz);int yz=LCA(yy,zz);
 57  //cout<<xy<<' '<<xz<<' '<<yz<<endl;
 58  int ans1;int ans2=10000000;
 59  int xyz=LCA(xy,zz);
 60  if(depth[xx]+depth[yy]-depth[xy]-depth[xyz]*2+depth[zz]<ans2)
 61  {
 62   ans2=depth[xx]+depth[yy]-depth[xy]-depth[xyz]*2+depth[zz];
 63   ans1=xy;
 64  }
 65  xyz=LCA(xz,yy);
 66  if(depth[xx]+depth[zz]-depth[xz]-depth[xyz]*2+depth[yy]<ans2)
 67  {
 68   ans2=depth[xx]+depth[zz]-depth[xz]-depth[xyz]*2+depth[yy];
 69   ans1=xz;
 70  }
 71  xyz=LCA(yz,xx);
 72  if(depth[yy]+depth[zz]-depth[yz]-depth[xyz]*2+depth[xx]<ans2)
 73  {
 74   ans2=depth[yy]+depth[zz]-depth[yz]-depth[xyz]*2+depth[xx];
 75   ans1=yz;
 76  }
 77  printf("%d %d\n",ans1,ans2);
 78 }
 79 void init()
 80 {
 81  n=read();m=read();
 82  len=0;
 83  for(int i=1;i<n;i++)
 84  {
 85   int xx=read();
 86   int yy=read();
 87   insert(xx,yy);
 88   insert(yy,xx);
 89  }
 90  dfs(0,1,1);
 91  getfather();
 92  for(int i=1;i<=m;i++)
 93  {
 94   find();
 95  }
 96 }
 97 int main()
 98 {
 99  init();
100  return 0;
101 }

转载于:https://www.cnblogs.com/something-for-nothing/p/7787650.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值