Sarnwan 2021-10-14 11:14 采纳率: 75%
浏览 39

c语言双指针数组去重问题

这个大代码是实现求区间和的,可以先不看,直接拉到下面看问题。


#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;

是啥意思

  • 写回答

1条回答 默认 最新

  • 信仰869 2021-10-15 18:45
    关注

    结构体

    typedef struct{
        int num;
        int value;
    }PII;
    

    num是数组下标,value是下标对应的值

    评论

报告相同问题?

问题事件

  • 创建了问题 10月14日

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?