spoj PT07J Query on a tree III (主席树+dfs序)

「API取数」FDL获取金蝶云星空的单据数据 本文介绍了如何使用FDL实现金蝶云API取数以及如何有效应对复杂的API数据处理场景。 阅读详情

题意:

一棵树,每次查询某个子树的第k大

思路:

     询问子树的问题,因为子树的dfs序是连续的一个区间,所以我们将这棵树dfs地建立主席树,查询子树就是查询子树对应的区间,这样就把树变成数列了

错误及反思:

     其实很简单,但是spoj卡常啊,在优化了常数,vector变成链式前向星,用了快读,换头文件以后终于ac了

代码:

#include<map>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define lson l,m
#define rson m+1,r
const int N = 101000;
int sum[N*20],ls[N*20],rs[N*20],val[N],root[N],fa[N],to[N],rnk[N],id[N],first[N];
int n,q,tot=1,cnt=0,tid=0;
vector<int> v;
map<int,int> mp;

struct EDGE{
    int to,next;
}e[N*2];

inline int read() {
    char ch = getchar(); int x = 0, f = 1;
    while(ch < '0' || ch > '9') {
        if(ch == '-') f = -1;
        ch = getchar();
    } while('0' <= ch && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    } return x * f;
}

void addedge(int x,int y){
    e[tid].to=y;
    e[tid].next=first[x];
    first[x]=tid++;
    e[tid].to=x;
    e[tid].next=first[y];
    first[y]=tid++;
}


int getid(int x){return lower_bound(v.begin(),v.end(),x)-v.begin()+1;}

int build(int l,int r){
    int rt=++cnt;
    ls[rt]=rt; rs[rt]=rt; sum[rt]=0;
    if(l==r) return rt;
    int m=l+r>>1;
    ls[rt]=build(lson);
    rs[rt]=build(rson);
    return rt;
}

int update(int pre,int pos,int l,int r){
    int rt=++cnt;
    ls[rt]=ls[pre]; rs[rt]=rs[pre]; sum[rt]=sum[pre]+1;
    if(l==r) return rt;
    int m=l+r>>1;
    if(m>=pos) ls[rt]=update(ls[pre],pos,lson);
    else rs[rt]=update(rs[pre],pos,rson);
    return rt;
}

void dfs(int now,int Fa){
    root[tot]=update(root[tot-1],getid(val[now]),1,v.size());
    id[now]=tot;
    fa[now]=Fa; tot++;
    for(int i=first[now];i!=-1;i=e[i].next)
        if(e[i].to!=Fa)
            dfs(e[i].to,now);

    to[now]=tot-1;
}

int query(int r1,int r2,int k,int l,int r){
    if(l==r) return rnk[l-1];
    int m=l+r>>1,num=sum[ls[r2]]-sum[ls[r1]];
    if(num>=k) return query(ls[r1],ls[r2],k,lson);
    return query(rs[r1],rs[r2],k-num,rson);
}

int main(){
    memset(first,-1,sizeof(first));
    n=read();
    for(int i=1;i<=n;i++){ val[i]=read(); mp[val[i]]=i; v.push_back(val[i]);}
    sort(v.begin(),v.end());
    for(int i=0;i<v.size();i++){
        rnk[i]=mp[v[i]];
    }
    for(int i=1,u,v;i<n;i++){
        u=read(); v=read();
        addedge(u,v);
    }
    root[0]=build(1,v.size());
    dfs(1,0);

    scanf("%d",&q);
    while(q--){
        int x,k;scanf("%d%d",&x,&k);
        printf("%d\n",query(root[id[x]-1],root[to[x]],k,1,v.size()));
    }
}
【项目实战】Java9的新特性模块化(Module) Java 9引入了模块化系统,称为"Java Platform Module System"(JPMS)这个系统允许将Java程序分成模块,每个模块都有自己的规范,可以明确地声明它依赖于哪些其他模块,并且只能访问被其所依赖的模块暴露的API。这样可以模块化就是增加了更高级别的聚合,是Package的封装体。Package是一些类路径名字的约定,而模块是一个或多个Package组成的封装体。 阅读详情

相关推荐

ArduSub程序学习(1)——ardupilot框架整理

AP_HAL层(硬件抽象层)是我们制作 ArduPilot 的方式可移植到许多不同的平台。有一个顶级AP_HAL libraries/AP_HAL,用于定义代码其余部分的接口 有针对具体的板子特性,然后就有了AP_HAL_XXX 子目录,例如,AP_HAL_AVR 用于基于 AVR 的 开发板,AP_HAL_PX4用于 Pixhawk 开发板和 AP_HAL_Linux 基于 Linux 开发板。工具目录tools directories工具目录是杂项支持目录。

