首页 > 其他分享 >BZOJ 3223: Tyvj 1729 文艺平衡树 splay

BZOJ 3223: Tyvj 1729 文艺平衡树 splay

时间:2023-07-07 13:38:13浏览次数:45  
标签:10 ch Tyvj 1729 int rev 3223 include size



3223: Tyvj 1729 文艺平衡树


Time Limit: 10 Sec   Memory Limit: 128 MB

Submit: 4614  

Solved: 2699

[

Submit][

Status][

Discuss]


Description




您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 


Input


第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n)  m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n 


Output


 

输出一行n个数字,表示原始序列经过m次变换后的结果 


Sample Input


5 3

1 3

1 3

1 4


Sample Output


4 3 2 1 5


HINT


N,M<=100000




本蒟蒻终于会写splay啦

上次说要写splay不记得是多久远了。。。

今天难得心情不好,决定补坑

狂打5遍,心情舒畅

这题卡PE 差评


2017.8.3再次更改模板

#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<complex>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<bitset>
#include<queue>
#include<map>
#include<set>
using namespace std;

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

const int N=100100;

int size[N],ch[N][2],fa[N],root;

bool rev[N];

inline void pushup(int k)
{size[k]=size[ch[k][0]]+size[ch[k][1]]+1;}

inline void pushdown(int k)
{
	if(rev[k])
	{
		rev[ch[k][0]]^=1;rev[ch[k][1]]^=1;
		swap(ch[k][0],ch[k][1]);
		rev[k]=0;
	}
}

void build(int l,int r,int last)
{
	if(l>r)return ;
	int now=(l+r)>>1;
	fa[now]=last;now<last?ch[last][0]=now:ch[last][1]=now;
	if(l==r){size[now]=1;return ;}
	build(l,now-1,now);build(now+1,r,now);
	pushup(now);
}

int find(int k,int rk)
{
	pushdown(k);
	if(size[ch[k][0]]>=rk)return find(ch[k][0],rk);
	if(size[ch[k][0]]+1<rk)return find(ch[k][1],rk-size[ch[k][0]]-1);
	return k;
}

inline void rotate(int x,int &k)
{
	int y=fa[x],z=fa[y],l,r,t;
	ch[y][0]==x?l=0:l=1;r=1^l;
	if(y==k)k=x;else ch[z][1]==y?ch[z][1]=x:ch[z][0]=x;
	fa[x]=z;fa[y]=x;
	t=ch[x][r];ch[y][l]=t;ch[x][r]=y;fa[t]=y;
	pushup(x);pushup(y);
}

void splay(int x,int &k)
{
	while(x^k)
	{
		int y=fa[x],z=fa[y];
		if(y^k)
		{
			if((ch[y][0]==x)^(ch[z][0]==y))rotate(x,k);
			else rotate(y,k);
		}
		rotate(x,k);
	}
}


void rever(int l,int r)
{
	int x=find(root,l),y=find(root,r);
	splay(x,root);splay(y,ch[x][1]);
	rev[ch[y][0]]^=1;
}

int main()
{
	int n=read(),m=read();
	register int i,x,y;
	build(1,n+2,0);root=(n+3)>>1;
	while(m--){x=read();y=read();rever(x,y+2);}
	for(i=1;i<=n;++i)print(find(root,i+1)-1),putchar(' ');
	return 0;
}
/*
5 3
1 3
1 3
1 4

4 3 2 1 5
*/




标签:10,ch,Tyvj,1729,int,rev,3223,include,size
From: https://blog.51cto.com/u_16181403/6651992

相关文章

  • ASEMI代理ADUM3223ARZ-RL7原装ADI车规级ADUM3223ARZ-RL7
    编辑:llASEMI代理ADUM3223ARZ-RL7原装ADI车规级ADUM3223ARZ-RL7型号:ADUM3223ARZ-RL7品牌:ADI/亚德诺封装:SOIC-16批号:2023+安装类型:表面贴装型引脚数量:16工作温度:-40°C~125°C类型:车规级芯片ADUM3223ARZ-RL7特征4A峰值输出电流工作电压相对于输入的高侧或低侧:537V峰......
  • CF1729G
    Problem-1729G-Codeforces一道很妙的计数DP。对于样例一:abababacababaaba对于ababa,我们可以删除3位置或5位置。那么思考何时不用删5位置?显然3位置被删除之后,5位置不用进行删除。所以现在i位置是匹配的位置,当区间[i-m+1,i-1](m为T的长度)有一个位置被删了,i位置就......
  • 【tyvj1305】最大子序和(单调队列)
    problem给你一个长为n的序列求一个长不超过m的连续子段,使子段和最大solution如果n<=10^3,我们很容易写出枚举(s是前缀和,区间[l,r]的和就是s[r]-s[l-1]。枚举l,r即可。for(int......
  • BZOJ3223-Tyvj 1729 文艺平衡树
    Description您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4......
  • CF1729G Cut Substrings 题解
    CF1729GCutSubstrings给出两个字符串\(s,t\),每次可以将字符串\(s\)中任意一个为\(t\)的子串删除,删除位置的字符变为空格(或理解为无实义)。求最少删除几次可以使得......
  • codeforces 1734C、1733D1、1733C、1730C、1729D
    1、1734CRemovingSmallestMultiples题意:给予你一个数组S,其中包含前n个正整数你可以在S上执行以下操作任多次(包含0次):1、选择一个正整数i,(1<=k<=n),并且使得数组S中......
  • Tyvj P2058(Map)
    c++<map>的使用其实由于x和y不相等,可以桶排的……#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<cmath>#include<functi......
  • 1729D解题报告
    这是一题开错的题想法每次两个人去最优(莫名悲伤),其中一个预算大于实际花费,另一个随意理由如下如果两个人去花费超过了预算,此时添加第三个人(他的花费小于预算),那么那个要......
  • P3223 (排列组合)
     题目传送门题目大意:略题目分析:本题类似于当小球遇上盒子。[\(1\)]:我们可以假设所有老师均为男生,利用插板法,我们可知两个女生可以放入一个男生两侧,又因为每个人......
  • 「TYVJ1035」棋盘覆盖 解题报告
    「TYVJ1035」棋盘覆盖题目描述给出一张\(n\)(\(n<=100\))的国际象棋棋盘,其中被删除了一些点,问可以使用多少\(1*2\)的多米诺骨牌进行掩盖。输入第一行为\(n\),\(m\)(表......