1. 题目要求
2. 前提
3. 思想
1.暴力解法,两重循环,70分
2.差分算法,100分。
思想:求出每个场所的最早准入时间和最晚准入时间,用差分数组存起来,则每个[L,R]区间内都是>=1的数,区间之外的数字都是0。对于每个查询,只要核酸结果在这些区间中,就能求出有几个场所可以去。
但我理解不了人家代码里的L,R是怎么求出来的,/(ㄒoㄒ)/~~(后面的固定套路,+1,-1,求前缀和我倒是理解。)
3. 代码
(70分代码)(两重循环,运行超时)
#include <iostream>
#include <vector>
using namespace std;
/*
n-出行计划数目
m-查询个数
k-等待核酸检测结果所需时间
**/
int main(){
int n,m,k;
cin >> n>> m >> k;
int startTime,ans, endTime;
vector<int> t(n+1);//出行去i场所的时间t[i]
vector<int> c(n+1);//该场所需持有c[i]个单位时间内的核酸检测结果入内
vector<int> q(m+1);//如果在q[i]时刻做了核酸检测,有多少项出行计划的核酸检测要求可以得到满足?
for(int i = 1; i <= n; i++){
cin>> t[i] >> c[i];
}
for(int i = 1; i <= m; i++){
cin >> q[i];
startTime = q[i]+k;
ans = 0;
for(int j = 1; j <= n; j++){
endTime = startTime+c[j]-1;
if(startTime<=t[j]&&t[j]<=endTime)
ans++;
}
cout << ans <<endl;
}
}
//进场时间t、限制时间c、检测时间q、等待时间k
//有效期【检测时间+等待时间,检测时间+等待时间+限制时间-1】
//即[q+k,q+k+c-1]
//需要满足 q+k<=t<=q+k+c-1
//即 t−k−c+1≤q≤t−k 对检测时间q进行判断 是否在区间内
#include<bits/stdc++.h>
using namespace std;
using LL = long long;//重命名 C++11
const int N = 4e5 + 10;
int f[N];
int main ( ) {
int n, m, k, t, c;
cin >> n >> m >> k;//出行计划数目、查询个数以及等待核酸检测结果所需时间。
for (int i = 0; i < n; ++i)
{
cin >> t >> c;//进场时间 限制时间
// 则 在[l, r] 时间段内做核酸 则此时可以通行
int l = t - k - c + 1 > 0 ? t - k - c + 1 : 1; //不理解怎么求出来的,也不理解为什么可以是1.
int r = t - k > 0 ? t - k : 1;//不理解怎么求出来的,也不理解为什么可以是1.
// 差分数组更新 (下面的代码都是固定套路,可以理解)
f[l] += 1; //相当于[l...]都加1
f[r + 1] -= 1;//相当于[r+1...]都-1
//也就是[l..r]都加一 如果是[l..r]那么可以通行数目+1
}
// 差分数组 预处理
for (int i = 1; i < N; ++i)
{
f[i] += f[i - 1];
}
int q;
for (int i = 0; i < m; ++i)
{
cin >> q;//检测时间
cout << f[q] << endl; // 直接查询 q 时刻可以通行 的数目
}
return 0;
}
4. 结果
5. 总结
6. 参考代码
https://www.cnblogs.com/kay425/articles/17144232.html