P4847 银河英雄传说V2 非旋treap

传送门

文章目录

  • 题意:
  • 思路:

题意:

在这里插入图片描述

思路:

让我们分析一下题目需要实现什么操作:
(1)(1)(1)将某个序列放到某个的后面,也就是合并两个序列。
(2)(2)(2)将一个序列从某处断开。
(3)(3)(3)查询某个序列的一段和。
合并、分裂、查询??
这不是平衡树裸题🐎,直接上fhq−treapfhq-treapfhqtreap,太香了。
查找父亲的时候每次找fatherfatherfather的时候不断向上跳一直到根即可,最多lognlognlogn层。
注意维护序列的话,找xxx所在的位置的时候,由于其不满足二叉搜索树的性质,所以不能从父亲向下找,但是由于根节点排名一定大于左子树的排名,所以我们直接从当前点向上跳即可,如果这个点是父亲的右儿子,那么加上左儿子大小并且+1+1+1即可。
还要注意一下,分裂的时候,分裂完之后需要将x,yx,yx,yfatherfatherfather置为000,否则父亲没有改变会出错的。

// Problem: P4847 银河英雄传说V2
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4847
// Memory Limit: 125 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int a[N],p[N],idx;
int root[N],x,y,z,tot;
struct Node {int l,r;int rank,val,size,id,fa;LL sum;
}tr[N];int find(int x) {return (!tr[x].fa)? x:find(tr[x].fa);
}int newnode(int v,int id) {int u=++tot;tr[u].l=tr[u].r=0;tr[u].rank=rand(); tr[u].val=tr[u].sum=v;tr[u].size=1; tr[u].id=id; tr[u].fa=0;return u;
}void pushup(int u) {tr[u].size=tr[tr[u].l].size+tr[tr[u].r].size+1;tr[u].sum=tr[u].val+tr[tr[u].l].sum+tr[tr[u].r].sum;if(tr[u].l) tr[tr[u].l].fa=u; if(tr[u].r) tr[tr[u].r].fa=u;
}void split(int u,int k,int &x,int &y) {if(!u) { x=y=0; return; }if(k<=tr[tr[u].l].size) y=u,split(tr[u].l,k,x,tr[u].l);else x=u,split(tr[u].r,k-tr[tr[u].l].size-1,tr[u].r,y);pushup(u);
}int merge(int u,int v) {if(!u||!v) return u+v;if(tr[u].rank<tr[v].rank) {tr[u].r=merge(tr[u].r,v);pushup(u);return u;} else {tr[v].l=merge(u,tr[v].l);pushup(v);return v;}
}int findrk(int v,int root) {int ans=tr[v].size-tr[tr[v].r].size;while(v!=root) {if(v==tr[tr[v].fa].r) ans+=tr[tr[v].fa].size-tr[v].size;v=tr[v].fa;}return ans;
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) {int x; scanf("%d",&x);merge(0,newnode(x,i));}int all=n;while(m--) {char op[2]; int x,y;scanf("%s",op);if(op[0]=='M') {int a,b; scanf("%d%d",&a,&b);int pa=find(a),pb=find(b);if(pa==pb) continue;merge(pb,pa);} else if(op[0]=='D') {int x; scanf("%d",&x);int rt=find(x);int rk=findrk(x,rt);split(rt,rk-1,x,y);tr[x].fa=tr[y].fa=0;} else {int a,b; scanf("%d%d",&a,&b);int pa=find(a),pb=find(b);if(pa!=pb) puts("-1");else {int rk1=findrk(a,pa),rk2=findrk(b,pb);if(rk1>rk2) swap(rk1,rk2);split(pa,rk2,x,z); split(x,rk1-1,x,y);printf("%lld\n",tr[y].sum);merge(merge(x,y),z);}}}return 0;
}
/**/

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

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

相关文章

【NOI online 2】游戏【二项式反演】【树上背包】

题意&#xff1a;一棵n2mn2mn2m个点的树&#xff0c;mmm个白点和mmm个黑点。对于k∈[0,n]k\in [0,n]k∈[0,n]&#xff0c;求出 把点黑白两两配对使得恰好有kkk对点有祖孙关系 的方案数 模998244353998244353998244353。 n≤5000n \leq 5000n≤5000 见到恰好考虑容斥&#xff0…

