标签:
莫涛大神。
莫涛队长的算法,%%%%%%%%%
可以在
假如有一个询问[l,r]要转移到一个询问[l1,r1],那么需要的时间为
但是可以发现有时候有些点会被来回算很多次,这样大量浪费了时间,所以莫涛大神就想到了一个方法,把这些询问离线的拍一次序,让有些点可以被算的次数少一些。
l=1;r=0;\\这样初始化可以避免一些不必要的步骤。
fo(i,1,m){
k=a[i].a;t=a[i].b;
if(k>l)update(l,k-1,-1);\\update的1表示加,-1表示减,具体操作因题而异。
else if(k<l)update(k,l-1,1);
if(t>r)update(r+1,t,1);
else if(r>t)update(t+1,r,-1);
l=k;r=t;
}
把序列中的所有点按照
fo(i,1,m){
scanf("%lld%lld",&a[i].a,&a[i].b);
a[i].d=(a[i].a-1)/kuai+1;\\分块
a[i].e=(a[i].b-1)/kuai+1;
a[i].c=i;
}
sort(a+1,a+1+m,cmp);
因为发现|l1-l|+|r1-r|是曼哈顿距离,所以把每个的询问看作是二维平面上的一个点,然后构造最小生成树,沿着树边走即可。
很少用大神说的那么复杂的方法,正常的暴力也挺快的。
时间复杂度为
有两个角度。
角度一:看看右端点。一个块的r最多到n,每次从上一个块到达下一个块的r复杂度为n,一共有
角度二:看看左端点。每次左端点从一个块到另一个块的复杂度为
所以总的复杂度为
1、如前所述,该算法是离线的,这意味着当我们被强制按照特定的顺序查询时,我们不能再使用它。
2、如果有加入和删除操作的话,复杂度就会退化为
其余的离线题目几乎都可以做。
一道莫队算法的入门题。
小Z的袜子
标签:
原文地址:http://blog.csdn.net/doyouseeman/article/details/51340728