Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("Ofast", "unroll-loops")
- // #pragma GCC target("avx")
- #include <bits/stdc++.h>
- using namespace std;
- // #define int int64_t
- #define double __float80
- using pii = pair<int, int>;
- template <typename T> using Prior = std::priority_queue<T>;
- template <typename T> using prior = std::priority_queue<T, vector<T>, greater<T>>;
- // #define X first
- // #define Y second
- #define eb emplace_back
- #define ef emplace_front
- #define ee emplace
- #define pb pop_back
- #define pf pop_front
- #define ALL(x) begin(x), end(x)
- #define RALL(x) rbegin(x), rend(x)
- #define SZ(x) ((int)(x).size())
- #define fastIO() ios_base::sync_with_stdio(0), cin.tie(0)
- template <typename T> void _do(T &&_t) {cerr << _t << "\n";}
- template <typename T, typename ...U> void _do(T &&_t, U &&..._u) {cerr << _t << ", ", _do(_u...);}
- template <typename T, typename U> bool chmin(T &lhs, U rhs) {return lhs > rhs ? lhs = rhs, 1 : 0;}
- template <typename T, typename U> bool chmax(T &lhs, U rhs) {return lhs < rhs ? lhs = rhs, 1 : 0;}
- void solve() {
- int N, M; cin >> N >> M;
- int K = min(N, 10);
- int key_tok = 0;
- map<string, int> keyword;
- vector<pair<int, vector<pii>>> hotel(N);
- for (auto &h : hotel) {
- cin >> h.first;
- int sz; cin >> sz;
- h.second.resize(sz);
- for (pii &k : h.second) {
- string key; cin >> key >> k.second;
- if (!keyword.count(key)) keyword[key] = ++key_tok;
- k.first = keyword[key];
- }
- }
- sort(ALL(hotel));
- vector<vector<pii>> with_key(key_tok + 1);
- for (int i = 0; i < N; ++i) {
- for (pii k : hotel[i].second) with_key[k.first].eb(i, k.second);
- }
- for (int q = 1; q <= M; ++q) {
- vector<pii> score(N);
- for (int i = 0; i < N; ++i) score[i] = {0, hotel[i].first};
- int L; cin >> L;
- bool flag = false;
- for (int _L = 0; _L < L; ++_L) {
- string key; cin >> key;
- int key_val = keyword[key];
- for (pii h : with_key[key_val]) {
- int idx = h.first;
- int rel = h.second;
- score[idx].first += -rel; /// store negative score
- flag = true;
- }
- }
- if (!flag) {
- cout << -1 << "\n";
- continue;
- }
- nth_element(begin(score), begin(score) + K - 1, end(score));
- sort(begin(score), begin(score) + K);
- // for (int i = 0; i < N; ++i) cout << score[i].first << " " << score[i].second << "\n";
- for (int i = 0; i < K; ++i) {
- if (score[i].first == 0) break;
- if (i) cout << " ";
- cout << score[i].second;
- }
- cout << "\n";
- }
- }
- int32_t main() {
- fastIO();
- int t = 1; // cin >> t;
- for (int _ = 1; _ <= t; ++_) {
- solve();
- }
- return 0;
- }
Advertisement
Advertisement