[BZOJ 3682]Phorni
后缀平衡树的模板题? I'm so weak……
现在觉得替罪羊树比 treap 好写,是不是没救了喵~
#include <cstdio>
#include <cmath>
typedef unsigned long long LL;
const double a=0.55;
const LL inf=1ULL<<;
const int sizeOfString=;
const int sizeOfTree=; inline int getint();
inline char getch();
inline int getstr(char * );
inline void putint(int); int n, q, len, type;
char s[sizeOfString];
int P[sizeOfString];
inline void reverse(); struct node {int p, s; LL tag; node * c[];};
node memory_node[sizeOfString], * port_node=memory_node;
node * root;
node * suf[sizeOfString];
inline node * newnode(int);
inline bool cmp(int, int);
inline bool cmp(node * , node * );
node * flatten(node * , node * );
node * build(node * , int);
void print(node * );
void rebuild(node *& );
void remark(node * , LL, LL);
bool insert(node *& , node * , LL=, LL=inf, int=); struct seg {int p; seg * l, * r;};
seg memory_seg[sizeOfTree], * port_seg=memory_seg;
seg * t;
inline seg * newseg();
inline int min(int, int);
seg * build(int, int);
void update(seg * , int, int, int);
int query(seg * , int, int, int, int); int main()
{
int ans=;
char ch;
int c, x, pos, l, r; n=getint(), q=getint(), len=getint(), type=getint();
getstr(s);
reverse(); root=suf[]=newnode();
root->tag=(+inf)>>;
for (int i=;i<=len;i++)
{
suf[i]=newnode(i);
insert(root, suf[i]);
} for (int i=;i<=n;i++) P[i]=getint(); t=build(, n);
for (int i=;i<=q;i++)
{
ch=getch();
if (ch=='I')
{
c=getint(); if (type) c=c^ans;
s[++len]=c+'a';
suf[len]=newnode(len);
insert(root, suf[len]);
}
if (ch=='C')
{
x=getint(); pos=getint();
P[x]=pos;
update(t, , n, x);
}
if (ch=='Q')
{
l=getint(); r=getint();
ans=query(t, , n, l, r);
putint(ans);
}
} return ;
}
inline int getint()
{
register int num=;
register char ch;
do ch=getchar(); while (ch<'' || ch>'');
do num=num*+ch-'', ch=getchar(); while (ch>='' && ch<='');
return num;
}
inline char getch()
{
register char ch;
do ch=getchar(); while (ch!='I' && ch!='C' && ch!='Q');
return ch;
}
inline int getstr(char * str)
{
register int len=;
register char ch;
do ch=getchar(); while (ch<'a' || ch>'z');
do str[++len]=ch, ch=getchar(); while (ch>='a' && ch<='z');
return len;
}
inline void putint(int num)
{
char stack[];
register int top=;
for ( ;num;num/=) stack[++top]=num%+'';
for ( ;top;top--) putchar(stack[top]);
putchar('\n');
}
inline void reverse()
{
static char t[sizeOfString];
for (int i=;i<=len;i++) t[i]=s[len-i+];
for (int i=;i<=len;i++) s[i]=t[i];
}
inline node * newnode(int p)
{
node * ret=port_node++;
ret->p=p; ret->s=;
ret->tag=0LL;
ret->c[]=NULL; ret->c[]=NULL;
return ret;
}
inline bool cmp(int a, int b)
{
return suf[a]->tag<suf[b]->tag;
}
inline bool cmp(node * a, node * b)
{
return s[a->p]==s[b->p]?cmp(a->p-, b->p-):s[a->p]<s[b->p];
}
node * flatten(node * x, node * y)
{
if (!x) return y;
x->c[]=flatten(x->c[], y);
return flatten(x->c[], x);
}
node * build(node * x, int s)
{
node * y, * z;
if (!s) return x->c[]=NULL, x;
y=build(x, s>>); z=build(y->c[], s--(s>>));
y->c[]=z->c[]; z->c[]=y;
return z;
}
void rebuild(node *& t)
{
static node temp;
node * line;
int n=t->s;
line=flatten(t, &temp);
build(line, n);
t=temp.c[];
}
void remark(node * t, LL l, LL r)
{
LL m=(l+r)>>;
t->tag=m; t->s=;
if (t->c[]) remark(t->c[], l, m), t->s+=t->c[]->s;
if (t->c[]) remark(t->c[], m, r), t->s+=t->c[]->s;
}
bool insert(node *& t, node * x, LL l, LL r, int d)
{
LL m=(l+r)>>;
bool ret=false;
if (!t) x->tag=m, t=x, ret=d>(log(root->s)/log(1.0/a));
else
{
t->s++;
if (cmp(t, x)) ret=insert(t->c[], x, m, r, d+);
else ret=insert(t->c[], x, l, m, d+);
if (ret) if ((t->c[] && t->c[]->s>a*t->s) || (t->c[] && t->c[]->s>a*t->s))
{
rebuild(t);
remark(t, l, r);
ret=false;
}
}
return ret;
}
inline seg * newseg()
{
seg * ret=port_seg++;
ret->l=ret->r=NULL;
return ret;
}
inline int min(int x, int y)
{
if (suf[P[x]]->tag<=suf[P[y]]->tag) return x;
return y;
}
seg * build(int l, int r)
{
seg * t=newseg();
if (l==r) return t->p=l, t;
int m=(l+r)>>;
t->l=build(l, m); t->r=build(m+, r);
t->p=min(t->l->p, t->r->p);
return t;
}
void update(seg * t, int l, int r, int p)
{
if (l==r) return ;
int m=(l+r)>>;
if (p<=m) update(t->l, l, m, p);
else update(t->r, m+, r, p);
t->p=min(t->l->p, t->r->p);
}
int query(seg * t, int l, int r, int ql, int qr)
{
if (l==ql && r==qr) return t->p;
int m=(l+r)>>;
if (qr<=m) return query(t->l, l, m, ql, qr);
else if (ql>=m+) return query(t->r, m+, r, ql, qr);
return min(query(t->l, l, m, ql, m), query(t->r, m+, r, m+, qr));
}
又 RE 又 WA 一时爽
到最后也没有搞清楚 zkw 炸在哪里……
大概是 zkw 查询时并不是顺序的缘故?
[BZOJ 3682]Phorni的更多相关文章
- 【BZOJ 3682】Phorni
题目链接 题目描述 Phorni 是一个音之妖精,喜欢在你的打字机上跳舞. 一天,阳光映射到刚刚淋浴过小雨的城市上时,Phorni 用魔法分裂出了许多个幻影,从 1 到 n 编号. 她的每一个幻影都站 ...
- 3682: Phorni 后缀平衡树 线段树
国际惯例的题面: 考虑如果没有强制在线我们能怎么水掉这个题,先构造出字符串,各种方法求一下后缀数组,然后线段树维护区间rank最小的位置即可.然而他要求强制在线,支持插入后缀,并比较后缀大小(求ran ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
随机推荐
- a标签
a链接是一种触发行为元素,行内元素 属性:href/target/class/id/title href: <a href="www.baidu.com"></a ...
- ThinkPHP(3)SQL查询语句
ThinkPHP中对查询语句,包含了基本的查询方式.表达方式.快速查询.区间查询.组合查询.SQL查询.动态查询和子查询. 一.查询方式 ThinkPHP提供了三种基本的查询方式:字符串条件查询.索引 ...
- 使用PHPExcel导出文件
使用PHPExcel导出文件步骤及解析: 新建一个excel表格:实例化PHPExcel类 创建sheet(内置表):createSheet()方法,创建新的sheet方法 setActiveShee ...
- Eclipse快捷键 10个最有用的快捷键
Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升. 1. ...
- (转)jQuery插件 -- Form表单插件jquery.form.js
beforeSubmit: validate function validate(formData, jqForm, options) { //在这里对表单进行验证,如果不符合规则,将返回false来 ...
- storm 源码笔记
(reify DistributedRPC$Iface (^String execute [this ^String function ^String args] (log-debug " ...
- jquery中的DOM事件绑定与解绑
在jquery事件中有时候有的事件只需要在绑定后有效触发一次,当通过e.target判断触发条件有效触发后解除绑定事件,来避免多次无效触发和与未知情况造成冲突. 这时候就要用到了jquery中的事件绑 ...
- BZOJ 1799 同类分布
一开始没想出来..一看题解 我艹直接枚举数位的和啊.....怪不得给50s. 还是太蠢. #include<iostream> #include<cstdio> #includ ...
- 主要由顶点容器构成的平面图形类(Shape)——(第一次作业Draw类定义升级)
// https://github.com/orocos/orocos_kinematics_dynamics/blob/master/orocos_kdl/src/frames.hpp // Vec ...
- 【LeetCode OJ】Construct Binary Tree from Preorder and Inorder Traversal
Problem Link: https://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-trave ...