思路:贪心。ans为现在已经邀请到的人数,则下一位应该邀请的人应该为符合条件的人(li<=ans<=r)中r最小的,可以用一个优先队列来维护(li<=ri)中r最小的人。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#define N 1000005
#define M 1000005
#define LL long long
#define mod 1000000007
#define INF 0x3f3f3f3f
using namespace std;
int n;
struct node{
int r, id;
node(){}
node(int _r, int _id){
r = _r, id = _id;
}
bool operator < (const node &o) const{
return r > o.r;
}
};
int a[N];
int b[N];
bool vis[N];
vector<node> v[N];
priority_queue<node> q;
void init(){
memset(vis, false, sizeof vis);
for (int i = 0; i <= n; i++)
v[i].clear();
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++){
int x;
scanf("%d", &x);
v[a[i]].push_back(node(x, i));
}
}
void solve(){
int ans = 0;
while (1){
for (int i = 0; i < v[ans].size(); i++){
q.push(v[ans][i]);
}
node temp;
bool flag = false;
while (!q.empty()){
temp = q.top();
q.pop();
if (ans <= temp.r){
ans++;
b[ans] = temp.id;
vis[temp.id] = true;
flag = true;
break;
}
}
if (!flag)break;
}
int k = ans++;
for (int i = 1; i <= n; i++){
if (!vis[i]){
b[ans++] = i;
}
}
printf("%d\n", k);
for (int i = 1; i <= n; i++){
if (i == n)printf("%d\n", b[i]);
else printf("%d ", b[i]);
}
return;
}
int main(){
int t;
cin >> t;
while (t--){
init();
solve();
}
return 0;
}