Advertisement
cmiN

tentativa

Mar 25th, 2012
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.38 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7.  
  8. struct Obj {
  9.  
  10.     int cost, size;
  11.     int id;
  12.  
  13.     Obj(int cost=0, int size=0, int id=-1)
  14.     {
  15.         this->cost = cost;
  16.         this->size = size;
  17.         this->id = id + 1;
  18.     }
  19. };
  20.  
  21.  
  22. struct Comp {
  23.  
  24.     bool operator()(const Obj& a, const Obj& b) const
  25.     {
  26.         /// Decreasing order.
  27.         return a.size > b.size;
  28.     }
  29. };
  30.  
  31.  
  32. typedef unsigned long long ull_t;
  33. typedef vector<Obj> vO_t;
  34. typedef vector<pair<int, int> > vp_t;
  35. typedef vector<int> vi_t;
  36.  
  37.  
  38. int n, m;
  39. vO_t shoe, client;
  40. ull_t maxProfit;
  41. ull_t* dp[3];
  42. vp_t soldIndex;
  43. vector<vi_t > adjList;
  44. vi_t picked;
  45. vector<bool> seen;
  46.  
  47.  
  48. ull_t max_state(int state)
  49. {
  50.     return max(dp[0][state], max(dp[1][state], dp[2][state]));
  51. }
  52.  
  53.  
  54. void show_dp(int state)
  55. {
  56.     /// Debugging.
  57.     for (int i = 0; i < 3; ++i) {
  58.         cerr << dp[i][state] << " ";
  59.     }
  60.     cerr << endl;
  61. }
  62.  
  63.  
  64. void solve()
  65. {
  66.     // generate first phase
  67.     Obj item = client[0];
  68.     int lastSize = item.size;
  69.     dp[0][0] = dp[1][0] = dp[2][0] = 0;
  70.     vO_t::iterator src = lower_bound(shoe.begin(), shoe.end(), item, Comp());
  71.     if (src->size == item.size && src->cost <= item.cost) {
  72.         dp[1][0] = src->cost;
  73.     }
  74.     ++item.size;
  75.     src = lower_bound(shoe.begin(), shoe.end(), item, Comp());
  76.     if (src->size == item.size && src->cost <= item.cost) {
  77.         dp[2][0] = src->cost;
  78.     }
  79.     //show_dp(0);
  80.     ////////////////////////////
  81.     for (int i = 1; i < m; ++i) {
  82.         // init state
  83.         ull_t maxBefore = max_state(i - 1);
  84.         dp[0][i] = dp[1][i] = dp[2][i] = maxBefore;
  85.         // extract client and find a matching shoe for him
  86.         item = client[i];
  87.         bool low = lastSize - item.size; // 0-(client with same size)
  88.         int tmpLastSize = lastSize;
  89.         lastSize = item.size;
  90.         // for l and l+1
  91.         for (; item.size <= lastSize + 1; ++item.size) {
  92.             src = lower_bound(shoe.begin(), shoe.end(), item, Comp());
  93.             // check if he has enough money
  94.             if (src->size == item.size && src->cost <= item.cost) {
  95.                 if (low) {
  96.                     if (item.size == lastSize) {
  97.                         dp[1][i] += src->cost;
  98.                     } else if (item.size == tmpLastSize) {
  99.                         //dp[2][i] += src->cost + dp[2][i - 1] - dp[0][i - 1]); busit
  100.                     } else {
  101.                         dp[2][i] += src->cost;
  102.                     }
  103.                 } else {
  104.                     if (item.size == lastSize) {
  105.                         //dp[1][i] = src->cost + si mai busit
  106.                     } else {
  107.                         //dp[2][i] = ................. /// pula-n pizda ;]
  108.                     }
  109.                 }
  110.             }
  111.         }
  112.     }
  113.     maxProfit = max_state(m - 1);
  114. }
  115.  
  116.  
  117. void go_back()
  118. {
  119.     ull_t crtProfit = maxProfit;
  120.     for (int i = m - 1; i >= 0; --i) {
  121.         if (crtProfit == dp[0][i]) continue;
  122.         Obj item = client[i];
  123.         if (crtProfit == dp[2][i]) ++item.size;
  124.         vO_t::iterator src = lower_bound(shoe.begin(), shoe.end(), item, Comp());
  125.         soldIndex.push_back(make_pair(item.id, src->id));
  126.         crtProfit -= src->cost;
  127.     }
  128. }
  129.  
  130.  
  131. void test()
  132. {
  133.     for (int i = 0; i < n; ++i) {
  134.         Obj tmp = shoe[i];
  135.         cerr << tmp.id << " " << tmp.cost << " " << tmp.size << endl;
  136.     }
  137.     for (int i = 0; i < m; ++i) {
  138.         Obj tmp = client[i];
  139.         cerr << tmp.id << " " << tmp.cost << " " << tmp.size << endl;
  140.     }
  141.     cerr << "=============\n";
  142.     for (int i = m - 1; i >= 0; --i) {
  143.         Obj item = client[i];
  144.         ++item.size;
  145.         vO_t::iterator src = lower_bound(shoe.begin(), shoe.end(), item, Comp());
  146.         cerr << "For client with id: " << item.id << " money: " << item.cost << " and size: " << item.size;
  147.         cerr << " shoe with id: " << src->id << " cost: " << src->cost << " and size: " << src->size << endl;
  148.     }
  149. }
  150.  
  151.  
  152. void solve2()
  153. {
  154.     for (int i = 0; i < m; ++i) {
  155.         Obj cl = client[i];
  156.         //cerr << "Client: " << cl.id << " Marime: " << cl.size << endl;
  157.         int clSize = cl.size;
  158.         ++cl.size;
  159.         vO_t::iterator it = lower_bound(shoe.begin(), shoe.end(), cl, Comp());
  160.         //cerr << "Adidas: " << it->id << " Marime: " << it->size << endl << endl;
  161.         for (; it != shoe.end() && (it->size == clSize || it->size == clSize + 1); it++) {
  162.             //cerr << cl.id << " " << it->id << endl;
  163.             if (cl.cost >= it->cost) adjList[it->id].push_back(cl.id);
  164.         }
  165.     }
  166. }
  167.  
  168.  
  169. bool pick(int id)
  170. {
  171.     for (int i = 0; i < adjList[id].size(); ++i) {
  172.         int clid = adjList[id][i];
  173.         if (seen[clid]) continue;
  174.         seen[clid] = true;
  175.         if (!picked[clid] || pick(picked[clid])) {
  176.             picked[clid] = id;
  177.             return true;
  178.         }
  179.     }
  180.     return false;
  181. }
  182.  
  183.  
  184. void go_back2()
  185. {
  186.     for (int i = 0; i < n; ++i) {
  187.         seen.clear();
  188.         if (pick(shoe[i].id)) {
  189.             ++picked[0];
  190.             maxProfit += shoe[i].cost;
  191.         }
  192.     }
  193.     for (int i = 1; i <= m; ++i) {
  194.         if (picked[i]) soldIndex.push_back(make_pair(i, picked[i]));
  195.     }
  196. }
  197.  
  198.  
  199. void test2()
  200. {
  201.     for (int i = 0; i < adjList.size(); ++i) {
  202.         for (int j = 0; j < adjList[i].size(); ++j) {
  203.             cerr << i << " " << j << endl;
  204.         }
  205.     }
  206. }
  207.  
  208.  
  209. int main()
  210. {
  211.     //freopen("D.in", "r", stdin);
  212.     cin >> n;
  213.     shoe.resize(n);
  214.     adjList.resize(n + 1);
  215.     for (int i = 0; i < n; ++i) {
  216.         int cost, size;
  217.         cin >> cost >> size;
  218.         shoe[i] = Obj(cost, size, i);
  219.     }
  220.     cin >> m;
  221.     //for (int i = 0; i < 3; ++i) dp[i] = new ull_t[m];
  222.     client.resize(m);
  223.     seen.resize(m);
  224.     picked.resize(m + 1);
  225.     for (int i = 0; i < m; ++i) {
  226.         int money, size;
  227.         cin >> money >> size;
  228.         client[i] = Obj(money, size, i);
  229.     }
  230.     sort(shoe.begin(), shoe.end(), Comp());
  231.     sort(client.begin(), client.end(), Comp());
  232.     //test();
  233.     //solve();
  234.     solve2();
  235.     //test2();
  236.     go_back2();
  237.     cout << maxProfit << '\n';
  238.     //go_back();
  239.     cout << soldIndex.size() << '\n';
  240.     for (int i = 0; i < soldIndex.size(); ++i) {
  241.         cout << soldIndex[i].first << ' ' << soldIndex[i].second << '\n';
  242.     }
  243.     //for (int i = 0; i < 3; ++i) delete[] dp[i];
  244.     return 0;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement