acm代码小技巧总结:
1.RMQ:(Range Minimum/Maximum Query),即区间最值查询,这是一种在线算法,所谓在线算法,是指用户每次输入一个查询,便马上处理一个查询。
设二维数组dp[i][j]表示从第i位开始连续2^j个数中的最小值。例如dp[2][1]就表示从第二位数开始连续两个数的最小值(也就是从第二位数到第三位数的最小值)
初始化(复杂度O(nlogn)):
void rmq_init()
{
for(int i=1;i<=N;i++)
dp[i][0]=arr[i];//初始化
for(int j=1;(1<<j)<=N;j++)
for(int i=1;i+(1<<j)-1<=N;i++)
dp[i][j]=min(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
}
(dp[i][0]就表示第i个数字本身)
查询代码(复杂度O(1)):
int rmq(int l,int r)
{
int k=log2(r-l+1);
return min(dp[l][k],dp[r-(1<<k)+1][k]);
}
2.XK
int pw(int x,int k){
int ret=1;
while(k){
if(k&1) ret=(ll)retx%mod; x=(ll)xx%mod; k>>=1;
}
return ret;
}
来源:CSDN
作者:weixin_43727680
链接:https://blog.csdn.net/weixin_43727680/article/details/103704309