bzoj 1832: [AHOI2008]聚会

良心题2333

三个点两两求一遍就行,最小肯定是在某2个点的lca处,(肯定让第三个人去找2个人,不能让2个人一起去找第三个人233)

 1 #include<bits/stdc++.h>
 2 #define N 500005
 3 #define M 10000005
 4 #define LL long long
 5 #define inf 0x3f3f3f3f
 6 using namespace std;
 7 inline int ra()
 8 {
 9     int x=0,f=1; char ch=getchar();
10     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
11     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
12     return x*f;
13 }
14 struct node{
15     int to,next;
16 }e[N<<1];
17 int head[N],cnt;
18 int fa[N][20],deep[N],n,m;
19 void insert(int x, int y){e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;}
20 void dfs(int x)
21 {
22     for (int i=1; i<=19; i++)
23         if (deep[x]>=(1<<i))
24             fa[x][i]=fa[fa[x][i-1]][i-1];
25         else break;
26     for (int i=head[x];i;i=e[i].next)
27     {
28         if (e[i].to==fa[x][0]) continue;
29         fa[e[i].to][0]=x;
30         deep[e[i].to]=deep[x]+1;
31         dfs(e[i].to);
32     }
33 }
34 int lca(int x, int y)
35 {
36     if (deep[x]<deep[y]) swap(x,y);
37     int t=deep[x]-deep[y];
38     for (int i=0; (1<<i)<=t ; i++)
39         if (t&(1<<i)) x=fa[x][i];
40     for (int i=19; i>=0; i--)
41         if (fa[x][i]!=fa[y][i])
42             x=fa[x][i],y=fa[y][i];
43     if (x==y) return x;
44     return fa[x][0];  
45 }
46 int lca_cost(int x, int y)
47 {
48     int sum=0;
49     if (deep[x]<deep[y]) swap(x,y);
50     int t=deep[x]-deep[y];
51     for (int i=0; (1<<i)<=t ; i++)
52         if (t&(1<<i)) x=fa[x][i],sum+=(1<<i);
53     for (int i=19; i>=0; i--)
54         if (fa[x][i]!=fa[y][i])
55             x=fa[x][i],y=fa[y][i],sum+=(1<<i)*2;
56     if (x==y) return sum;
57     return sum+2;  
58 }
59 int main()
60 {
61     n=ra(); m=ra();
62     for (int i=1; i<n; i++)
63     {
64         int x=ra(),y=ra();
65         insert(x,y); insert(y,x);
66     }
67     dfs(1);
68     for (int i=1; i<=m; i++)
69     {
70         int x=ra(),y=ra(),z=ra();
71         int ans1=lca_cost(x,y)+lca_cost(lca(x,y),z);
72         int ans2=lca_cost(x,z)+lca_cost(lca(x,z),y);
73         int ans3=lca_cost(y,z)+lca_cost(lca(y,z),x);
74         int ans=min(min(ans1,ans2),ans3);
75         if (ans==ans1) printf("%d ",lca(x,y));
76         else if (ans==ans2) printf("%d ",lca(x,z));
77         else if (ans==ans3) printf("%d ",lca(y,z));
78         printf("%d\n",ans);
79     }
80 }

 

转载于:https://www.cnblogs.com/ccd2333/p/6435291.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值