传送门
题目:
Example
input
5
6 2
2 5
14 16
10 1
7
30
5 5
3 1 4 2 5
3 1 4 2 5
7 1
1
1000000000
6 3
6 1 3
5 5 5
output
15 14 15 16 16 17
36 35 34 33 32 31 30 31 32 33
1 2 3 4 5
1000000000 1000000001 1000000002 1000000003 1000000004 1000000005 1000000006
5 6 5 6 6 5
大致题意:
长为n的序列,有k个空调在序列之中,每个空调占一格,每个格子都有一个温度,温度取决于
公式,求每一个格子的温度多少
思路:左右各取一次最小值
代码:
#include <bits/stdc++.h>
using namespace std;
//typedef long long ll;
#define int long long
const int N=3e5+10;
const int inf=0x3f3f3f3f;
const double pi=acos(-1);
const double eps=1e-10;
int a[N],b[N];
signed main(){
ios::sync_with_stdio(false);
int t;cin>>t;
while(t--){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)b[i]=inf;
for(int i=1;i<=k;i++)cin>>a[i];
for(int i=1;i<=k;i++)cin>>b[a[i]];
for(int i=2;i<=n;i++)b[i]=min(b[i],b[i-1]+1);
for(int i=n-1;i>0;i--)b[i]=min(b[i],b[i+1]+1);
for(int i=1;i<=n;i++)cout<<b[i]<<' ';
cout<<endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
//typedef long long ll;
#define int long long
const int N=3e5+10;
const int inf=0x3f3f3f3f;
const double pi=acos(-1);
const double eps=1e-10;
int a[N],b[N];
signed main(){
ios::sync_with_stdio(false);
int t;cin>>t;
while(t--){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)b[i]=inf;
for(int i=1;i<=k;i++)cin>>a[i];
for(int i=1;i<=k;i++)cin>>b[a[i]];
for(int i=2;i<=n;i++)b[i]=min(b[i],b[i-1]+1);
for(int i=n-1;i>0;i--)b[i]=min(b[i],b[i+1]+1);
for(int i=1;i<=n;i++)cout<<b[i]<<' ';
cout<<endl;
}
return 0;
}