给你一个n2的程序,告诉你用a,b数组,按照程序模拟出c
但是时限n2肯定过不去,必须要优化到nlogn
但是看不出什么正解,因为如果两个完全有序的数列,就需要n2才能构造出c
再次读题发现数据完全随机生成,所以一般不可能会完全有序
所以可以直接n2的暴力
枚举最大值,然后找a,b里加起来是这个和的数字出现的位置
当c里满了n个直接break
代码:
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;
#define MAX 200010
#define MAXN 1000005
#define maxnode 5
#define sigma_size 30
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lrt rt<<1
#define rrt rt<<1|1
#define middle int m=(r+l)>>1
#define LL long long
#define ull unsigned long long
#define mem(x,v) memset(x,v,sizeof(x))
#define lowbit(x) (x&-x)
#define pii pair<int,int>
#define bits(a) __builtin_popcount(a)
#define mk make_pair
#define limit 10000
//const int prime = 999983;
const int INF = 0x3f3f3f3f;
const LL INFF = 0x3f3f;
const double pi = acos(-1.0);
const double inf = 1e18;
const double eps = 1e-6;
//const LL mod = 1e9+7;
const ull mx = 133333331;
/*****************************************************/
inline void RI(int &x) {
char c;
while((c=getchar())<'0' || c>'9');
x=c-'0';
while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0';
}
/*****************************************************/
int a[MAX],b[MAX];
int c[MAX];
int main(){
//freopen("in.txt","r",stdin);
int n;
cin>>n;
for(int i=0;i<n;i++) {
int x;
scanf("%d",&x);
a[x]=i;
}
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
b[x]=i;
}
int num=0;
mem(c,-1);
for(int i=2*n-2;;i--){
for(int j=n-1;j>=0;j--){
int k=i-j;
if(k<0||k>=n) break;
int x=a[j];
int y=b[k];
if(c[(x+y)%n]==-1){
c[(x+y)%n]=i;
num++;
}
if(num==n) break;
}
if(num==n) break;
}
for(int i=0;i<n;i++){
printf("%d",c[i]);
if(i!=n-1) printf(" ");
else printf("\n");
}
return 0;
}