后缀平衡树的模板题? 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的更多相关文章

  1. 【BZOJ 3682】Phorni

    题目链接 题目描述 Phorni 是一个音之妖精,喜欢在你的打字机上跳舞. 一天,阳光映射到刚刚淋浴过小雨的城市上时,Phorni 用魔法分裂出了许多个幻影,从 1 到 n 编号. 她的每一个幻影都站 ...

  2. 3682: Phorni 后缀平衡树 线段树

    国际惯例的题面: 考虑如果没有强制在线我们能怎么水掉这个题,先构造出字符串,各种方法求一下后缀数组,然后线段树维护区间rank最小的位置即可.然而他要求强制在线,支持插入后缀,并比较后缀大小(求ran ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  5. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  6. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  7. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  8. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  9. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

随机推荐

  1. C# Lamada表达式

    Lambda表达式 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式和语句,并且可用于创建委托 ...

  2. ios安装app提示【未受信任的企业级开发者】。在设置中信任此开发者

     最近在测试app,ios安装app后点击提示如下图: 解决方法: 1 点击 [设置] >[通用] >[设备管理]   2 点击企业级应用 > 信任该开发者 > 信任.设置之后 ...

  3. 2016-02-03 xss漏洞

    应用上出现了xss漏洞.是由一个get请求的ajax接口返回的一个字段中有xss漏洞引起的.该字段本来是要展示出来的,但是补丁版的时候去掉了这块的展示,接口还是返回的.现在引发了xss漏洞,有些同事是 ...

  4. how-to-add-global-asp-net-web-api-filters

    要实现给mvc 和api 接口全局添加日志统计,web api添加的方式有些不同 FilterConfig.cs 页面 public class FilterConfig { public stati ...

  5. c# 水晶报表的设计(非常的基础)

    最近在公司实习,由于公司需要用到的一种叫做水晶报表的神奇的东东,老大就叫我们学习学习.怕自己以后忘了,也为了以后阅读方便,将其记录下来. 使用工具:vs2008 基本方法一.使用水晶报表的推模式 步骤 ...

  6. SEO优化

    SEO是由英文Search Engine Optimization缩写而来, 中文意译为“搜索引擎优化”.SEO是指从自然搜索结果获得网站流量的技术和过程,是在了解搜索引擎自然排名机制的基础上, 对网 ...

  7. window.onload() 和 $(function(){})

    再使用 $(function(){})的时候,发现一直取不到元素.但是换成window.onload()则可以取到. 大概推测是页面加载问题,于是把js从header移到了footer,发现 $(fu ...

  8. 13个JavaScript图表(JS图表)图形绘制插件【转】

    现在网络上又有越来越多的免费的(JS 图表)JavaScript图表图形绘制插件.我之前给一家网站做过复杂的图形,我们用的是 highchart.在那段时间,没有很多可供选择的插件.但现在不同了,很容 ...

  9. GFW-新闭关锁国政策

    当八国联军的炮火轰开古老的北京城门,不知道腐朽的清政府是否依旧认为闭关锁国政策是一项正确的国策?清政府实施闭关锁国政策基于2点考虑:1.安全,国家安全,不想让这些洋鬼子来捣乱.2.我天朝大国,根本无需 ...

  10. Maven指令

    mvn clean compile  //clean告诉Maven清理输出目录target/,compile告诉Maven编译项目主代码. mvn clean test  //清理输出目录target ...