UVALIVE 3486 Cells

本文介绍了一种使用栈和深度优先搜索(DFS)算法来判断二叉树中节点间祖先关系的方法。通过预处理节点的入栈和出栈顺序,可以高效地判断任意两个节点之间的祖先关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过入栈出栈顺序判断祖先关系

这里UVALIVE还

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <climits>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
#define MAXN 20000010
int pre[MAXN],post[MAXN];
int start[300005],c[300005];
int N;
void dfs(int root)
{
        stack<int>s;
        s.push(root);
        pre[root] = 0;
        int dfs_clock = 0;
        while (!s.empty())
        {
                int x = s.top();
                if (pre[x])
                {
                        post[x] = ++dfs_clock;
                        s.pop();
                        continue;
                }
                pre[x] = ++dfs_clock;
                for (int i =start[x]; i < start[x] + c[x] ; i++)
                {
                        if (i < N)
                        {
                                pre[i] = 0 ;
                                s.push(i);
                        }
                        else
                        {
                                pre[i] = ++dfs_clock;
                                post[i] = ++dfs_clock;
                        }
                }
        }
}
int main()
{
        int T ,kase = 1;
        scanf("%d",&T);
        while (T--)
        {
                printf("Case %d:\n",kase++);
                scanf("%d",&N);
                start[0] = 1;
                for (int i = 0; i < N; i++)
                {
                        scanf("%d",&c[i]);
                        if (i)
                                start[i] = start[i - 1] + c[i - 1];
                }
                dfs(0);
                int m;
                scanf("%d",&m);
                while (m--)
                {
                        int u,v;
                        scanf("%d%d",&u,&v);
                        if(pre[u] < pre[v] && post[u] > post[v]) puts("Yes");
                        else puts("No");
                }
                if (T) putchar('\n');
        }
}

 

是不行,ZOJ过了。

转载于:https://www.cnblogs.com/Commence/p/4048012.html

内容概要:本文详细介绍了基于C++后端和微信小程序前端的校园二手商城的设计与实现。项目旨在提升校园二手交易效率,保障交易安全,促进绿色环保,降低学生生活成本,丰富校园文化生活,支持校园创新创业发展。系统采用C++语言构建高性能后端服务,结合微信小程序实现便捷的前端交互。项目涵盖了用户注册与登录、商品管理、订单处理、用户评价与信用体系、搜索与智能推荐、用户个人中心、消息通知与客服、数据统计与后台管理、安全认证与权限控制、支付结算等多个核心功能模块。此外,系统设计了多维度信用评价体系、智能推荐算法、全程线上化交易流程、全面的安全防护机制以及模块化架构,确保系统的高效、稳定和安全。 适用人群:适用于高校师生,特别是有二手物品交易需求的学生群体,以及对电子商务平台开发感兴趣的计算机专业学生和开发者。 使用场景及目标:① 提升校园二手交易效率,减少信息获取成本;② 构建安全可信的交易环境,保障用户权益;③ 促进校园内闲置物品的循环利用,践行绿色环保理念;④ 降低学生生活成本,提供价格合理、质量可控的二手商品;⑤ 丰富校园文化生活,增强师生间的交流与互助;⑥ 支持校园创新创业,为学生提供实践平台;⑦ 提供便捷的在线支付和评价功能,优化用户体验。 阅读建议:读者应关注项目的技术实现细节,特别是C++后端服务的高效性能设计和微信小程序前端的用户体验优化。同时,理解系统如何通过多维度信用评价体系、智能推荐算法等创新功能提升平台的可信度和用户粘性。在学习过程中,建议结合实际案例进行实践,调试代码,深入理解各个功能模块的设计思路和实现方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值