后缀平衡树+线段树。

$O(1)$比较大小的标号法真是强大。

#include<cstdio>
#include<cmath>
#define N 300010
#define M 500010
using namespace std;
typedef unsigned long long ll;
const ll inf=1ULL<<63;
const double A=0.8;
ll tl[N],tr[N],tm[N];
int size[N],son[N][2],f[N],v[N],tot,root,id[N],cnt;
char s[N],ch;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline bool cmp(int a,int b){return s[a]==s[b]?tm[a-1]>tm[b-1]:s[a]>s[b];}
int ins(int x,int p){
int b=cmp(p,v[x]);
if(!son[x][b]){
son[x][b]=++tot;f[tot]=x;v[tot]=p;
if(!b)tl[tot]=tl[x],tr[tot]=tm[x];else tl[tot]=tm[x],tr[tot]=tr[x];
tm[tot]=(tl[tot]+tr[tot])>>1;
return tot;
}else return ins(son[x][b],p);
}
void dfs(int x){
if(son[x][0])dfs(son[x][0]);
id[++cnt]=x;
if(son[x][1])dfs(son[x][1]);
}
int build(int fa,int l,int r,ll a,ll b){
int mid=(l+r)>>1,x=id[mid];
f[x]=fa;son[x][0]=son[x][1]=0;size[x]=1;tl[x]=a;tr[x]=b;tm[x]=(a+b)>>1;
if(l==r)return x;
if(l<mid)size[x]+=size[son[x][0]=build(x,l,mid-1,a,tm[x])];
if(r>mid)size[x]+=size[son[x][1]=build(x,mid+1,r,tm[x],b)];
return x;
}
inline int rebuild(int x){
cnt=0;dfs(x);return build(f[x],1,cnt,tl[x],tr[x]);
}
inline void insert(int p){
if(!root){root=tot=size[1]=1;v[1]=p;tr[1]=inf,tm[1]=inf>>1;return;}
int x=ins(root,p);
int deep=0,z=x;while(z)size[z]++,z=f[z],deep++;
if(deep<log(tot)/log(1/A))return;
while((double)size[son[x][0]]<A*size[x]&&(double)size[son[x][1]]<A*size[x])x=f[x];
if(!x)return;
if(x==root){root=rebuild(x);return;}
int y=f[x],b=son[y][1]==x,now=rebuild(x);
son[y][b]=now;
}
int l[M<<1],r[M<<1],min[M<<1],seq[M],TOT;
void build(int a,int b){
int x=++TOT;
if(a==b){min[x]=a;return;}
int mid=(a+b)>>1;
l[x]=TOT+1;build(a,mid);
r[x]=TOT+1;build(mid+1,b);
min[x]=tm[seq[min[l[x]]]]<=tm[seq[min[r[x]]]]?min[l[x]]:min[r[x]];
}
void change(int x,int a,int b,int c){
if(a==b)return;
int mid=(a+b)>>1;
if(c<=mid)change(l[x],a,mid,c);else change(r[x],mid+1,b,c);
min[x]=tm[seq[min[l[x]]]]<=tm[seq[min[r[x]]]]?min[l[x]]:min[r[x]];
}
int ask(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return min[x];
int mid=(a+b)>>1,i,j;
if(d<=mid)return ask(l[x],a,mid,c,d);
if(c>mid)return ask(r[x],mid+1,b,c,d);
i=ask(l[x],a,mid,c,d),j=ask(r[x],mid+1,b,c,d);
return tm[seq[i]]<=tm[seq[j]]?i:j;
}
int n,m,i,x,y,len,type,ans;
int main(){
read(n);read(m);read(len);read(type);
for(getchar(),i=1;i<=len;i++)s[len-i+1]=getchar();
for(i=1;i<=len;i++)insert(i);
for(i=1;i<=n;i++)read(seq[i]);
build(1,n);
while(m--){
while(!(((ch=getchar())=='I')||(ch=='C')||(ch=='Q')));read(x);
if(ch=='I')s[++len]=(x^ans*type)+'a',insert(len);
if(ch=='C')read(seq[x]),change(1,1,n,x);
if(ch=='Q')read(y),printf("%d\n",ans=ask(1,1,n,x,y));
}
return 0;
}

  

