二分
l,r
//右边界
{
mid=(l+r)/2;
if check l=mid;
else r=mid+1;
return l;
}
//左边界
{
mid=(l+r+1)/2;
if check l=mid-1;
else r=mid;
return l;
}
前缀和
一次
q[i]=q[i-1]+a[i]
输出
q[l]-q[r]
二次
//q[][]前缀和,a[][]数
循环i
循环j
q[i][j]=a[i][j]+q[i-1][j]+q[i][j-1]-q[i-1][j-1]
输出
q[x2][y2]-q[x1-1][y2]-q[x2][y1-1]+q[x1-1][y1-1]
差分
一次
void insert (l,r,c)
{
b[l]+=c;
b[r+1]-=c;
}
for(int i=0;i<=n;i++) insert(i,i,a[i]); //构造b[]数组
while(m--)
{
scanf l,r,c
insert(l,r,c);
}
for(i=1;i<=n;i++) b[i]+=b[i-1];
for printf b[i]
二次
void insert (x1,y1,x2,y2,c)
{
b[x1][y1]+=c;
b[x2+1][y1]-=c;
b[x1][y2+1]-=c;
b[x2][y2]+=c;
}
for i
for j
insert(i,j,i,j,c); //构造b
while(q--)
insert()
for i
for j
b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];
printf b[i][j];