zoukankan      html  css  js  c++  java
  • 【bzoj3223】Tyvj 1729 文艺平衡树

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


    输入:

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


    输出:

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


    样例输入:
    5 3
    1 3
    1 3
    1 4


    样例输出:

    4 3 2 1 5


    数据范围:

    N,M<=100000



    题解:

    直接splay,打个rev标记就好了。

    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    
    #ifdef WIN32
    	#define LL "%I64d"
    #else
    	#define LL "%lld"
    #endif
    
    #ifdef CT
    	#define debug(...) printf(__VA_ARGS__)
    #else
    	#define debug(...)
    #endif
    
    #define R register
    #define getc() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?EOF:*S++)
    #define gmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
    #define gmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
    #define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
    #define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
    char B[1<<15],*S=B,*T=B;
    inline int FastIn()
    {
    	R char ch;R int cnt=0;R bool minus=0;
    	while (ch=getc(),(ch < '0' || ch > '9') && ch != '-') ;
    	ch == '-' ?minus=1:cnt=ch-'0';
    	while (ch=getc(),ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
    	return minus?-cnt:cnt;
    }
    #define maxn 100010
    bool rev[maxn];
    int fa[maxn] , ch[maxn][2] , size[maxn] , root , n;
    inline void update (R int x)
    {
    	R int ls = ch[x][0] , rs = ch[x][1];
    	size[x] = size[ls] + size[rs] + 1;
    }
    void Build (R int l , R int r , R int rt)
    {
    	if (l > r) return ;
    	R int mid = (l + r) >> 1;
    	fa[mid] = rt;
    	if (mid < rt) ch[rt][0] = mid;
    	else ch[rt][1] = mid;
    	Build(l , mid-1 , mid);
    	Build(mid+1 , r , mid);
    	update(mid);
    }
    inline void pushdown (R int x)
    {
    	R int ls = ch[x][0] , rs = ch[x][1];
    	if (rev[x])
    	{
    		if (ls) rev[ls] ^= 1 ;
    		if (rs) rev[rs] ^= 1 ;
    		ch[x][0] = rs ; ch[x][1] = ls;
    		rev[x] = 0;
    	}
    }
    inline void rotate(R int x)
    {
    	R int f = fa[x] , gf = fa[f] , d = (ch[f][1] == x);
    	if (f==root) root = x , ch [0][0] = x;
    	(ch[f][d] = ch[x][d ^ 1]) >0 ? fa[ch[f][d]] = f : 0;
    	(fa[x] = gf )> 0 ? ch[gf][ch[gf][1]==f] = x : 0;
    	fa[ch[x][d^1] = f] = x;
    	update (f);
    }
    inline void splay(R int x , R int rt)
    {
    	while (fa[x]!=rt)
    	{
    		R int f = fa[x] , gf = fa[f];
    		if (gf != rt) rotate ( (ch[gf][1] == f) ^ (ch[f][1] == x) ? x : f );
    		rotate (x);
    	}
    	update(x);
    }
    int find(R int x , R int rank)
    {
    	if (rev[x]) pushdown(x);
    	R int ls = ch[x][0] , rs = ch[x][1] ,lsize = size[ls];
    	if (lsize+1 == rank) return x;
    	if (lsize >= rank ) return find(ls , rank);
    	else return find(rs , rank -lsize -1);
    }
    inline int prepare (R int l,R int r)
    {
    	R int x = find (root ,l-1 );
    	splay(x , 0);
    	x = find(root , r+1) ;
    	splay(x , root);
    	return ch[x][0];
    }
    inline void rever(R int l,R int r)
    {
    	R int x = prepare (l,r);
    	rev[x] ^= 1;
    	pushdown(x);
    }
    inline void print(R int x)
    {
    	if (!x) return;
    	if (rev[x]) pushdown(x);
    	R int ls = ch[x][0] , rs = ch[x][1];
    	print(ls);
    	if (x != 1 && x!=n )printf("%d ",x -1 );
    	print(rs);
    }
    int main()
    {
    	n = FastIn()+2 ;R int m = FastIn();
    	Build(1 , n , 0);
    	root = ( 1 + n ) >> 1;
    	for (; m ; m--)
    	{
    		R int l = FastIn() + 1 , r = FastIn() + 1;
    		rever( l , r );
    	}
    	splay(1,0);
    	print(root);
    	return 0;
    }


  • 相关阅读:
    C#的委托事件总结
    iOS的录屏功能
    Unity通过NTP获取网络时间
    Unity的弱联网Json数据传输
    Unity场景和代码合并以及UnityYAMLMerge的使用
    Unity学习--捕鱼达人笔记
    Yomob广告在cocos2dx安卓平台的Demo
    谷歌广告Admob在cocos2dx上通过回调实现底部Banner
    JZ2440 裸机驱动 第13章 LCD控制器(2)
    JZ2440 裸机驱动 第13章 LCD控制器(1)
  • 原文地址:https://www.cnblogs.com/cocottt/p/6765028.html
Copyright © 2011-2022 走看看