好吧,我承认这是我用来刷随笔数的喵~

这是一道 splay 裸题,但还是有想本傻 X 一样根本不会写 splay 的,于是乎又用 treap 水过了

splay 的常数我还是知道的,所以真是不知道那些 500ms 的人都是怎么跑出来的,跪求大爷指导

近期要学一下可持久化的 AVL 和尝试把 treap 的代码非递归化模板化(话说我真的不知道原始的 treap 怎么写了)

写完后也会发出来的喵~

 #include <cstdio>
#include <cstdlib>
#include <cstring>
const int size=;
const int inf=0x7FFFFFFF; template <class type>
inline void swap(type & a, type & b)
{type t=a; a=b; b=t;} namespace treap
{
struct node
{
char ch; int size;
int weight;
bool rev;
node * left, * right;
inline node():size() {left=right=this;}
inline void pushdown() {if (rev) swap(left, right), left->rev^=, right->rev^=, rev=;}
inline void maintain() {size=left->size+right->size+;}
};
node * null=new node();
node MEM[size], * PORT=MEM; inline node * newnode(char ch, int size)
{
node * ret=PORT++;
ret->ch=ch; ret->size=size;
ret->rev=;
ret->left=ret->right=null;
return ret;
}
node * newtreap(char * s, int l, int w)
{
if (!l) return null;
node * ret=newnode(s[l>>], l);
ret->weight=rand()%w+;
if (l==) return ret;
ret->left=newtreap(s, l>>, ret->weight);
ret->right=newtreap(s+(l>>)+, l-(l>>)-, ret->weight);
return ret;
}
void split(node * t, int k, node *& l, node *& r)
{
if (t==null) l=r=null;
else
{
t->pushdown();
if (t->left->size<k)
{
l=t;
split(t->right, k-t->left->size-, t->right, r);
l->maintain();
}
else
{
r=t;
split(t->left, k, l, t->left);
r->maintain();
}
}
}
node * merge(node * l, node * r)
{
if (l==null) return r;
if (r==null) return l;
if (l->weight>r->weight)
{
l->pushdown();
l->right=merge(l->right, r);
l->maintain();
return l;
}
else
{
r->pushdown();
r->left=merge(l, r->left);
r->maintain();
return r;
}
}
} int N, mouse;
char str[size];
treap::node * root=treap::newnode(' ', );
void print(treap::node * );
inline void insert(char * , int);
inline void remove(int);
inline void rotate(int);
inline char get(); int main()
{
int x; scanf("%d", &N); mouse=;
root->weight=rand();
for ( ;N;N--)
{
scanf("%s", str);
if (str[]=='G') putchar(get()), putchar('\n');
else if (str[]=='M') scanf("%d", &x), mouse=x;
else if (str[]=='P' && mouse) mouse--;
else if (str[]=='N' && mouse<root->size) mouse++;
else if (str[]=='R') scanf("%d", &x), rotate(x);
else if (str[]=='D') scanf("%d", &x), remove(x);
else
{
scanf("%d", &x);
do gets(str); while (!strlen(str));
insert(str, x);
}
} return ;
}
inline void insert(char * s, int l)
{
treap::node * L, * M, * R;
treap::split(root, mouse, L, R);
M=treap::newtreap(s, l, inf);
L=treap::merge(L, M);
root=treap::merge(L, R);
}
inline void remove(int l)
{
treap::node * L, * M, * R;
treap::split(root, mouse, L, R);
treap::split(R, l, M, R);
root=treap::merge(L, R);
}
inline void rotate(int l)
{
treap::node * L, * M, * R;
treap::split(root, mouse, L, R);
treap::split(R, l, M, R);
M->rev^=;
L=treap::merge(L, M);
root=treap::merge(L, R);
}
inline char get()
{
treap::node * i=root;
int k=mouse+;
for ( ; ; )
{
i->pushdown();
if (i->left->size+==k) return i->ch;
if (i->left->size+<k)
{
k-=i->left->size+;
i=i->right;
}
else
i=i->left;
}
}

本傻装B不成反被艹系列

