1 前缀和的应用:快速求范围内的和
#include<vector>
using namespace std;
class rangesum1//普通的数组区间求和
{
private:
vector<int> arr;
public:
rangesum1(const vector<int> &array):arr(array) {}
int rangesum(int L,int R)
{
int sum=0;
for(int i=L; i<=R;i++)
{
sum+=arr[i];
}
return sum;
}
};
class rangesum2//前缀和方法
{
private:
vector<int> presum;
public:
rangesum2(const vector<int> &array)//生成前缀和数组
{
int N=array.size();
presum.resize(N);
presum[0]=array[0];
for(int i=1;i<N;i++)
{
presum[i]=presum[i-1]+array[i];
}
}
int rangesum(int L,int R)
{
return L==0?presum[R]:presum[R]-presum[L-1];
}
};
2一个随机的数到另一个随机的数
#include<bits/stdc++.h>
int f()
{
srand(0);
return rand()%5+1;
//黑盒产生一个等概率1到5的随机数,该黑盒不能修改
}
int a()//先把黑盒内部的数范围转到0到1
//方法:将1 2 3 4 5分为两部分,当是3的时候继续跑,1 2时候是0,4 5时候是1
{
int ans=0;
do
{
ans=f();
}while(ans==3);
return ans<3?0:1;
}
int b()
//把0到1范围转到0到6范围,0 1组成的三位二进制数最大为111(7)
{
int ans=0;
do
{
ans=(a()<<2)+(a()<<1)+a();
}while(ans==7)//最大范围只能到6
return ans;
}
int c()//等概率返回1到7
{
return b()+1;
}
#include<bits/stdc++.h>
int x()//不等概率0到1
{
srand(0);
return rand()<0.8?1:0;
}
int y()//等概率0到1
{
int ans=0;
do
{
ans=x();
}while(ans==x());
return ans;
}