某类线段树的复杂度分析
来源:互联网 发布:淘宝卖家刷钻 编辑:程序博客网 时间:2024/05/16 05:15
题目:http://codeforces.com/contest/610/problem/E
题意:给出一个长为
分析:考虑询问,令
题解给出了一种
代码:
#include<bits/stdc++.h>using namespace std;#define ls l,mid,x<<1#define rs mid+1,r,x<<1|1const int Maxn=200020;int n,m,k;char s[Maxn];int a[Maxn<<2];int rep[22][22],rk[22];void push_up(int x){ if(a[x<<1]==a[x<<1|1])a[x]=a[x<<1]; else a[x]=-1;}void push_down(int x){ if(a[x]!=-1) { a[x<<1]=a[x<<1|1]=a[x]; }}void build(int l,int r,int x){ if(l==r){a[x]=s[l]-'a';return;} a[x]=-1; int mid=(l+r)>>1; build(ls);build(rs); push_up(x);}int query(int tar,int l,int r,int x){ if(l==r||a[x]!=-1)return a[x]; int mid=(l+r)>>1; if(tar<=mid)return query(tar,ls); return query(tar,rs);}int tpc;//前一个字符,应该初始化为>10void ask(int L,int R,int l,int r,int x)//注意边界{ int mid=(l+r)>>1; if(L<=l&&R>=r) { if(a[x]!=-1){rep[tpc][a[x]]--;rep[a[x]][a[x]]-=r-l;tpc=a[x];} else{ask(L,R,ls);ask(L,R,rs);} return; } push_down(x); if(L<=mid)ask(L,R,ls); if(R>mid)ask(L,R,rs);}void add(int L,int R,int w,int l,int r,int x){ if(L<=l&&R>=r) { a[x]=w; return; } push_down(x); int mid=(l+r)>>1; if(L<=mid)add(L,R,w,ls); if(R>mid)add(L,R,w,rs); push_up(x);}int main(){ scanf("%d%d%d",&n,&m,&k); scanf("%s",s+1); for(int i=2;i<=n;i++)rep[s[i-1]-'a'][s[i]-'a']++; build(1,n,1); while(m--) { int ty,l,r; char ss[22]; scanf("%d",&ty); if(ty==1) { scanf("%d%d%s",&l,&r,ss); int c=ss[0]-'a'; tpc=20; ask(max(l-1,1),min(n,r+1),1,n,1); add(l,r,c,1,n,1); if(l>1){int t1=query(l-1,1,n,1);rep[t1][c]++;} if(r<n){int t1=query(r+1,1,n,1);rep[c][t1]++;} rep[c][c]+=r-l; } else { scanf("%s",ss); for(int i=0;i<k;i++)rk[ss[i]-'a']=i; int ans=1; for(int i=0;i<k;i++) for(int j=0;j<k;j++) { if(rk[i]>=rk[j])ans+=rep[i][j]; } printf("%d\n",ans); } }}
0 0
- 某类线段树的复杂度分析
- 时间复杂度的分析
- 时间复杂度的分析
- 算法的复杂度分析
- [线段树][简单复杂度分析]LOJ#6029. 「雅礼集训 2017 Day1」市场
- 线段树的理论知识分析
- [线段树 均摊复杂度] BZOJ 2130 魔塔
- [BZOJ2130][均摊复杂度线段树]魔塔
- 递归函数的复杂度分析
- 递归算法的复杂度分析
- 算法的时间复杂度分析
- 算法的时间复杂度分析
- 算法的时间复杂度分析
- 递推式的时间复杂度分析
- 递归时间复杂度的分析
- 算法的时间复杂度分析
- CF816E,奇技淫巧的复杂度分析
- 分析算法的时间复杂度
- python flask 学习笔记1 简单入门
- Mysql 日志
- WinCE6.0+S3C6410 USB驱动架构分析
- 福建省赛 RunningMan fzoj2221
- ReentrantLock对AQS的使用代码分析
- 某类线段树的复杂度分析
- 【C++11】新特性——auto的使用
- 视图
- 和大家交个朋友
- iOS --- OpenGLES之初步认识
- 决策树: ID3算法
- 【小知识】为什么负数除二和右移一位的结果不一样?
- 与UI线程通讯
- 如何在自己程序跳转至微信,新浪,腾讯微博,QQ空间等