做这个题的时候超时了一次,因为遍历序列的时候用了两层for来处理每个位置的最小值,最差复杂度高达9* 10^10,已经不是2s能完成的了,计算机大概1s只能处理10^8/10^9次方的数据。

后来改用两个一层for循环,先从前向后,再从后向前遍历(顺序怎么样都行),然后就ok了,这样子的复杂度只有(3* 10^5)* 2,可以通过。

#include<bits/stdc++.h>
using namespace std;
const int M=3e5+5;
int a[M];
typedef long long ll;
ll tep[M];
int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int t; cin>>t;
	while(t--){
		int n,k; cin>>n>>k;
        for(int i=0;i<=n+1;i++) tep[i]=0x3f3f3f3f;
		for(int i=1;i<=k;i++){
			cin>>a[i];
		}
		for(int i=1;i<=k;i++){
			cin>>tep[a[i]];
		}
        
		for(int i=1;i<=n;i++) tep[i]=min(tep[i],tep[i-1]+1);
        for(int i=n;i>=1;i--) tep[i]=min(tep[i],tep[i+1]+1);
		for(int i=1;i<=n;i++) cout<<tep[i]<<" ";
		cout<<endl;
	}
	return 0;
}