Advertisement
Guest User

Untitled

a guest
Feb 24th, 2017
1,771
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.77 KB | None | 0 0
  1. class HashCode {
  2. public:
  3.   struct X {
  4.     int server;
  5.     int latency;
  6.   };
  7.   struct EndPoint{
  8.     int latencyDefault;
  9.     vector<X> latencies;
  10.   };
  11.   struct Request {
  12.     int video;
  13.     int endpoint;
  14.     int id;
  15.     int64_t count;
  16.   };
  17.   void solve(std::ifstream& in, std::ofstream& out) {
  18.     cerr << fixed;
  19.     cerr.precision(20);
  20.     int n_videos, n_endpoints, n_requests, n_servers, capacity;
  21.     in >> n_videos >> n_endpoints >> n_requests >> n_servers >> capacity;
  22.     vector<int> videos(n_videos);
  23.     for (int& i: videos) {
  24.       in >> i;
  25.     }
  26.  
  27.     vector<EndPoint> endpoints(n_endpoints);
  28.     for (int i: range(n_endpoints)) {
  29.       in >> endpoints[i].latencyDefault;
  30.       int k;
  31.       in >> k;
  32.       endpoints[i].latencies.resize(k);
  33.       for (int j: range(k)) {
  34.         in >> endpoints[i].latencies[j].server >> endpoints[i].latencies[j].latency;
  35.       }
  36.     }
  37.  
  38.     vector<Request> requests(n_requests);
  39.     for (int i: range(n_requests)) {
  40.       in >> requests[i].video >> requests[i].endpoint >> requests[i].count;
  41.       requests[i].id = i;
  42.     }
  43.  
  44.     auto best_latency = [&](const Request& request, const vector<set<int>>& answer) {
  45.       int endpoint = request.endpoint;
  46.       int best = endpoints[endpoint].latencyDefault;
  47.       for (const auto& x: endpoints[endpoint].latencies) {
  48.         if (answer[x.server].count(request.video)) {
  49.           best = min(best, x.latency);
  50.         }
  51.       }
  52.       return best;
  53.     };
  54.  
  55.     auto score = [&](const vector<set<int>>& answer) {
  56.       int64_t optimized = 0;
  57.       int64_t all_requests = 0;
  58.       for (auto& request: requests) {
  59.         int endpoint = request.endpoint;
  60.         int best = best_latency(request, answer);
  61.         optimized += (endpoints[endpoint].latencyDefault - best) * request.count;
  62.         all_requests += request.count;
  63.       }
  64.       return optimized * 1000.0 / all_requests;
  65.     };
  66.  
  67.     auto print_ans = [&](const vector<set<int>>& answer) {
  68.       out << answer.size() << "\n";
  69.       for (int i: range((int)answer.size())) {
  70.         out << i;
  71.         for (int ans: answer[i]) {
  72.           out << ' ' << ans;
  73.         }
  74.         out << "\n";
  75.       }
  76.     };
  77.  
  78.     assert(videos[0] <= capacity);
  79.  
  80.     vector<vector<int>> video2requests(n_videos);
  81.     for (auto& request: requests) {
  82.       video2requests[request.video].push_back(request.id);
  83.     }
  84.  
  85.     vector<int> current_capacity(n_servers, capacity);
  86.     vector<set<int>> server2videos(n_servers);
  87.     vector<int> bestLatency(n_requests);
  88.     for (int i: range(n_requests)) {
  89.       bestLatency[i] = endpoints[requests[i].endpoint].latencyDefault;
  90.     }
  91.  
  92.     vector<int> server_count(n_servers);
  93.  
  94.     for (auto& request: requests) {
  95.       int endpoint = request.endpoint;
  96.       for (auto x: endpoints[endpoint].latencies) {
  97.         server_count[x.server] += 2;
  98.       }
  99.     }
  100.  
  101.     auto calc = [&](int64_t improvement, int video_size, int server) {
  102.       return pow(improvement, 1.) / 1.0 / pow(video_size, 1.01) / pow(min(improvement + 1, (int64_t)server_count[server]), 0.38);
  103.     };
  104.     for (int _: range(1)) {
  105.  
  106.       //set<pair<int64_t, pair<int, int>>, greater<pair<int64_t, pair<int, int>>>> scores_sorted;
  107.       auto scores = make_vector<double>(n_videos, n_servers, 0);
  108.       {
  109.         for (auto& request: requests) {
  110.           int endpoint = request.endpoint;
  111.           for (auto x: endpoints[endpoint].latencies) {
  112.             if (current_capacity[x.server] < videos[request.video]) {
  113.               continue;
  114.             }
  115.             int64_t improvement = max(0, bestLatency[request.id] - x.latency) * request.count;
  116.             scores[request.video][x.server] += calc(improvement, videos[request.video], x.server);
  117.           }
  118.         }
  119.       }
  120.       auto lambda = [&](auto& p, auto& q) {
  121.         if (p == q) {
  122.           return false;
  123.         }
  124.         return scores[p.first][p.second] > scores[q.first][q.second] || scores[p.first][p.second] == scores[q.first][q.second] && p < q;
  125.       };
  126.  
  127.       multiset<pair<int, int>, decltype(lambda)> scores_sorted(lambda);
  128.  
  129.       {
  130.         for (int i: range(n_videos)) {
  131.           for (int j: range(n_servers)) {
  132.             //scores_sorted.insert(make_pair(scores[i][j], make_pair(i, j)));
  133.             scores_sorted.emplace(i, j);
  134.           }
  135.         }
  136.       }
  137.  
  138.       while (!scores_sorted.empty()) {
  139.         auto seitem = *scores_sorted.begin();
  140.         scores_sorted.erase(scores_sorted.begin());
  141.         auto video = seitem.first;
  142.         auto server = seitem.second;
  143.         if (current_capacity[server] < videos[video]) {
  144.           continue;
  145.         }
  146.         for (int j: range(n_servers)) {
  147.           int i = video;
  148.           //scores_sorted.erase(make_pair(scores[i][j], make_pair(i, j)));
  149.           scores_sorted.erase(make_pair(i, j));
  150.           scores[video][j] = 0;
  151.         }
  152.  
  153.         current_capacity[server] -= videos[video];
  154.         server2videos[server].insert(video);
  155.  
  156.         for (auto& request: video2requests[video]) {
  157.           assert(requests[request].video == video);
  158.           bestLatency[request] = best_latency(requests[request], server2videos);
  159.           for (auto& x: endpoints[requests[request].endpoint].latencies) {
  160.             int64_t improvement = max(0, bestLatency[request] - x.latency) * requests[request].count;
  161.             scores[video][x.server] += calc(improvement, videos[requests[request].video], x.server);
  162.           }
  163.         }
  164.  
  165.  
  166.         for (int j: range(n_servers)) {
  167.           int i = video;
  168.           if (scores[video][j] > 0 && current_capacity[j] >= videos[video]) {
  169.             //scores_sorted.insert(make_pair(scores[i][j], make_pair(i, j)));
  170.             scores_sorted.emplace(i, j);
  171.           }
  172.         }
  173.  
  174.       }
  175.     }
  176.  
  177.     cerr << score(server2videos) << endl;
  178.     print_ans(server2videos);
  179.   }
  180. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement