P5217 贫穷 平衡树

传送门

文章目录

  • 题意:
  • 思路:

题意:

在这里插入图片描述

思路:

本来是不想写数据结构了,因为明天打蓝桥了,想放松一下,但是看到这个题感觉写起来挺简单的,就试了试,结果…
在这里插入图片描述
首先看一下他的操作,1,2,3,51,2,3,51,2,3,5就是裸的平衡树操作,444需要用一个数组判断是否删,没有删的话再查排名即可,注意查之前需要清空所有父亲的lazylazylazy标记!!!这个非常重要。对于操作555我们状压一下,只有262626个,所以一个intintint就能存下来,直接把区间拿出来,让后查询有多少个111就好了。

坑点:
(1)(1)(1)细节上的失误,比如tr[u].rtr[u].rtr[u].r写成了tr[u].ltr[u].ltr[u].l,比如应该分裂yyy我给写成了分裂rootrootroot,以上两点分别wawawa了两页嘤嘤嘤。
(2)(2)(2)findpfindpfindp函数里面没有提前updownupdownupdown,即清空父亲的懒标记,导致错误。注意这个题一定是要先清空再跳父亲,因为他当前的父亲可能有懒标记导致当前这个点从左儿子变成右儿子,或者右儿子变成左儿子!

蒟蒻的代码:

// Problem: P5217 贫穷
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P5217
// 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<random>
#include<sstream>
#include<chrono>
#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=400010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m,root,tot,x,y,z;
char s[N];
bool st[N];
struct Node {int l,r;int rank,size,state,fa;int lazy,id;
}tr[N];int newnode(int v) {int u=++tot;tr[u].l=tr[u].r=0;tr[u].lazy=0; tr[u].fa=0;tr[u].rank=rand();tr[u].id=v;tr[u].size=1;tr[u].state=1<<v;return u;
}void pushup(int u) {tr[u].size=tr[tr[u].l].size+tr[tr[u].r].size+1;tr[u].state=1<<tr[u].id;tr[u].state|=tr[tr[u].l].state,tr[tr[u].l].fa=u;tr[u].state|=tr[tr[u].r].state,tr[tr[u].r].fa=u;
}void pushdown(int u) {if(tr[u].lazy) {tr[u].lazy=0;swap(tr[u].l,tr[u].r);tr[tr[u].l].lazy^=1;tr[tr[u].r].lazy^=1;}
}void split(int u,int k,int &x,int &y) {if(!u) { x=y=0; return; }pushdown(u);if(k<=tr[tr[u].l].size) y=u,split(tr[u].l,k,x,tr[u].l),tr[x].fa=0;else x=u,split(tr[u].r,k-tr[tr[u].l].size-1,tr[u].r,y),tr[y].fa=0;pushup(u);
}int merge(int u,int v) {if(!u||!v) return u+v;if(tr[u].rank<tr[v].rank) {pushdown(u);tr[u].r=merge(tr[u].r,v);pushup(u);return u;} else {pushdown(v);tr[v].l=merge(u,tr[v].l);pushup(v);return v;}
}void updown(int u) {if(tr[u].fa) updown(tr[u].fa);pushdown(u);
} int findp(int u) {updown(u);int ans=tr[u].size-tr[tr[u].r].size;while(tr[u].fa) {if(u==tr[tr[u].fa].r) ans+=tr[tr[u].fa].size-tr[u].size;u=tr[u].fa;}return ans;
}void dfs(int u) {if(!u) return;pushdown(u);dfs(tr[u].l);//printf("%c",tr[u].id+'a');dfs(tr[u].r);
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);	scanf("%d%d%s",&n,&m,s+1);for(int i=1;i<=n;i++) {root=merge(root,newnode(s[i]-'a'));}while(m--) {char op[2]; int a; scanf("%s%d",op,&a);if(op[0]=='I') {char c[2]; scanf("%s",c);split(root,a,x,y); root=merge(merge(x,newnode(c[0]-'a')),y);} else if(op[0]=='D') {split(root,a,x,z);split(x,a-1,x,y);root=merge(x,z); st[y]=1;} else if(op[0]=='R') {int b; scanf("%d",&b);split(root,b,x,z);split(x,a-1,x,y);tr[y].lazy^=1;root=merge(merge(x,y),z);} else if(op[0]=='P') {if(st[a]) puts("0");else printf("%d\n",findp(a));} else if(op[0]=='T') {split(root,a,x,z);split(x,a-1,x,y);printf("%c\n",tr[y].id+'a');root=merge(merge(x,y),z); } else {int b; scanf("%d",&b);split(root,b,x,z);split(x,a-1,x,y);printf("%d\n",__builtin_popcount(tr[y].state));root=merge(merge(x,y),z);}}return 0;
}
/**/

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

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

相关文章

高性能微服务网关.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≤…

使用Minikube部署本地Kubernetes集群(二十九)

前言 使用Minikube部署本地k8s集群相对比较简单&#xff0c;非常推荐将其用于本地k8s开发环境&#xff0c;唯一麻烦点的仅仅是网络问题。在本篇教程中&#xff0c;我们使用了国内的镜像来完成本地k8s集群的搭建。如果搭建过程中出现错误&#xff0c;建议使用mini…

Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) F. Bits And Pieces sosdp预处理超集

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤1e6,ai≤2e6n\le1e6,a_i\le2e6n≤1e6,ai​≤2e6 思路&#xff1a; 由于(aj&ak)(a_j \And a_k)(aj​&ak​)打的括号&#xff0c;所以应该放在一起考虑&#xff0c;现在我们可以枚举aia_iai​&…

【PKUWC2018】随机算法【状压dp】【组合计数】

题意&#xff1a;一张nnn个点mmm条边的无向无权图&#xff0c;求以下算法计算最大独立集的正确率&#xff1a;随机一个排列&#xff0c;依次考虑排列中每一个点&#xff0c;如果不与任何一个独立集中的点相邻则将其加入独立集。模998244353998244353998244353。 n≤20n\leq20n≤…