这个大代码是实现求区间和的,可以先不看,直接拉到下面看问题。
#include<stdio.h>
#define N 100010
typedef struct{
int num;
int value;
}PII;
PII a[N];
int b[N], n, m;
void quick_sort(int l, int r)
{
if(l >= r) return;
int i = l - 1, j = r + 1, x = a[l].num;
while(i < j)
{
do i ++; while(a[i].num < x);
do j --; while(a[j].num > x);
if(i < j)
{
PII t = a[i];
a[i] = a[j];
a[j] = t;
}
}
quick_sort(l, j);
quick_sort(j + 1, r);
}
int findl(int x) //返回大于等于x的最小值
{
int l = 1, r = n;
while(l < r)
{
int mid = (l + r) >> 1;
if(a[mid].num >= x)
r = mid;
else
l = mid + 1;
}
if(x <= a[l].num)
return l;
else
return n + 1; //x超过最大值
}
int findr(int x) //返回小于等于x的最大值
{
int l = 1, r = n;
while(l < r)
{
int mid = (l + r + 1) >> 1;
if(a[mid].num <= x)
l = mid;
else
r = mid - 1;
}
if(x >= a[l].num)
return l;
else
return 0; //x小于最小值
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++) scanf("%d%d", &a[i].num, &a[i].value);
quick_sort(1, n); //快速排序
int j = 1;
for(int i = 2; i <= n; i ++) //双指针原地去重
{
if(a[i].num == a[j].num)
a[j].value += a[i].value;
else
a[++ j] = a[i];
}
n = j;
//for(int i = 1; i <= n; i ++) printf("%d %d %d\n", i, a[i].num, a[i].value);
for(int i = 1; i <= n; i ++) b[i] = b[i - 1] + a[i].value; //前缀和
while(m --)
{
int l, r;
scanf("%d%d", &l, &r);
l = findl(l), r = findr(r);
printf("%d\n", b[r] - b[l - 1]);
}
return 0;
}
作者:滑稽_ωノ
链接:https://www.acwing.com/activity/content/code/content/96137/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
**想问一下a[i].num 和 a[i].value分别表示什么?
这一段
**
int j = 1;
for(int i = 2; i <= n; i ++) //双指针原地去重
{
if(a[i].num == a[j].num)
a[j].value += a[i].value;
else
a[++ j] = a[i];
}
n = j;
是啥意思