weixin_49839886的博客 2812

SPOJ COT Count on a tree(树上主席树 + LCA 求点第k小)题解

题意:n个点的树,每个点有权值,问你u~v路径第k小的点的权值是? 思路: 树上主席树就是每个点建一棵权值线段树,具体看JQ博客,LCA用倍增logn求出,具体原理看这里 树上主席树我每个点的存的是点u到源点1的权值线段树,那我求点u到v的所有点,显然是 u + v - lca - fa[lca],就是u到1 + v到1 - 多算的lca - 多算的fa[lca]。不能减去两个lca不然少一...

weixin_34392435的博客 160

用Multisim和74192芯片复刻经典:手把手教你搭建篮球24秒违例计时器(附仿真文件)

本文详细介绍了如何使用Multisim仿真平台和74192芯片构建篮球24秒违例计时器,涵盖时序逻辑电路设计、核心器件选型、仿真环境搭建及调试技巧。通过分步指导,帮助读者掌握数字电路设计的关键技术,并附赠仿真文件供实践参考。

weixin_27014595的博客 278

SPOJ PT07J Query on a tree III(dfs序,主席树)

主席树

LJ__ 535

AutoDock Vina 对接计算(大批量)

AutoDock Vina是一种用于计算生物分子之间相互作用的计算工具,主要用于蛋白质和小分子(通常是潜在药物分子)之间的对接研究。它可以用于虚拟筛选、药物设计和生物分子结合位点的预测等多个应用领域。

MurphyStar的博客 1万+

GitHub漏洞挖掘与CVE提交实战指南:从发现到编号的完整链路

GitHub开源项目是现代软件供应链的核心节点,其安全漏洞直接影响全球数百万系统的机密性、完整性与可用性。理解漏洞本质需回归CIA三元组原理,而真实可利用性依赖对协议解析层、配置加载区和依赖传递链等高危模块的精准识别。技术价值在于将模糊的‘可疑逻辑’转化为符合MITRE CVE标准的可验证事件,支撑SDL流程、威胁情报建设与供应链风险管理。典型应用场景包括甲方安全工程师推动供应商修复、独立研究者参与负责任披露,以及DevSecOps团队构建自动化风险坐标系。本文基于27次CVE提交经验,聚焦GitHub代码

weixin_33646989的博客 651

SPOJ - PT07J Query on a tree III主席树

SPOJ - PT07J Query on a tree III 主席树You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node whose label is k-th largest in the subtree of the node x. Assume no tw

weixin_40433319的博客 264

Gitlab+Jenkins+Docker+Harbor+K8s+Rancher集群搭建CICD平台

本文以诺依项目为例详细记录了Kubernetes集群的部署过程以及配套DevOps环境的搭建。主要内容包括:1) 配置8个节点的软硬件环境;2) 基础环境准备(网络、防火墙、Docker等);3) 三节点Kubernetes集群部署;4) GitLab代码仓库安装;5) Harbor私有镜像仓库搭建;6) Jenkins持续集成工具配置;7) 基于若依项目的CI/CD实践;8) Rancher集群管理工具部署。

hickman2023的博客 1201

[ SPOJ PT07J ] Query on a tree III

