Task schedule
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3490 Accepted Submission(s): 1221
Problem Description
有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务。
有m个询问,每个询问有一个数字q,表示如果在q时间有一个工作表之外的任务请求,请计算何时这个任务才能被执行。
机器总是按照工作表执行,当机器空闲时立即执行工作表之外的任务请求。
有m个询问,每个询问有一个数字q,表示如果在q时间有一个工作表之外的任务请求,请计算何时这个任务才能被执行。
机器总是按照工作表执行,当机器空闲时立即执行工作表之外的任务请求。
Input
输入的第一行包含一个整数T, 表示一共有T组测试数据。
对于每组测试数据:
第一行是两个数字n, m,表示工作表里面有n个任务, 有m个询问;
第二行是n个不同的数字t1, t2, t3....tn,表示机器在ti时间执行第i个任务。
接下来m行,每一行有一个数字q,表示在q时间有一个工作表之外的任务请求。
特别提醒:m个询问之间是无关的。
[Technical Specification]
1. T <= 50
2. 1 <= n, m <= 10^5
3. 1 <= ti <= 2*10^5, 1 <= i <= n
4. 1 <= q <= 2*10^5
对于每组测试数据:
第一行是两个数字n, m,表示工作表里面有n个任务, 有m个询问;
第二行是n个不同的数字t1, t2, t3....tn,表示机器在ti时间执行第i个任务。
接下来m行,每一行有一个数字q,表示在q时间有一个工作表之外的任务请求。
特别提醒:m个询问之间是无关的。
[Technical Specification]
1. T <= 50
2. 1 <= n, m <= 10^5
3. 1 <= ti <= 2*10^5, 1 <= i <= n
4. 1 <= q <= 2*10^5
Output
对于每一个询问,请计算并输出该任务何时才能被执行,每个询问输出一行。
Sample Input
1 5 5 1 2 3 5 6 1 2 3 4 5
Sample Output
4 4 4 4 7
Source
因为数据范围在1*1e5内且询问较多且询问间没有联系,所以考虑离线处理,先对所有询问进行输入然后同时对所有询问进行处理,只需要两次排序加上一次遍历就可以了,ti可能是打乱的所以要先排个序,然后对输入的询问进行排序,为了输出还要保存原有的输入,最后输出答案
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N = 2e5 +10;
int T,n,m;
int a[N];
int b[N],c[N],ans[N];
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<m;i++){
scanf("%d",&b[i]);
c[i] = b[i];
}
sort(c,c+m); sort(a,a+n);
int pos = 0;
while(pos<m&&c[pos]<a[0]) {
ans[c[pos]] = c[pos];
pos++;
}
for(int i=1;i<n;i++){
if(a[i-1]+1<a[i]){
while(pos<m&&c[pos]<a[i]) {
ans[c[pos]] = max(a[i-1]+1,c[pos]);
pos++;
}
}
}
while(pos<m){
ans[c[pos]] = max(a[n-1]+1,c[pos]);
pos++;
}
for(int i=0;i<m;i++){
printf("%d\n",ans[b[i]]);
}
}
return 0;
}
对所有输入的数进行预处理会更简单些,保存每个出现过的数的最长连续到的位置
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
const int N = 2e5+10;
int T,n,m,a,nx[N],q;
int main()
{
for(scanf("%d",&T); T--;){
memset(nx,0,sizeof nx);
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++){
scanf("%d",&a);
nx[a] = 1;
}
for(int i=0;i<N;i++){
if(nx[i]==0) continue;
int pos = i;
while(nx[++pos]!=0);
for(int j=i;j<pos;j++){
nx[j] = pos;
}
i = pos;
}
while(m--){
scanf("%d",&q);
printf("%d\n",nx[q]==0?q:nx[q]);
}
}
return 0;
}