BZOJ3682 : Phorni的更多相关文章

  1. BZOJ3682 Phorni 后缀平衡树

    后缀平衡树的裸题 后缀平衡树简单的思想如下 具体的可以去看$clj$的论文 假设我们已经有了串$S$的后缀平衡树 插入一个字母$c$ 我们用$Si$代表原串$S$从第$i$个字符开始的后缀 则后缀$c ...

  2. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  3. 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)

    模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...

  4. 【bzoj3682】Phorni

    后缀平衡树裸题. 后缀平衡树呢,实际上是一个很naive的东西.就是用平衡树维护后缀数组. 这样的话就可以支持在最前端插入一个字符(相当于插入新的后缀) 每次比较节点的tag是O(1)的,所以可以快速 ...

  5. 【BZOJ 3682】Phorni

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

  6. [BZOJ 3682]Phorni

    后缀平衡树的模板题? I'm so weak…… 现在觉得替罪羊树比 treap 好写,是不是没救了喵- #include <cstdio> #include <cmath> ...

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

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

  8. CH Round #51 - Shinrein祭 #1

    A.Phorni 题目:http://www.contesthunter.org/contest/CH%20Round%20%2351%20-%20Shinrein祭%20%231/Phorni 没做 ...

  9. Disillusioning #1 水题+原题赛(被虐瞎)

    https://vijos.org/tests/542c04dc17f3ca2064fe7718 好一场 水题 比赛啊 t1直接上暴力费用流10分QAQ,虽然一开始我觉得可以不用的,直接dfs可以得出 ...

随机推荐

  1. ruby实时查看日志

    (文章是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com) 在调试代码的时候,把日志文件打开,边操作边调试能很快帮助我们发现系统中存在的问题. $tail r ...

  2. 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)

    从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) ----把帧动画的实现放在GPU上 作者:FreeBlues 修订记录 2016.06.19 初稿完成. 2016.08.05 增加对 XCod ...

  3. Coursera台大机器学习技法课程笔记01-linear hard SVM

    极其淡腾的一学期终于过去了,暑假打算学下台大的这门机器学习技法. 第一课是对SVM的介绍,虽然之前也学过,但听了一次感觉还是很有收获的.这位博主总结了个大概,具体细节还是 要听课:http://www ...

  4. HDU 1176免费馅饼 DP数塔问题转化

    L - 免费馅饼 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  5. 基本二叉搜索树的第K小元素

    #include<stdio.h> #include<stdlib.h> typedef struct node *btlink; struct node { int data ...

  6. 【UGUI】Canvas和Rect Transform

    Canvas 1.所有的UI元件都需要放在Canvas里 2.UI元件的绘制顺序,与在 Hierarchy的顺序相同,在上面的元素会先被绘制,位于后续绘制元素的下面 3.可以选择3种不同的渲染模式: ...

  7. codeforces C. Arithmetic Progression 解题报告

    题目链接:http://codeforces.com/problemset/problem/382/C 题目意思:给定一个序列,问是否可以通过只插入一个数来使得整个序列成为等差数列,求出总共有多少可能 ...

  8. java关闭流,解压缩后的清除

    关闭流文件和file文件的时候,先打开的后关闭,后打开的先关闭,实在不行调用system.jc()方法

  9. 【python】linux将python改为默认3.4版本

    Python3.4默认是安装在/usr/local/lib/python3.4目录下,需要删除默认python link文件,重新建立连接关系. 使用ln -s命令来修改,命令如下: sudo rm ...

  10. hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)

    Nim or not Nim? Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub ...