模版:替罪羊树

文章目录

  • 前言
  • 注意事项
  • 代码

所谓替罪羊树,就是有一头替罪羊的树

(逃)

前言

在看完了一大堆各种平衡树的教程之后,决定学一个这个
因为它有一个很关键的好处:无须旋转
可以在pushup复杂度太恶心的题中做到splay做不到的事情
比如平衡树套线段树
但是在区间问题中还是splay最强啦!

注意事项

  1. 拍扁操作必须是未被删除的点
  2. 拍扁时要记录点的副本数量!

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
const int N=5e6+100;
const int M=150;
const int mod=998244353;
inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m;
int ls[N],rs[N],siz[N],val[N],cnt[N],de[N],tot,rub[N],top,r;
int q[N],num,o[N];
il int New(int v,int oo){int x=top?rub[top--]:++tot;ls[x]=rs[x]=0;siz[x]=cnt[x]=oo;val[x]=v;de[x]=0;return x;
}
il void pushup(int x){siz[x]=siz[ls[x]]+siz[rs[x]]+cnt[x];de[x]=cnt[x]?0:1;if(ls[x]) de[x]+=de[ls[x]];if(rs[x]) de[x]+=de[rs[x]];return;
}
il int build(int l,int r){if(l>r) return 0;int mid=(l+r)>>1;int k=New(q[mid],o[mid]);ls[k]=build(l,mid-1);rs[k]=build(mid+1,r);pushup(k);return k;
}
il void pia(int x){if(!x) return;pia(ls[x]);if(cnt[x]){q[++num]=val[x];o[num]=cnt[x];}pia(rs[x]);rub[++top]=x;return;
}
const double A=0.7;
il void check(int &x){if(!cnt[x]) return;if(siz[x]*A<siz[ls[x]]||siz[x]*A<siz[rs[x]]||siz[x]<=de[x]){num=0;pia(x);x=build(1,num);}return;
}
il void ins(int &k,int v){if(!k){k=New(v,1);return;}if(v==val[k]){cnt[k]++;pushup(k);return;}else if(v<=val[k]) ins(ls[k],v);else ins(rs[k],v);pushup(k);check(k);return;
}
il void del(int k,int v){if(!k) return;if(v==val[k]){cnt[k]--;pushup(k);return;}if(v<val[k]) del(ls[k],v);else del(rs[k],v);pushup(k);check(k);return;
}
il int findrnk(int k,int v){if(!k) return 1;if(v==val[k]) return siz[ls[k]]+1;else if(v<val[k]) return findrnk(ls[k],v);else return siz[ls[k]]+cnt[k]+findrnk(rs[k],v);
}
il int findnth(int k,int kth){//printf("k=%d kth=%d\n",k,kth);if(kth<=siz[ls[k]]) return findnth(ls[k],kth);else if(kth<=siz[ls[k]]+cnt[k]) return val[k];else return findnth(rs[k],kth-siz[ls[k]]-cnt[k]);
}
il int findpre(int x){//printf("rnk=%d\n",findrnk(r,x));return findnth(r,findrnk(r,x)-1);
}
il int findnxt(int x){return findnth(r,findrnk(r,x+1));
}
void print(int k){if(!k) return;printf("k=%d val=%d ls=%d rs=%d siz=%d cnt=%d\n",k,val[k],ls[k],rs[k],siz[k],cnt[k]);print(ls[k]);print(rs[k]);if(k==r) putchar('\n');
}
int main(){n=read();for(int i=1;i<=n;i++){int op=read(),x=read();switch(op){case 1:{ins(r,x);break;}case 2:{del(r,x);break;}case 3:{printf("%d\n",findrnk(r,x));break;}case 4:{printf("%d\n",findnth(r,x));break;}case 5:{printf("%d\n",findpre(x));break;}case 6:{printf("%d\n",findnxt(x));break;}}//print(r);}return 0;
}
/*
9
1 10
1 10
1 15
3 5
*/

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

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

相关文章

Entity Framework 6.3 和 EF Core 3.0 路线图

尽管脱离了 .NET Core 发布循环&#xff0c;但是 EF Core 正在开发其 3.0 路线图。除此之外&#xff0c;还对原来的 Entity Framework 进行了一些重要的变更。更多服务器端的查询将 LINQ 查询转换为对应的 SQL 查询通常是比较困难的&#xff0c;甚至是不可能的。许多 QRM 只能在…

P7154 [USACO20DEC] Sleeping Cows P(DP)

主要是状态设计比较难想&#xff0c;但其实可以理性地推出来。 P7154 [USACO20DEC] Sleeping Cows P 考虑最终一个合法状态是怎么样的&#xff1a;一定是一堆小牛棚&#xff0c;一堆大奶牛&#xff0c;最大的牛棚小于最小的奶牛。 这启发我们将所有牛和牛棚放在一起&#xff0c…

AT2370-[AGC013D]Piling Up【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2370 题目大意 有nnn个黑白球&#xff0c;但是具体颜色个数不确定&#xff0c;进行mmm次操作&#xff1a;拿出一个球然后放入黑白球各一个&#xff0c;再拿出一个球。 求最后颜色序列的种类数。 1≤n,m≤30001\leq n,m\le…

EFCore+Mysql仓储层建设(分页、多字段排序、部分字段更新)

前沿园子里已有挺多博文介绍了EFCoreMysql/MSSql如何进行使用&#xff0c;但实际开发不会把EF层放在Web层混合起来&#xff0c;需要多个项目配合结构清晰的进行分层工作&#xff0c;本文根据个人实践经验总结将各个项目进行分层&#xff0c;仅供想自己搭建,包含数据仓储以及分页…

[FWT] 时隔一年再回首FWT(快速沃尔什变换),我终于不再是个门外汉

时隔一年再回首FWT&#xff0c;我似乎有了新理解&#xff1f;&#xff1f; 添加了原理的推导&#xff0c;以前就只有模板… 文章目录引入or&#xff08;或&#xff09;卷积原理FWT_or正变换FWT_or逆变换模板and&#xff08;与&#xff09;卷积原理FWT_and正变换FWT_and逆变换模…

模板:多项式乘法(FFTNTT)

文章目录前言系数表示法和点值表示法单位根离散傅立叶变换&#xff08;DFT&#xff09;位逆序置换&#xff08;蝴蝶变换&#xff09;离散傅立叶逆变换&#xff08;IDFT&#xff09;代码NTT代码所谓快速傅立叶变换&#xff0c;就是傅立叶发明的一种快速的变换 &#xff08;逃&am…

Loj #149. 01 分数规划(01分数规划模板题)

链接 题意&#xff1a; 题解&#xff1a; 详细解法看这里 这里说个点&#xff0c;eps一定要开足够小&#xff0c;我一开始开的1e-5&#xff0c;结果就过了90%的数据&#xff0c;开到1e-7就足够了 代码&#xff1a; #include<bits/stdc.h> typedef long long ll; usin…

CF986C AND Graph(图论+二进制连边)

CF986C AND Graph \(\color{yellow}{\bigstar\texttt{Hint}}\)&#xff1a;和每个点连接的点是这个数取反后的子集&#xff0c;考虑将这个点和它的反连边&#xff0c;那么所有对应的数的子集都是同一个连通块内的。 之后的一种简单的寻找连通块就是直接对所有没有访问过的点暴力…

AT2376-[AGC014D]Black and White Tree【结论,博弈论】

正题 题目链接:https://www.luogu.com.cn/problem/AT2376 题目大意 给出nnn个点的一棵树&#xff0c;先后手轮流选择一个未染色的点染上白色(先手)/黑色(后手)&#xff0c;如果最后有一个白色的点连接的都是白色的点则先手获胜&#xff0c;否则后手获胜。求是否先手必胜。 1≤…

如何测试 ASP.NET Core Web API

在本文中&#xff0c;我们将研究如何测试你的 ASP .NET Core 2.0 Web API 解决方案。我们将了解使用单元测试进行内部测试&#xff0c;使用全新的 ASP .NET Core 的集成测试框架来进行外部测试。本文要点正确理解并使用单元测试和你的 ASP .NET Core Web API 解决方案一样重要。…

[帝皇杯day 1] [NOIP2018模拟赛]小P的loI(暴力+素筛),【NOIP模拟赛】创世纪(贪心),无聊的数对(线段树)

文章目录T1&#xff1a;小P的loltitlesolutioncodeT2&#xff1a;创世纪titlesolutioncodeT3&#xff1a;无聊的数对titlesolutioncodeT1&#xff1a;小P的lol title solution 此题非常水… 先用素数筛&#xff0c;筛出[1,n][1,n][1,n]中的质数 质数越小&#xff0c;倍数的分…

P6144 [USACO20FEB]Help Yourself P(DP+线段树)

P6144 [USACO20FEB]Help Yourself P 将线段按照了 \(r\) 排序&#xff0c;设右端点为 \(r\) 的答案为 \(f_r\)&#xff0c;发现这样转移非常困难。 \(\color{yellow}{\bigstar\texttt{Trick}}\)&#xff1a;区间覆盖的题要按照左端点排序&#xff0c;记右端点为 \(r\) 时的答案…

Desert King POJ - 2728

题意&#xff1a; 给定N个平面上的点的坐标和它们的权值&#xff0c;任意两点之间的边的价值是它们的距离&#xff0c;费用是两点权值之差的绝对值&#xff0c;求该图的一棵生成树&#xff0c;使得该树所有边的费用之和与价值之和的比值最小&#xff08;只需求这个比值即可&am…

洛谷P3338:力(FFT)

传送门 解析 算是比较适合的FFT入门题了吧 一个重要的trick&#xff1a; 当函数无法表示成卷积时&#xff0c;可以把函数翻转过来 然后调一调就又是卷积了 一个重要的注意事项是FFT的lim一定是两多项式相乘结果多项式的项数&#xff01; 即使后面的项根本没有用也一样 其他的…

CF650E-Clockwork Bomb【并查集】

正题 题目链接:https://www.luogu.com.cn/problem/CF650E 题目大意 给出nnn个点的两棵树&#xff0c;你每次可以选择第一棵树上的一条边改成另一条边&#xff0c;但是改完之后必须还是一棵树&#xff0c;求最少的步数把第一棵树改成第二棵树。 1≤n≤51051\leq n\leq 5\times…

[2-sat专练]poj 3683,hdu 1814,hdu 1824,hdu 3622,hdu 4115,hdu 4421

文章目录Priest Johns Busiest DaycodePeaceful CommissioncodeLets go homecodeBomb GamecodeEliminate the ConflictcodeBit MagiccodePriest John’s Busiest Day 题目 司仪必须在婚礼开始或结束时出现&#xff0c;考虑把第iii场婚礼拆成两个点 iii&#xff1a;表示司仪在婚…

.NET Core中的一个接口多种实现的依赖注入与动态选择

最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式&#xff0c;为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中&#xff0c;但是在服务调用的时候总是获取到最后注入的那个方法的实现&#xff0c;这时候就在想能不能实现动态的选…

Sightseeing Cows POJ - 3621

题意&#xff1a; L个点&#xff0c;P边的点边带权的有向图&#xff0c;求一个环点权和与边权和比值的最大值。 题解&#xff1a; 01分数规划判负环 详细看这里 还是套用01分数规划模型&#xff0c;点权为value[i],边权为cost[u],一个环为C&#xff0c;问题要求最大化 最…

CF559E Gerald and Path(DP)

CF559E Gerald and Path 设 \(dp(i,p)\) 表示完成前 \(i\) 条线段的覆盖&#xff0c;最右端位于 \(p\) 点的最大收益。 转移&#xff1f;向下一条线段转移时加上他们中间的距离&#xff1f;发现这样没有办法统计 \(p\) 点以前的空位了&#xff01; \(\color{yellow}{\bigstar\t…

多项式乘法:练习总结

文章目录前言力代码礼物代码差分和前缀和代码开拓者的知识代码总结前言 这两天由于国庆集训全是阴间的生成函数&#xff0c;所以就学了一点点相关的内容 其实就学了个FFT和NTT 也算是点开了一个小小的技能点吧 进入多项式才发现里面世界的广阔 然而由于这玩意没有一个是NOIP考…