让蒟蒻见识到了常数大+滥用STL的危害。

<法一>很久之前的Splay

#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 110000
#define INF 2147483647
int n,m,l,r,fa[maxn],c[maxn][2],val[maxn],head,tail,root,tot,siz[maxn];
bool delta[maxn];
inline void Maintain(int x)
{
if(x)
siz[x]=siz[c[x][0]]+siz[c[x][1]]+1;
}
inline void Pushdown(int x)
{
if(x&&delta[x])
{
if(c[x][0])
delta[c[x][0]]^=true;
if(c[x][1])
delta[c[x][1]]^=true;
swap(c[x][0],c[x][1]);
delta[x]=false;
}
}
inline void NewNode(int &x,int Fa,int key)
{
x=++tot;
fa[x]=Fa;
val[x]=key;
siz[x]=1;
}
inline void Rotate(int x,bool flag)//flag指左旋还是右旋;
{
int y=fa[x];
Pushdown(x);
Pushdown(y);
c[y][!flag]=c[x][flag];
fa[c[x][flag]]=y;
if(fa[y])
c[fa[y]][c[fa[y]][1]==y]=x;
fa[x]=fa[y];
c[x][flag]=y;
fa[y]=x;
Maintain(y);
}
inline void Splay(int x,int goal)//指要将x旋转为goal节点的子节点 :双旋!!!!
{
if(!x||x==goal)
return;
int y;
Pushdown(x);
while((y=fa[x])!=goal)
{
if(fa[y]==goal)
Rotate(x,c[y][0]==x);
else
{
if((c[y][0]==x)==(c[fa[y]][0]==y))
Rotate(y,c[fa[y]][0]==y);
else
{
Rotate(x,c[y][0]==x);
y=fa[x];
}
Rotate(x,c[y][0]==x);
}
}
Maintain(x);
if(!goal)
root=x;
}
inline int Find(int &root,int key)
{
int x=root;
while(c[x][val[x]<key])
{
if(val[x]==key)
return x;
x=c[x][val[x]<key];
}
return x;
}
inline void Insert(int &root,int key)
{
if(!root)
{
NewNode(root,0,key);
return;
}
int x=Find(root,key);
if(val[x]==key)
{
Splay(x,0);
return;
}
NewNode(c[x][val[x]<key],x,key);
Splay(c[x][val[x]<key],0);
}
inline int Kth(int &root,int K)
{
int x=root;
while(1)
{
Pushdown(x);
int Siz0=siz[c[x][0]];
if(K<=Siz0)
x=c[x][0];
else if(K==Siz0+1)
break;
else
{
K-=(Siz0+1);
x=c[x][1];
}
}
return x;
}
inline void Print(int x)
{
if(!x)
return;
Pushdown(x);
Print(c[x][0]);
printf("%d ",val[x]);
Print(c[x][1]);
Maintain(x);
return;
}
int main()
{
scanf("%d%d",&n,&m);
Insert(root,0);
for(int i=1;i<=n;i++)
Insert(root,i);
Insert(root,n+1);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&l,&r);
Splay(Kth(root,l),0);
Splay(Kth(root,r+2),root);
delta[c[c[root][1]][0]]^=true;
Pushdown(c[c[root][1]][0]);
}
Splay(Kth(root,1),0);
Splay(Kth(root,n+2),root);
Print(c[c[root][1]][0]);
return 0;
}

<法二>块状链表维护翻转标记,维护块形态。50'

#include<cstdio>
#include<list>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int f,c;
inline void Read(int &x){
c=0;f=1;
for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c>='0'&&c<='9';c=getchar())(x*=10)+=(c-'0');
x*=f;
}
void Write(int x){
if(x<10)putchar(x+'0');
else{Write(x/10);putchar(x%10+'0');}
}
typedef vector<int>::iterator VER;
struct Node
{
bool Reversed;
vector<int>v;
Node(){Reversed=0;}
};
list<Node>List;
int n,m,tmp[100001],x,y,sz,L,R;
typedef list<Node>::iterator LER;
typedef pair<LER,VER> Point;
inline Point Find(const int &p)
{
int cnt=0; LER i=List.begin();
for(;i!=List.end();++i)
{
cnt+=(*i).v.size();
if(cnt>=p)
{
cnt-=(*i).v.size();
for(VER j=(*i).v.begin();j!=(*i).v.end();++j)
if((++cnt)==p)
return make_pair(i,j);
}
}
--i; return make_pair(i,(*i).v.end());
}
void Makeblock()
{
sz=sqrt(n); int tot=1; if(!sz) sz=1;
for(;tot*sz<n;++tot)
{
LER End=List.insert(List.end(),Node());
(*End).v.assign(tmp+(tot-1)*sz+1,tmp+tot*sz+1);
}
LER End=List.insert(List.end(),Node());
(*End).v.assign(tmp+(tot-1)*sz+1,tmp+n+1);
}
inline void pushdown(const LER &p)
{
if((*p).Reversed)
{
reverse((*p).v.begin(),(*p).v.end());
(*p).Reversed=0;
}
}
inline LER Split(const int &p)
{
Point Pos=Find(p);
pushdown(Pos.first);
if(Pos.second==(*Pos.first).v.begin()) return Pos.first;
LER newB=List.insert(Pos.first,Node());
(*newB).v.assign((*Pos.first).v.begin(),Pos.second);
(*Pos.first).v.erase((*Pos.first).v.begin(),Pos.second);
return Pos.first;
}
void Printans()
{
for(LER i=List.begin();i!=List.end();++i)
{
if((*i).Reversed)
for(VER j=(*i).v.end()-1;j>=(*i).v.begin();--j)
Write(*j),putchar(' ');
else
for(VER j=(*i).v.begin();j!=(*i).v.end();++j)
Write(*j),putchar(' ');
}
puts("");
}
inline void Merge(LER &a,LER &b)
{
pushdown(a);
pushdown(b);
(*a).v.insert((*a).v.begin(),(*b).v.begin(),(*b).v.end());
List.erase(b);
}
inline void MaintainList()
{
LER curB=List.begin();
while(curB!=List.end())
{
LER nexB=curB; ++nexB;
while(nexB!=List.end()
&&(*curB).v.size()+(*nexB).v.size()<=(sz<<1))
{
Merge(nexB,curB);
curB=nexB;
++nexB;
}
++curB;
}
}
inline void Reverse()
{
Read(L); Read(R);
if(L==R) return;
Point Pl=Find(L),Pr=Find(R);
if(Pl.first==Pr.first)
{
pushdown(Pl.first);
reverse(Pl.second,++Pr.second);
return;
}
LER Lb=Split(L),Rb=Split(R+1);
for(LER i=Lb;i!=Rb;++i)
(*i).Reversed^=1;
reverse(Lb,Rb);
MaintainList();
}
int main()
{
Read(n);
Read(m);
for(int i=1;i<=n;++i)
tmp[i]=i;
Makeblock();
for(int i=1;i<=m;++i)
Reverse();
Printans();
return 0;
}

