codevs 1471 线段 前缀和

版权声明:个人水平有限,表述不当或疏漏之处欢迎读者提问交流,共同进步! 作者:J__Max 非商业转载请注明出处,商业转载请联系作者获得授权。 https://blog.csdn.net/J__Max/article/details/83339877

codevs 1471 线段 前缀和

  • 传送门:http://codevs.cn/problem/1471/

  • 这道题就是简单的一维前缀和问题,其中心思想就是:对一个输入的线段,其左端点加一,右端点后一位减一,以此来标记一条线段。最后通过累计前缀和,就能够得到每个点在线段中出现的次数,这个技巧不难理解

  • 还有其它的题目类型,比如求二维前缀和、结合差分等,后续有做到这类题再进行记录

  • 代码如下:

//
//  main.cpp
//  progress
//
//  Created by J__Max on 2018/10/19.
//  Copyright © 2018年 J__Max. All rights reserved.
//

#include <iostream>
#include <stdio.h>

#define MAXN 50000 + 10

using namespace std;

int a[MAXN], ans[MAXN];

void solve(){
    int n, m;
    int l, r;
    cin>>n;
    for(int i=0; i<n; i++){
        scanf("%d%d",&l, &r);
        //对一个输入的线段,其左端点加一,右端点后一位减一,以此来标记一条线段
        a[l]++;
        a[r+1]--;
    }
    for(int i=0; i<=50000; i++){
        //累计前缀和
        ans[i] = ans[i-1] + a[i];
    }
    cin>>m;
    for(int i=0; i<m; i++){
        scanf("%d", &l);
        printf("%d\n", ans[l]);
    }
}

int main(int argc, const char * argv[]) {
    solve();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/J__Max/article/details/83339877