P3224-[HNOI2012]永无乡【平衡树,启发式合并】

正题

题目链接:https://www.luogu.com.cn/problem/P3224


题目大意

nnn个点,每次可以连接两个点和询问一个点所在联通块中第kkk大的数。


解题思路

我们发现可以启发式合并,对于每个联通块维护一个线段树,然后每次合并时将小的暴力丢入大的平很树里,然后询问即可。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)

(其实可以用权线合并做到O(nlog⁡n)O(n\log n)O(nlogn),但是在练平衡树就算了)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10,M=6e6+10;
struct node{int to,next;
}a[N];
int n,m,tot,p[N],siz[N],rt[N],ls[N];
struct Treap{int tot,rt[N],siz[M],cnt[M],ls[M],rs[M],val[M],dat[M];void Updata(int x){siz[x]=siz[ls[x]]+siz[rs[x]]+cnt[x];return;}void zig(int &x){int y=ls[x];ls[x]=rs[y];rs[y]=x;x=y;Updata(rs[x]);Updata(x);return;}void zag(int &x){int y=rs[x];rs[x]=ls[y];ls[y]=x;x=y;Updata(ls[x]);Updata(x);return;}void Insert(int &x,int w){if(!x){x=++tot;val[x]=w;cnt[x]=siz[x]=1;dat[x]=rand()*rand();return;}if(p[w]==p[val[x]])cnt[x]++,Updata(x);if(p[w]<p[val[x]]){Insert(ls[x],w);if(dat[x]<dat[ls[x]])zig(x);}else{Insert(rs[x],w);if(dat[x]>dat[rs[x]])zag(x);}Updata(x);return;}int GetVal(int x,int rank){if(!x)return 0;if(rank>siz[x])return -1;if(siz[ls[x]]>=rank)return GetVal(ls[x],rank);if(siz[ls[x]]+cnt[x]>=rank)return val[x];return GetVal(rs[x],rank-siz[ls[x]]-cnt[x]); }
}T;
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(int x,int fa){T.Insert(T.rt[rt[x]],x);for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;rt[y]=rt[x];dfs(y,x);}
}
void Merge(int x,int y){x=rt[x];y=rt[y];if(x==y)return;if(siz[x]<siz[y])swap(x,y);rt[y]=rt[x];siz[x]+=siz[y];addl(x,y);dfs(y,x);return;
}
int main()
{scanf("%d%d",&n,&m);srand(n*m);for(int i=1;i<=n;i++){scanf("%d",&p[i]);rt[i]=i;T.Insert(T.rt[i],i);siz[rt[i]]=1;}while(m--){int x,y;scanf("%d%d",&x,&y);Merge(x,y);}scanf("%d",&m);while(m--){char op[4];int x,y;scanf("%s %d %d",op,&x,&y);if(op[0]=='Q')printf("%d\n",T.GetVal(T.rt[rt[x]],y));else Merge(x,y);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客国庆集训派对Day6

牛客国庆集训派对Day6 以下是我个人题解,出题人题解附带在最后 A.Birthday 费用流裸题,只要注意到135...2k−1k2135...2k-1 k^2135...2k−1k2即可已做这道题了. 其他的地方连边都很方便.每一个区域向汇点连很多条容量为111的边,但费用分别是1,3,5,...,2k−11,3,5,...,2k-11…

.NET Core微服务之基于IdentityServer建立授权与验证服务(续)

上一篇《.NET Core微服务之基于IdentityServer建立授权与验证服务》我们基于IdentityServer4建立了一个AuthorizationServer&#xff0c;并且继承了QuickStartUI&#xff0c;能够成功获取Token了。这一篇我们了解下如何集成API Service和MVC Web Application。一、集成API Serv…

P4587-[FJOI2016]神秘数【主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P4587 题目大意 nnn个数&#xff0c;每次选择一个区间&#xff0c;然后询问这个区间的子集和所不能表示的最小的正整数。 解题思路 假设我们从小到大加入数字&#xff0c;我们发现如果这个数不是111显然这个区间内至少有一个…

【图论】【Floyed】舞会邀请(CODE[VS] 2604)

舞会邀请 CODE[VS] 2604 题目大意&#xff1a; Smart要叫一些人开Party&#xff0c;每个人可以通知一部分人&#xff0c;Smart去通知一些人&#xff0c;再让这些人去通知其他人&#xff0c;问Smart最少通知几个人&#xff0c;可以使全部人都被通知到 原题&#xff1a; 题目…

ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务

在大部分程序中一般都会需要用到后台任务&#xff0c; 比如定时更新缓存或更新某些状态。一、应用场景以调用微信公众号的Api为例&#xff0c; 经常会用到access_token&#xff0c;官方文档这样描述&#xff1a;“是公众号的全局唯一接口调用凭据&#xff0c;有效期目前为2个小…

【Floyed】工厂的烦恼(ssl 1762)

工厂的烦恼 ssl 1762 题目大意&#xff1a; 求一个图中最长的路线的长度 原题&#xff1a; Description 某工厂发现厂里的机器在生产产品时要消耗大量的原材料&#xff0c;也就是说&#xff0c;有大量的原材料变成了废物。因此厂里想找出消耗原材料最大的一条生产线路进行…

P3899-[湖南集训]谈笑风生【主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P3899 题目大意 给出nnn个点的一棵有根树&#xff0c;每次询问一个(p,k)(p,k)(p,k)&#xff0c;求有多少个点对(b,c)(b,c)(b,c)满足 ppp和bbb是ccc的祖先bbb与ppp的距离不超过kkk 蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤…

好代码是管出来的——.Net中的代码规范工具及使用

上一篇文章好代码是管出来的——C#的代码规范介绍了编码标准中一些常用的工具&#xff0c;本篇就具体来介绍如何使用它们来完成代码管理。  本文主要内容有&#xff1a;Roslyn简介开发基于Roslyn的代码分析器常用的基于Roslyn的代码分析器在.Net Framework项目中使用代码分析…

NCPC2018 D.Delivery Delays[二分答案+DP check]

Delivery Delays 题意 100010001000个点,500050005000条边的无向图,披萨店在111号店.100010001000份披萨订单,每个订单有下单时间,送达地点,披萨制作出来的时间.你是快递员初始在111号点,每次可以拿无穷多披萨,送完以后返回111号点继续送,送餐的时候要求按照下单顺序送达,求等…

P6046-纯粹容器【数学期望,组合数】

正题 题目链接:https://www.luogu.com.cn/problem/P6046 题目大意 nnn个数&#xff0c;每次选择两个相邻的数删除小的那个&#xff0c;求每个数期望存活轮数。 解题思路 相当于一条链每次缩掉一条边&#xff0c;我们发现其实每个点只需要考虑左右第一个比它大的就好了。定义…

【dfs】病毒(jzoj 1284)

病毒 题目大意&#xff1a; 有n&#xff08;1<n<1000&#xff09;头奶牛&#xff0c;d&#xff08;1<d<15&#xff09;种病毒&#xff0c;每头奶牛身上有可能有很多种病毒病毒&#xff0c;每头奶牛挤出的牛奶是混在一起放的&#xff0c;问最多可以挤多少头奶牛的…

探讨.NET Core的未来

本文要点与传统的.NET Framework相比&#xff0c;.NET Core平台具有显著的性能优势。.NET Core在Microsoft平台之外也广为采用&#xff0c;并受益于强大的社区参与。.NET Core在设计上采用以服务器为中心&#xff0c;而非聚焦于Windows。.NET Core开发受益于这种设计。.NET Cor…

HDU5985 Lucky Conins 概率题

Lucky Conins 题意 最多共101010种硬币,所有的硬币之和不超过100000100000100000,每次将所有的硬币抛出,第iii中硬币正面朝上的概率为pip_ipi​,将反面朝上的硬币移除掉.直至最后剩一种硬币或没有硬币则停止.若最后剩余一种硬币,则称这种硬币是幸运的,求每种硬币的幸运概率. …

P6619-[省选联考2020A/B卷]冰火战士【树状数组二分】

正题 题目链接:https://www.luogu.com.cn/problem/P6619 题目大意 有火系战士和冰系战士有一个温度和一个战斗力&#xff0c;每次加入或删除一个战士&#xff0c;要求一个最大的kkk使得温度不低于kkk的火系战士战斗力和温度不高于kkk的冰系战士战斗力和的最小值最大。 解题思…

【数论】分数拆分

分数拆分 题目大意&#xff1a; 给出一个数k&#xff0c;问满足1/k1/x1/y且x>y的x,y有多少对 原题&#xff1a; 解题思路&#xff1a; 首先1k1x1y\frac{1}{k}\frac{1}{x}\frac{1}{y}k1​x1​y1​,变式为1k−1y1x\frac{1}{k}-\frac{1}{y}\frac{1}{x}k1​−y1​x1​,然后再…

.NET Core Community 第三个千星项目诞生:爬虫 DotnetSpider

DotnetSpider 至力于打造一个轻量化、高效率、易开发、可管理的一体化爬虫框架。它的核心要素是URL调度、基本的网页内容下载器、基于爬虫实体类的爬虫实现模式、常用数据库的支持、多线程的支持、状态的监控、运行日志、网页端管理。DotnetSpider 具有相当高的可定制性&#x…

Wannafly 挑战赛27 题解

Wannafly 挑战赛27 题目连接 https://www.nowcoder.com/acm/contest/215#question A.灰魔法师 题目 题解 考虑到可能的完全平方数只有400400400多个,因此对于每种数,直接暴力枚举所有的完全平方数计算一下就可以了. 代码 #include <iostream> #define int long lon…

【开源】OSharpNS,轻量级.net core快速开发框架发布

OSharpNS简介OSharp Framework with .NetStandard2.0&#xff08;OSharpNS&#xff09;是OSharp的以.NetStandard2.0为目标框架&#xff0c;在AspNetCore的现有组件 Microsoft.Extensions.DependencyInjection&#xff0c;Microsoft.Extensions.Configuration&#xff0c;Micro…

ATcoder-Replace Digits【线段树】

正题 题目链接:https://atcoder.jp/contests/abl 题目大意 nnn个数字开始全是111&#xff0c;要求支持 修改一个区间为一个数字&#xff08;是1∼91\sim 91∼9的数&#xff09;求所有数字串起来%998244353\%998244353%998244353 解题思路 其实就是第iii个数字乘上10i10^i10i…

【模拟】字符串展开

字符串展开 题目大意&#xff1a; 一串缩写的字符串&#xff0c;将它缩写前的输出来&#xff08;详情见原题&#xff09; 原题 解题思路&#xff1a; 直接模拟每一个字符即可 代码&#xff1a; #include<cstdio> #include<string> #include<cstring> #…