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