main.cc 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <queue>
  4. #include <set>
  5. using std::sort; using std::priority_queue; using std::set;
  6. const int N = 1000;
  7. const int A = 1000;
  8. struct Dog {
  9. int p;
  10. int a;
  11. int n;
  12. Dog(int p = 0, int a = 0, int n = 1) : p(p), a(a), n(n) {}
  13. bool operator<(const Dog &that) const {
  14. if (this->p == that.p) return this->a < that.a;
  15. return this->p < that.p;
  16. }
  17. } dogs[N];
  18. struct Node {
  19. int t;
  20. int i;
  21. int a;
  22. int k;
  23. Node(int t, int i, int a, int k) : t(t), i(i), a(a), k(k) {}
  24. bool operator<(const Node &that) const {
  25. return that.t < this->t;
  26. }
  27. };
  28. int main() {
  29. int T = 0, n, k;
  30. scanf("%d", &T);
  31. for (int t = 1; t <= T; t++) {
  32. scanf("%d %d", &n, &k);
  33. for (int i = 0; i < n; i++)
  34. scanf("%d", &dogs[i].p);
  35. set<int> colors;
  36. for (int i = 0; i < n; i++) {
  37. scanf("%d", &dogs[i].a);
  38. colors.insert(dogs[i].a);
  39. }
  40. sort(dogs, dogs + n);
  41. int d = 0, aa = dogs[0].a, pp = dogs[0].p;
  42. for (int i = 1; i < n; i++) {
  43. if (dogs[i].a == aa && dogs[i].p == pp) {
  44. dogs[d].n++;
  45. } else {
  46. dogs[++d] = dogs[i];
  47. aa = dogs[d].a;
  48. pp = dogs[d].p;
  49. }
  50. }
  51. n = d + 1;
  52. priority_queue<Node> pq;
  53. pq.emplace(0, -1, *colors.begin(), 0);
  54. Node tp(0, -1, 0, 0);
  55. while (!pq.empty()) {
  56. tp = pq.top();
  57. pq.pop();
  58. if (k <= tp.k) break;
  59. int pos = tp.i == -1 ? 0 : dogs[tp.i].p;
  60. set<int>::iterator it = ++colors.find(tp.a);
  61. if (it != colors.end()) pq.emplace(tp.t + pos, -1, *it, tp.k);
  62. int nxt = tp.i + 1;
  63. for (; nxt < n && dogs[nxt].a != tp.a; nxt++) {}
  64. if (nxt < n) pq.emplace(tp.t + dogs[nxt].p - pos, nxt, tp.a, tp.k + dogs[nxt].n);
  65. }
  66. printf("Case #%d: %d\n", t, tp.t);
  67. }
  68. return 0;
  69. }