数据结构入门5—分块

来源:互联网 发布:遗传算法的流程图 编辑:程序博客网 时间:2024/06/08 09:34

发现分块真的是一个好东西,就是优化过后的暴力啊

当修改的时间复杂度为O(n)而查询复杂度为O(1)或修改O(1)查询O(n)时用分块就可以转化为修改查询都是O(sqrt(n))的。

虽然比log n要差一些,但是分块真的很好写啊。。

比如一道LCT模板题 弹飞绵羊 

//Serene#include<algorithm>#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>using namespace std;const int maxn=200000+10;int n,m,sz,lp[maxn],tot;int to[maxn],nd[maxn],id[maxn],jp[maxn];int aa;char cc;int read() {aa=0;cc=getchar();while(cc<'0'||cc>'9') cc=getchar();while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();return aa;}int main() {n=read(); sz=sqrt(n);for(int i=1;i<=n;i+=sz) lp[++tot]=i;lp[++tot]=n+1;id[n+1]=tot;int x=1,y,z;for(int i=1;i<=n;++i) to[i]=min(read()+i,n+1),id[i]= i>=lp[x+1]? ++x : x ;for(int i=n;i>=1;--i) {if(id[to[i]]==id[i]) nd[i]=nd[to[i]]+1,jp[i]=jp[to[i]];else nd[i]=1,jp[i]=to[i];}m=read();for(int i=1;i<=m;++i) {x=read();y=read()+1;if(x==1) {z=0;while(id[y]!=tot) {z+=nd[y];y=jp[y];}printf("%d\n",z);}else {z=min(read()+y,n+1);to[y]=z;for(int j=y;j&&id[j]==id[y];j--) {if(id[to[j]]==id[j]) nd[j]=nd[to[j]]+1,jp[j]=jp[to[j]];else nd[j]=1,jp[j]=to[j];}}}return 0;}


原创粉丝点击