\(\\\) Description 其实这题才是正版的 Qtree3...... 给定 \(n\) 个点,以 \(1\) 号节点为根的树,点有点权。 \(m\) 次询问 以 \(x\) 为根的子树内,点权第 \(k\) 小的 节点编号 是多少。 有多组测试数据,每组数据以 \(DONE\) 结尾。 \(n,m\le 10^5\) \(\\\) Solution 注意到一棵树的子树 \(D...

weixin_30515513的博客 109

lammps教程:聚合物压缩,避免“bond atoms missing”

如果使用ms建模,聚合物的链会伸出到盒子外面,在导出data文件后,盒子外面的原子被周期性算法折叠进盒子对面,这就造成了边界附近的bond原子可能被分布到了盒子的两侧。并且,这个data文件不能使用npt系综进行压缩,npt系综必须使用周期性边界,在压缩时,bond原子同样会移动到对面的边界。所以,最好的解决办法是使用一个反射墙墙进行压缩,设置一个反射墙墙既可以实现压缩效果,也可以组织原子跨越box边界移动到对面。解决这个问题的原则只有一个:导出data时确保所有的bond原子没有跨越边界。

lammps_jiayou的博客 3819

【FPGA教程案例89】编译码2——使用vivado核实现RS信道编译码

RS编码,又称里所码,即Reed-solomon codes,是一种前向纠错的信道编码,对由校正过采样数据所产生的多项式有效。当接收器正确的收到足够的点后,它就可以恢复原来的多项式,即使接收到的多项式上有很多点被噪声干扰失真。

FPGA/MATLAB学习教程/源码/项目合作开发 3540

[SPOJ-PT07J] Query on tree III (主席树)

题意翻译 你被给定一棵带点权的n个点的有根数,点从1到n编号。 定义查询 query(x,k): 寻找以x为根的k大点的编号(从小到大排序第k个点) 假设没有两个相同的点权。 输入格式: 第一行为整数n,第二行为点权,接下来n-1行为树边,接下来一行为整数m,下面m行为两个整数x,k,代表query(x,k) 输出格式: m行,输出每次查询的结果。 Translated by @vegacx 题...

weixin_30871293的博客 151

YOLOv8魔改系列:将CIoU替换成Wise-IoU,飞速涨点

将YOLOv8中CIoU替换成Wise-IoU,实现飞速涨点

qq_66386046的博客 2679

NEERC 17 L Laminar Family (树链剖分)

题意: &nbsp;&nbsp;&nbsp;&nbsp; 给你一颗树,每次选取一个路径,把路径上的所有点加入到一个集合里面,问最后的集合是否两两之间满足 A∈BA∈B A\in B 或者B∈AB∈AB\in A或者A∪B=∅A∪B=∅A\cup B = \emptyset 思路: &nbsp;&nbsp;&nbsp;&nbsp;我们发现,如果最后是符合条件的,那么必定是一个集合被另一个集合...

Roll_Keyboard的博客 549

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

bzoj 1103 大都市meg (dfs序+线段树)

题意: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;一颗树,每条边权是1,两种操作,一种查询x到根的距离,一种把某边改为0 思路: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 对于一个边变了,那么影响的就是子树,所以dfs序+线段树就行了,这题对于时间要求很低,vector存边,每次暴力找答案也能A 错误及反思: 代码: ...

Roll_Keyboard的博客 457

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SPOJ GRASSPLA Grass Planting(树链剖分)

题意: 一棵树,有m次操作,每次给u,v图色或者查询u,v之间一共被涂了几次 思路: 树链剖分的基础题,对于每次查询和涂色,都按照正常的错做来就行了,一点一点根据链来往上爬,更新线段树即可。 错误及反思: 因为懒,有一部分代码沿用了上个题,结果疯狂TLE和WA,只能说不能偷懒啊,不过中途确实把很多东西重新想了好几遍,还是很不错的 代码: #include #include #in

Roll_Keyboard的博客 444

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Codeforces Round #336 (Div. 1) D. Power Tree(dfs序线段树)

题意:思路:     首先,直接模拟很不现实,只能先离线,造出空树,再慢慢更新树      那么现在想一下怎么维护这颗树,首先,我们算每个点对根节点的贡献,发现每个点的贡献可以表示为vi∗sz1∗sz2∗...∗v_i*sz_1*sz_2*...*(其中sz1,sz2是这个点和根节点的路径上的点,这些点的直接儿子),只要我们新加入一个节点,假设父亲的直接儿子节点个数为sz,那么这次修改就是把它父亲

Roll_Keyboard的博客 419

spoj Qtree6/bzoj 3637 Query on a tree VI(树链剖分+线段树/LCT)

题意: 思路: 首先,我们要开两颗线段树,一颗表示,当前节点为白时,和子树所组成的最大联通块大小是多少,另一颗表示,当前节点为黑时,和子树所组成的最大联通块大小是多少。 那么我们查询点u的答案的时候,就向上找到最远的相同颜色的点v,点v所保存的答案就是u的答案(我们v为最远同色祖先)。 更新某个点u的颜色的时候,就是把u的父亲和最远同色祖先的父亲,这一条路径上的都更新(注意,黑白各更新...

Roll_Keyboard的博客 413

hdu 5111 Alexandra and Two Trees (主席树+树剖)

题意: 给你两颗树,q次查询,每次查询,问你第一颗树u1到v1,第二棵树u2到v2上,出现的数字交集大小,每颗树上不会有重复数字 思路: &nbsp;&nbsp;&nbsp;&nbsp; 我们首先先想这样一个问题,给你两个数列a1,a2,a3...ana1,a2,a3...ana_1,a_2,a_3...a_n和b1,b2,b3,...bmb1,b2,b3,...bmb_1,b_2,b_...

Roll_Keyboard的博客 387

BZOJ 1036 树的统计Count(树链剖分)

题意:给你一棵树,n个节点,每个节点都有一个val,现在进行q次操作,操作有三种,第一种查询u到v的最大值,第二种,查询u到v的val和,第三种,将某个点修改val思路:树链剖分基本题,相比起前面几道树链剖分,这个题维护的是点,虽然我们从理论上来说,树链剖分是根据边来剖分的,但是其实我们维护的时候维护点更简单,所以这个题虽然写起来麻烦一点,但是逻辑上反而更顺 用两颗线段树分别维护最大值和最小值,和

Roll_Keyboard的博客 375

POJ 3237 Tree(树链剖分)

题意:一棵树,每个边都有一个权,现在进行一些操作,将某个边变成x,将某段边取反(就是都变成自己的相反数),查询某个区间的最大值思路:比较有意思的一个题,主要是维护线段树的时候比较有意思,我们要建立两颗线段树,一个维护最大值,一个维护最小值,在取反的时候,用lazy维护的同时,两个线段树的节点都取反然后交换,这样我们就能通过一颗维护最小值的线段树实现了维护最大值的线段树了错误及反思:看到dicuss一

Roll_Keyboard的博客 367

SPOJ QTREE Query on a tree(树链剖分)

题意:给你一棵树,然后查询点u到v之间的最大值,并且中途可能会修改某个边的值思路:http://blog.sina.com.cn/s/blog_6974c8b20100zc61.html ↑这里树剖讲的很好 树剖基本题,没什么坑点但是写的时候,对于点的上下关系经常判断错,导致wa了一上午。树剖整体思路就是将树的边进行划分,最终达到类似倍增那样的不断跳跃来节省时间,同时把树按边转化为线性,这样就能

Roll_Keyboard的博客 356

HDU 3966 Aragorn's Story(树链剖分)

题意: 给你一棵树,n个节点,每个节点有一个val,p次操作,一种是每次对u到v加或者减一个数,另一种是查询某个点的值 思路: 树链剖分水题,简单地维护一下就好。但是,这题真正坑的地方是MLE,看到discuss里面,很多人反映G++会出问题但是C++能AC,有人说因为hdu是windows会容易爆栈,需要手动扩栈。我经过血的教训,得出结论,如果这些都没有问题,请看看自己写的数组到底有没有问

Roll_Keyboard的博客 354

BZOJ 4034 树上操作(树链剖分)

题意:思路:这题让我对树剖的体会更加深入了 因为我们在组链(也就是划分轻重边)的时候,是使用dfs序来进行划分的,所以我们子树的节点也依旧是在一起的,也就是说,树剖的时候顺便标记下dfs完自己子树时候的标号,就可以顺便完成dfs序时的标号要求了错误及反思:这题没什么难的。。主要是对树剖的体会更深了代码:#include<bits/stdc++.h> using namespace std; con

Roll_Keyboard的博客 353

HDU 5274 Dylans loves tree (树链剖分)

题意:一棵树,每个点有权,两种操作,一种单点修改,一种问x,y上的路有没有出现奇数次的点,并输出权值思路:因为异或了偶数次就还是0,所以树链剖分以后,每次询问的时候把所有的值异或起来就行了,因为数据还很小,所以我们单次直接更新到底就行了错误及反思:一开始没看到权值能为0,权值为0的时候我们手动加以下就可以了代码:#include<bits/stdc++.h> #define lson l,m,rt<

Roll_Keyboard的博客 342

bzoj 3626 LCA (树链剖分)

题意:思路:比较有意思的树链剖分 首先对于两个点lca的深度,我们发现就是两点和根的连线的重叠部分,那么我们就可以先把一个点到根的所有点都染下色,再用另一个点去查看到根有几个点被染色了 然后想怎么处理那么多区间,根据之前说的,我们可以把[l,r]中所有的点都看作第一个点,z看作第二个点,这样我们离线了提问,然后一边把点放进去一边查询即可错误及反思:l是可以为0的,bzoj有时候数据不会给的很细致

Roll_Keyboard的博客 320
上一篇: hdu 4866/bzoj 3932 Shooting/任务查询系统(主席树)
下一篇: Codecraft-18 and Codeforces Round #458 E. Palindromes in a Tree(点分治)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值