小白开学Asp.Net Core 《五》

小白开学Asp.Net Core《五》—— 使用.Net Core MVC Filter一、简介今天在项目&#xff08;https://github.com/AjuPrince/Aju.Carefree&#xff09;做登陆权限时&#xff0c;用到了Filter&#xff0c;现将Filer的使用做以下记录。二、Filter 简介Filter俗称过滤器&#xff0c;…

P5217 贫穷 平衡树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 本来是不想写数据结构了&#xff0c;因为明天打蓝桥了&#xff0c;想放松一下&#xff0c;但是看到这个题感觉写起来挺简单的&#xff0c;就试了试&#xff0c;结果… 首先看一下他的操作…

高性能微服务网关.NETCore客户端Kong.Net开源发布

前言项目地址&#xff1a;https://github.com/lianggx/Kong.Net你的支持使我们更加强大&#xff0c;请单击 star 让更多的 .NETCore 认识它。拥抱开源的脚步&#xff0c;我们从来都是一直在路上&#xff1b;.NETCore作为后起之秀&#xff0c;带给我们太多的惊喜和感动&#xff…

【CF923E】Perpetual Subtraction【生成函数】【积分推式子】【NTT卷积】

题意&#xff1a;有一个整数x∈[0,n]x\in[0,n]x∈[0,n]&#xff0c;取iii的概率为pip_ipi​。执行mmm次操作&#xff0c;每次把xxx等概率变成[0,x][0,x][0,x]中的一个整数&#xff0c;求操作完后等于每个数的概率。模998244353998244353998244353。 n≤105,m≤1018n\leq 10^5,m…

使用Jenkins部署.Net Core遇到的几个坑

一、相关环境和版本搞过CI/CD的同学一定吃过不少苦头&#xff0c;或者说遇到不少坑&#xff0c;但是对自动化的执着住挡不了前进的步伐&#xff0c;如果你缺少了运维这一块知识&#xff0c;那么你的流水线总是不那么完美&#xff0c;本文记录的是自己躺过的坑&#xff0c;希望对…

Deltix Round, Spring 2021 E. Crypto Lights 组合数学 + 推公式

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你nnn个灯&#xff0c;每次可以打开一个灯&#xff0c;当连续的kkk个灯有至少两个灯开着的时候停止&#xff0c;问最终期望能打开多少灯。 思路&#xff1a; 由于不想打latexlatexlatex&#xff0c;所以…

【洛谷P5385】须臾幻境/【BZOJ3514】Codechef MARCH14 GERALD07加强版【LCT】【主席树】

题意&#xff1a;有nnn个点mmm条边&#xff0c;qqq次询问连接区间[L,R][L,R][L,R]中的边后的连通块个数。强制在线。 n,m,q≤2105n,m,q\leq 2\times10^5n,m,q≤2105 显然连通块个数n−任意一个生成森林的边数连通块个数n-任意一个生成森林的边数连通块个数n−任意一个生成森林…

.NET Core 仿魔兽世界密保卡实现

《魔兽世界》的老玩家都知道&#xff0c;密保卡曾经被用于登录验证&#xff0c;以保证账号安全。今天我用.NET Core模拟了一把密保卡&#xff08;也叫矩阵卡&#xff09;的实现&#xff0c;分享给大家。密保卡的原理这是一张典型的魔兽世界密保卡。序列号用于绑定游戏账号&…

Deltix Round, Spring 2021 D. Love-Hate 随机化 + sos dp(高维前缀和)

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你nnn个朋友&#xff0c;一共有mmm种货币&#xff0c;一个朋友最多喜欢ppp种&#xff0c;用二进制给出111代表喜欢&#xff0c;让你选出最多的一个货币集合使得至少有⌈n2⌉\left \lceil \frac{n}{2} \rig…

【UOJ207】共价大爷游长沙【LCT】【异或】【随机化】

