Zijian-lv #3 树句节狗提

如你所见,这是一道狗题

一棵树,多次询问与一个点距离至少为 $k$ 的点的权值和

$n,q \leq 2525010$

sol:

长链剖分

需要注意的是这道题卡空间

我把我所有的 vector 换成链表才过了

#include <bits/stdc++.h>
#define LL long long
#define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)
#define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)
using namespace std;
inline int read() {
    int x = 0, f = 1; char ch;
    for (ch = getchar(); !isdigit(ch); ch = getchar()) if (ch == '-') f = -f;
    for (; isdigit(ch); ch = getchar()) x = 10 * x + ch - '0';
    return x * f;
}
const int maxn = 2525015;
int n, q, lim;/*
vector<pair<int, int> > qs[maxn];
vector<int> G[maxn];*/
int qcd[maxn];
struct Chain {
    int head[maxn], nx[maxn], id[maxn], sz;
    Chain() {memset(head, 0, sizeof(head)); sz = 0;}
    inline void AddItem(int pos, int Item, int other = -1) {
        id[++sz] = Item;
        nx[sz] = head[pos];
        head[pos] = sz;
        if(~other) qcd[sz] = other;
    }
}qs, G;
LL ans[maxn], pool[maxn], *f[maxn], *now=pool+1;
int a[maxn];
void print(int q, LL* ans, int lim) {
    LL res; 
    for(int i = 1; i <= q; ) {
        res = 0;
        for(int j = i; j <= min(q, i + lim - 1); j++) res ^= ans[j];
        i += lim;
        printf("%lld\n", res);
    }
    return ;
}
int mxs[maxn], mxd[maxn];
void dfs(int x) {
    mxd[x] = 0;
    for(int i=G.head[x];i;i=G.nx[i]) {
        dfs(G.id[i]);
        mxd[x] = max(mxd[x], mxd[G.id[i]] + 1);
        if((mxd[G.id[i]] > mxd[mxs[x]])) mxs[x] = G.id[i];
    }
}
void solve(int x) {
    if(mxs[x]) {
        f[mxs[x]] = f[x] + 1;
        solve(mxs[x]);
    }
    f[x][0] = a[x];
    for(int i=G.head[x];i;i=G.nx[i]) {
        if(G.id[i] == mxs[x]) continue;
        f[G.id[i]] = now; now += mxd[G.id[i]] + 1; solve(G.id[i]);
        rep(j, 0, mxd[G.id[i]]) f[x][j+1] += f[G.id[i]][j];
        //cout << "to: " << to << " " << f[x][1] << endl; 
    }
    //cout << x << " " << f[x][1] << endl;
    /*dwn(i, mxd[x]-1, 0) {
        cout << f[x][i] << " jiale " << f[x][i + 1] << endl;
        f[x][i] += f[x][i + 1];
    }*/
    f[x][0] += f[x][1];
    for(int i=qs.head[x];i;i=qs.nx[i]) {
        if(qs.id[i] > mxd[x]) ans[qcd[i]] = 0;
        else ans[qcd[i]] = f[x][qs.id[i]];
    }/*
    if(qs[x].size()) {
    //    cout << "DEBUG: " << qs[x].first << " " << qs[x].second << " " << f[x][qs[x].first] << endl;
    //    if(qs[x].first > mxd[x]) ans[qs[x].second] = 0;
    //    else
        /*cout << "x: " << x << endl;
        rep(i, 0, mxd[x])
            cout << f[x][i] << " ";
        cout << endl;*/
    /*    
        for(auto ii : qs[x]) {
            //cout << "DEBUG: " << ii.first << " " << mxd[x] << endl;
            if(ii.first > mxd[x]) ans[ii.second] = 0;
            else ans[ii.second] = f[x][ii.first];
        }
    }*/
}
int main() {
    n = read(); int x, y;
    rep(i, 1, n) a[i] = read();
    rep(i, 2, n) {
        //x = read(), G[x].push_back(i);
        x = read();
        G.AddItem(x, i);
    }
    q = read();
    rep(i, 1, q) {
        x = read(); y = read();
        //qs[x].push_back(make_pair(y, i));
        qs.AddItem(x, y, i);
    } mxd[0] = -1;
    dfs(1);
    f[1] = now; now += mxd[1] + 1; solve(1);
    lim = read();
    print(q, ans, lim);
    //rep(i, 1, q) cout << ans[i] << endl;
}
View Code

 论我的没 log 跑得没别人带 log 快

