202203-2CCF计算机软件能力认证第二题

202203-2CCF计算机软件能力认证第二题

https://blog.csdn.net/weixin_47700137/article/details/125107563

题目链接

http://118.190.20.162/view.page?gpid=T142

说明

  • 注意区间的选取
  • 注意边界3e5才能过
  • 使用差分代码就很简洁

解决代码

#include
using namespace std;

#define MAX_NUM (int)3e5
#define modify(a) (a>0?a:1)
int n, m, k;
int t[MAX_NUM];
int c[MAX_NUM];
int q[MAX_NUM];
int answer[MAX_NUM];

void function(){
    int diff[MAX_NUM];
    for(int i=0; i<MAX_NUM; i++){
        diff[i]=0;
    }
    int right, left;
    for(int i=0; i<n; i++){
        left=modify(t[i]-c[i]+1);
        right=t[i]+1;
        diff[left]++;
        diff[right]--;
    }
    for(int i=1; i<MAX_NUM; i++){
        diff[i] += diff[i-1];
    }
    for(int i=0; i<m; i++){
        answer[i] = diff[q[i]];
    }
}
int main(){
    cin >> n >> m >> k;
    for(int i=0; i<n; i++){
        cin >> t[i] >> c[i];
    }
    for(int i=0; i<m; i++){
        cin >> q[i];
        q[i] += k;
    }
    function();
    for(int i=0; i<m; i++){
        cout << answer[i] << endl;
    }
    return 0;
}

解决代码二

#include
#include
using namespace std;

#define MAX_NUM (int)250000
#define modify(a) (a>0?a:1)
int n; int m; int k;
int t[MAX_NUM];
int c[MAX_NUM];
int l[MAX_NUM];
int q[MAX_NUM];
int answer[MAX_NUM];

void function(){
    int start[MAX_NUM];
    int end[MAX_NUM];
    int pos;
    sort(l, l+n);

    pos=0;
    for(int i=0; i<n; i++){ //下面两个循环用来 构造 开始时间前缀和数列
        for(;pos<l[i];pos++){
            start[pos]=i;
        }        
    }
    for(; pos<MAX_NUM; pos++){
        start[pos]=n;
    }
    pos=0;
    for(int i=0; i<n; i++){ //下面两个循环用来 构造 结束时间前缀和数列
        for(;pos<=t[i];pos++){
            end[pos]=i;
        }        
    }
    for(; pos<MAX_NUM; pos++){
        end[pos]=n;
    }
    // 对于每个查询统计在这段时间开始和这段时间结束的行程
    for(int i=0; i<m; i++){
        answer[i]=start[q[i]]-end[q[i]];
    }
    return;
}

int main(int argc, char *argv[]){
    cin >> n >> m >>k;
    for(int i=0; i<n; i++){
        cin >> t[i] >> c[i];
        l[i]=modify(t[i]-c[i]+1);
    }
    for(int i=0; i<m; i++){
        cin >> q[i];
        q[i] += k;
    }
    function();
    for(int i=0; i<m; i++){
        cout << answer[i] << endl;
    }
    return 0;
}

你可能感兴趣的:(算法,c++,算法,c语言)