传送门 题意&#xff1a;维护一棵无权树和一个路径集合SSS&#xff0c;支持以下操作&#xff1a; 断边连边在SSS加入中加入一条路径删除SSS中的一条路径询问是否SSS中的所有路径都经过了边(x,y)(x,y)(x,y) n≤105,q≤3105n\leq10^5,q\leq3\times10^5n≤105,q≤3105 给每条加…

浅谈C#泛型

一.为什么要提出泛型的概念我们在声明对象或者方法中&#xff0c;对象中成员变量的定义或者函数参数都传递都要指定具体的对象类型&#xff0c;但是有的时候参数的类型是变化的&#xff0c;但是实现的功能却又差不多&#xff0c;这个时候我们就想&#xff0c;是否存在一种东西可…

Codeforces Round #635 (Div. 1) C. Kaavi and Magic Spell 区间dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个串s,ts,ts,t&#xff0c;每次都可以从sss的开头拿一个字符放到AAA串的开头或结尾&#xff0c;问最终有多少种方案使得ttt是AAA的前缀&#xff0c;注意sss不必全部拿完。 m,n≤3000m,n\le3000m,n≤30…

【IOI2018】会议【笛卡尔树】【dp】【线段树】

题意&#xff1a;长度为nnn的序列&#xff0c;qqq次询问&#xff0c;每次给定一个区间&#xff0c;钦定区间中的一个位置xxx&#xff0c;使得区间所有点 与xxx之间的最大值&#xff08;含端点&#xff09; 之和 最小&#xff0c;输出最小值。 n,q≤7.5105n,q\leq7.5\times10^5n…

【半小时大话.net依赖注入】(一)理论基础+实战控制台程序实现AutoFac注入

第一章|理论基础实战控制台程序实现AutoFac注入第二章|AutoFac的常见使用套路第三章|实战Asp.Net Framework Web程序实现AutoFac注入第四章|实战Asp.Net Core自带DI实现依赖注入第五章|实战Asp.Net Core引入AutoFac的两种方式简介该系列共5篇文章&#xff0c;旨在以实战模式&am…

P4198 楼房重建 线段树 + 区间合并

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 题面有点问题&#xff0c;按照人类正常的理解来就好啦。 思路&#xff1a; 可以想到维护每个位置的一个斜率&#xff0c;模拟的话就是从第一个位置开始向后选&#xff0c;当某个位置斜率大于当前位置的时…

【IOI2018】狼人【Kruscal重构树】【主席树】

题意&#xff1a;nnn个点mmm条边的无向图&#xff0c;qqq次询问&#xff0c;每次给定s,t,L,Rs,t,L,Rs,t,L,R&#xff0c;判断是否存在一条sss到ttt的路径&#xff0c;使得路径上可以找到一点kkk,满足此路径s∼ks\sim ks∼k的部分标号都≥L\geq L≥L且k∼tk\sim tk∼t标号都≤R\…

基于 Docker Compose 实践 .NET Core 的现代化架构 2:在容器中集成 Skywalking APM

本章节代码已经上传至 https://github.com/siegrainwong/.NET-Core-with-Docker/tree/master/Part2系列大纲还是先介绍一下目录&#xff0c;这次我们讲第二篇&#xff1a;用 docker-compose 启动 WebApi 和 SQL Server在容器中集成 Skywalking APM通过 nginx-proxy 对 ES、Skyw…

【雅礼集训2017】字符串【后缀自动机】【数据分治】

题意&#xff1a;给定一个字符串SSS和mmm个区间[li,ri][l_i,r_i][li​,ri​],qqq次询问&#xff0c;每次给定长度为kkk的字符串www和区间[a,b][a,b][a,b]&#xff0c;求对于所有i∈[a,b]i\in[a,b]i∈[a,b]&#xff0c;www在[li,ri][l_i,r_i][li​,ri​]内的子串在SSS中出现次数…

AtCoder Regular Contest 100 E - Or Plus Max Sos dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为2n2^n2n的数组&#xff0c;让你对于所有的1≤k≤2n−11\le k\le 2^n-11≤k≤2n−1求最大的aiaj,0≤i<j≤2n−1,iorj≤ka_ia_j,0\le i<j\le2^n-1,i\ \ or \ \ j\le kai​aj​,0≤i<j≤…