转载于:https://www.cnblogs.com/Kong-Ruo/p/10518200.html

资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 在 Android 应用开发中,开发一款仿 OPPO 手机计算器的应用是极具实践价值的任务,它融合了 UI 设计、事件处理以及数学逻辑等多方面的技术要点。当前的“最新版仿 OPPO 手机计算器--android.rar”压缩包中,供了该计算器应用的源代码,这为开发者深入学习 Android 编程供了宝贵的资源。 UI 设计是构建此类计算器应用的基石。OPPO 手机的计算器界面以清晰的布局和良好的用户交互体验著称,其中包括数字键、运算符键以及用于显示结果的区域等关键元素。开发者需借助 Android Studio 中的 XML 布局文件来定义这些界面元素,可选用 LinearLayout、GridLayout 或 ConstraintLayout 等布局管理器,并搭配 Button 控件来实现各个按键功能。同时,还需考虑不同分辨率屏幕和设备尺寸的适配问题,这通常涉及 Density Independent Pixel(dp)单位的应用以及 Android 尺寸资源的合理配置。 事件处理构成了计算器的核心功能。开发者要在每个按钮的点击事件中编写相应的处理代码,通常通过实现 OnClickListener 接口来完成。例如,当用户点击数字键时,相应的值会被添加到显示区域;点击运算符键时,则会保存当前操作数并设定运算类型。而对于等号(=)按钮,需要执行计算操作,这往往需要借助栈数据结构来存储操作数和运算符,并运用算法解析表达式以完成计算。 数学逻辑的实现则是计算器功能的关键体现。在 Android 应用中,开发者可以利用 Java 内置的 Math 类,或者自行设计算法来完成计算任务。基本的加减乘除运算可通过简单的算术操作实现,而像求幂、开方等复杂运算则需调用 Math 类的相关方法。此外
标题SpringBoot + Vue + Uniapp宠物走失信息管理系统小程序研究AI更换标题第1章引言介绍研究背景、目的、国内外现状、研究方法和论文结构。1.1研究背景与意义分析宠物走失信息管理的重要性,以及开发相应小程序的意义。1.2相关技术发展现状概述SpringBoot、Vue、Uniapp等技术在宠物走失信息管理系统中的应用现状。1.3论文研究内容与方法介绍论文的研究重点、使用的方法和实验设计。第2章系统需求分析与设计分析宠物走失信息管理系统的功能需求,并进行系统设计。2.1用户需求分析详细阐述用户对宠物走失信息管理系统的需求和期望。2.2系统功能设计根据需求分析,设计系统的功能模块和架构。2.3数据库设计设计合理的数据库结构以支持系统的数据管理需求。第3章系统实现与关键技术详细介绍宠物走失信息管理系统的实现过程和关键技术。3.1SpringBoot后端实现阐述如何利用SpringBoot框架实现后端服务,包括数据处理和业务逻辑。3.2Vue前端实现介绍Vue在前端页面开发中的应用,以及与前端的交互方式。3.3Uniapp小程序实现分析Uniapp在跨平台小程序开发中的优势,并详细阐述小程序的开发过程。第4章系统测试与优化对宠物走失信息管理系统进行测试,并根据测试结果进行优化。4.1测试环境与方法介绍系统测试的环境、工具和方法。4.2测试结果分析详细分析测试结果,找出系统存在的问题和不足。4.3系统优化措施针对测试结果,出有效的系统优化措施并验证其效果。第5章结论与展望总结论文的研究成果,展望未来的研究方向。5.1研究结论概述论文的主要研究结论和贡献。5.2未来研究方向探讨宠物走失信息管理系统未来的发展趋势和研究方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值