【Splay】【块状链表】bzoj3223 Tyvj 1729 文艺平衡树的更多相关文章

  1. [BZOJ3223]Tyvj 1729 文艺平衡树

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

  2. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Sta ...

  3. bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2202  Solved: 1226[Submit][Sta ...

  4. bzoj3223: Tyvj 1729 文艺平衡树 splay裸题

    splay区间翻转即可 /************************************************************** Problem: 3223 User: walf ...

  5. 【Splay】bzoj3223 Tyvj 1729 文艺平衡树

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #i ...

  6. 2018.08.05 bzoj3223: Tyvj 1729 文艺平衡树(非旋treap)

    传送门 经典的平衡树问题,之前已经用splay写过一次了,今天我突发奇想,写了一发非旋treap的版本,发现挺好写的(虽然跑不过splay). 代码: #include<bits/stdc++. ...

  7. BZOJ3223——Tyvj 1729 文艺平衡树

    1.题目大意:维护序列,只有区间翻转这个操作 2.分析:splay的经典操作就是实现区间翻转,就是在splay中有一个标记,表示这个区间被翻转了 然后就是记得各种的操作访问某个点时,记得下传,顺便交换 ...

  8. BZOJ3223: Tyvj 1729 文艺平衡树 无旋Treap

    一开始光知道pushdown却忘了pushup......... #include<cstdio> #include<iostream> #include<cstring ...

  9. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

随机推荐

  1. innodb log file与binlog的区别在哪里?

    Q: innodb log file与binlog的区别在哪里?有人说1.mysql的innodb引擎实际上是包装了inno base存储引擎.而innodb log file是由 inno base ...

  2. UVA 11995 STL 使用

    There is a bag-like data structure, supporting two operations: 1 x Throw an element x into the bag. ...

  3. [模拟赛] StopAllSounds

    Description 小松鼠开心地在树之间跳跃着,突然她停了下来.因为眼前出现了一个 拿着专克超萌小松鼠的法宝----超萌游戏机的游客! 超萌游戏机之所以拥有这个名字,是因为它的屏幕是一个n × 2 ...

  4. 怎么把linux的磁盘映射到windows上

    步骤如下: 右击如下的computer: 然后选择:Map network drive... 然后在下图按图中所示操作: 最后成功如下图所示:

  5. iOS 控制台打印unicode 转中文汉字 UTF8String

    今天查看代码数据结构,就在控台直接打印了,soGa,我看到了什么!!!! 于是乎想到了不对劲,不对呀,之前打印都是 UTF8String的呀,怎么会这样,百思不得其姐,看了一下封装的网络类,SoGa, ...

  6. 转:LVS负载均衡

    1.什么是LVS? 首 先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和 基于内容请求分发技术.调度器具 ...

  7. [BZOJ1031][JSOI2007]字符加密Cipher 解题报告

    Description 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作 ...

  8. spring自定义参数绑定(日期格式转换)

    spring参数绑定时可能出现 BindException(参数绑定异常),类似下面的日期绑定异常(前台传过来是String类型,实际的pojo是Date类型) default message [Fa ...

  9. 手把手教你最简单的开源项目托管GitHub入门教程

    自从google code关闭了下载服务了之后,GitHub作为了目前最好用的免费开源项目托管站点,众多开源项目都托管在github,其中不乏著名的播放器MPC-HC. 不习惯于英文的朋友,难免少不了 ...

  10. Linq 联合条件查询快捷方法

    原方法: public ProductDC[] GetProductQueryCondition(ProductQueryConditionDC filter){//红色为原来的联合条件(之后下面的修 ...