题目传送门
1 /*
2 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件
3 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小,该人能 被邀请,而且不用考虑最少人数的条件。网上的写的比我简洁,学习了。
4 详细解释:http://blog.csdn.net/queuelovestack/article/details/47319361
5 */
6 /************************************************
7 * Author :Running_Time
8 * Created Time :2015-8-6 14:51:47
9 * File Name :H.cpp
10 ************************************************/
11
12 #include <cstdio>
13 #include <algorithm>
14 #include <iostream>
15 #include <sstream>
16 #include <cstring>
17 #include <cmath>
18 #include <string>
19 #include <vector>
20 #include <queue>
21 #include <deque>
22 #include <stack>
23 #include <list>
24 #include <map>
25 #include <set>
26 #include <bitset>
27 #include <cstdlib>
28 #include <ctime>
29 using namespace std;
30
31 #define lson l, mid, rt << 1
32 #define rson mid + 1, r, rt << 1 | 1
33 typedef long long ll;
34 const int MAXN = 1e5 + 10;
35 const int INF = 0x3f3f3f3f;
36 const int MOD = 1e9 + 7;
37 struct Node {
38 int l, r, id;
39 bool operator < (const Node &x) const {
40 return r > x.r;
41 }
42 }node[MAXN];
43 priority_queue<Node> Q;
44 bool vis[MAXN];
45 int ans[MAXN];
46 int n;
47
48 bool cmp(Node x, Node y) {
49 if (x.l == y.l) return x.r < y.r;
50 return x.l < y.l;
51 }
52
53 int main(void) { //HDOJ 5360 Hiking
54 int T; scanf ("%d", &T);
55 while (T--) {
56 scanf ("%d", &n);
57 for (int i=1; i<=n; ++i) {
58 scanf ("%d", &node[i].l); node[i].id = i;
59 }
60 for (int i=1; i<=n; ++i) {
61 scanf ("%d", &node[i].r);
62 }
63 sort (node+1, node+1+n, cmp);
64
65 if (node[1].l != 0) {
66 puts ("0");
67 for (int i=1; i<=n; ++i) printf ("%d%c", i, (i==n) ? '
' : ' ');
68 continue;
69 }
70 memset (vis, false, sizeof (vis));
71 while (!Q.empty ()) Q.pop ();
72 int i = 1, p = 0;
73 for (; i<=n && p==node[i].l; ++i) Q.push (node[i]);
74 while (!Q.empty ()) {
75 while (!Q.empty ()) {
76 if (p <= Q.top ().r) {
77 ans[++p] = Q.top ().id;
78 vis[ans[p]] = true; Q.pop (); break;
79 }
80 else Q.pop ();
81 }
82 for (; i<=n && p==node[i].l; ++i) Q.push (node[i]);
83 }
84
85 printf ("%d
", p);
86 printf ("%d", ans[1]);
87 for (int i=2; i<=p; ++i) {
88 printf (" %d", ans[i]);
89 }
90 for (int i=1; i<=n; ++i) {
91 if (!vis[i]) printf (" %d", i);
92 }
93 puts ("");
94 }
95
96 return 0;
97 }