[AHOI 2006][BZOJ 1269]文本编辑器editor的更多相关文章

  1. BZOJ 1269 文本编辑器editor(伸展树)

    题意 https://www.lydsy.com/JudgeOnline/problem.php?id=1269 思路 伸展树(\(\text{splay}\))功能比较齐全的模板,能较好的体现 \( ...

  2. BZOJ 1269 文本编辑器 Splay

    题目大意:维护一个文本编辑器,支持下列操作: 1.将光标移动到某一位置 2.在光标后插入一段字符串 3.删除光标后的一段字符 4.翻转光标后的一段字符 5.输出光标后的一个字符 6.光标-- 7.光标 ...

  3. 【BZOJ】【1269】【AHOI2006】文本编辑器editor

    Splay Splay序列维护的模板题了……为了便于处理边界情况,我们可以先插入两个空格当作最左端和最右端,然后……其实本题主要考察的就是Build.splay和Findkth这三个操作,我们可以实现 ...

  4. BZOJ 1269: [AHOI2006]文本编辑器editor( splay )

    splay..( BZOJ 1507 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...

  5. BZOJ 1269: [AHOI2006]文本编辑器editor (splay tree)

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1213  Solved: 454[Submit ...

  6. AHOI2006文本编辑器editor

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1885  Solved: 683[Submit ...

  7. BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor

    BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor 题意: 分析: splay模拟即可 注意1507的读入格式 ...

  8. BZOJ1269 [AHOI2006]文本编辑器editor 【82行splay】

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4633  Solved: 1782 [Sub ...

  9. [bzoj1269]文本编辑器editor [bzoj1500]维修数列

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2540 Solved: 923 [Submit ...

随机推荐

  1. [转]Android进程与线程基本知识

    转自:http://www.cnblogs.com/hanyonglu/archive/2012/04/12/2443262.html 本文介绍Android平台中进程与线程的基本知识. 很早的时候就 ...

  2. SQL中 char、varchar、text 和 nchar、nvarchar、ntext的区别

    1.char.char存储定长数据很方便,char字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间.             2.va ...

  3. SharePoint表单和工作流 - Nintex篇(二)

    博客地址 http://blog.csdn.net/foxdave 接上篇点击打开链接 试用版获得的示例网站是一个SharePoint 2010 Server版的网站,我们先来看一下Nintex整个一 ...

  4. C++使用POST方法向网页提交数据-----C++发送HTTP数据获取Google天气预报

    例1:C++使用POST方法向网页提交数据    转自:http://www.it165.net/pro/html/201208/3534.html 在C++中可以使用POST方法向网页中提交数据,这 ...

  5. hdu 2000

    ps:刚开始学C++...用C++来试试.. 代码: #include <iostream> using namespace std; int main(){ ],t,i,j; ]> ...

  6. 12-24 关于UIScroView 控件的学习

    在iOS开发中,滚动视图(UIScrollView)通常用于显示内容尺寸大于屏幕尺寸的视图.滚动视图有以下两个主要作用: 让用户可以通过拖拽手势来观看想看到的内容 让用户可以通过捏合手势来放大或缩小观 ...

  7. Python的"数组"储存

    import time member=["小甲鱼","小布丁","黑夜","迷途","伊静"] pr ...

  8. MongoDB在Windows下安装及配置

    第一步 下载MongoDB http://www.mongodb.org/downloads 第二步 解压到D:\mongodb\目录下,为了命令行的方便,可以把D:\mongodb\bin加到系统环 ...

  9. sql2008+vs2008安装心得以及详细教程分享

    第一步,我把原来装的vs2005+sql2005全部卸载了 第二步,下载VS2008同时下载sql2008: 第三步,开始安装VS2008专业版,网上有很多给出了微软的地址,在这里我也贴一个吧 htt ...

  10. Magento中调用JS文件的几种方法

    一.全局调用方法: 通过该方法每个页面都会引用这个JS文件,除非是类似jQuery这样的系统文件,不然不推荐这种方法. 文件路径:/app/design/frontend/default/Your_T ...