大意自己看题。
一开始发呆好久相处了怎么求某时刻第i排的数量,结果a,b<=2^30超时,很烦。题解原来直接求出1到i排的个数,f(k,b)-f(k,a-1)。以后看到求区间一定要想到前缀和相减。
#include<cstdio>
#include<cstring>
#define maxl 33
long long c(int k)
{
long long sum=1;
while(k--)
sum*=3;
return sum;
}
long long f(int k,int i)
{
if(i==0) return 0;
if(k==0) return 1; //边界处理很重要
int num=1<<(k-1);
if(i<num)
return 2*f(k-1,i); //在上半边 ,从k-1到k会翻倍
else
return 2*c(k-1)+f(k-1,i-num);
//在下半边 ,则上面一半变2个,下面的则等于i-1<<(k-1)
}
int main()
{
int a,b,t;
long long k,sum=0,suma,sumb;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
suma=0;sumb=0;
scanf("%d%d%d",&k,&a,&b);
sumb=f(k,b);suma=f(k,a-1);
printf("Case %d: %lld\n",i,sumb-suma);
}
return 0;
}
区间查询优化技巧
本文介绍了一种通过前缀和的方法来优化区间查询的问题解决思路。针对某一特定算法问题,作者分享了从最初尝试直接计算每排数量遇到的时间复杂度过高问题,到最终采用求出1到i排的个数并利用f(k,b)-f(k,a-1)的方式显著提高效率的过程。
337

被折叠的 条评论
为什么被折叠?



