Advertisement
Derga

Untitled

Jan 28th, 2024
938
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.63 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <numeric>
  4. #include <set>
  5. #include <tuple>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. struct Skill {
  11.     int in_development;
  12.     int in_managment;
  13. };
  14.  
  15. struct DifferenceId {
  16.     int difference; //skill in development - skill in managment
  17.     int id;
  18. };
  19.  
  20. bool operator<(const DifferenceId& lhs, const DifferenceId& rhs) {
  21.     if (lhs.difference != rhs.difference) return lhs.difference > rhs.difference;
  22.     return lhs.id < rhs.id;
  23. }
  24.  
  25. vector<Skill> GetSkills() {
  26.     int ppc; //project participants count
  27.     cin >> ppc;
  28.     vector<Skill> skills(ppc);
  29.     for (Skill& skill : skills) {
  30.         cin >> skill.in_development;
  31.     }
  32.     for (Skill& skill : skills) {
  33.         cin >> skill.in_managment;
  34.     }
  35.     return skills;
  36. }
  37.  
  38. void GetSkillImprovement(vector<Skill>& skills, int id) {
  39.     int skill_type, skill_improvement;
  40.     cin >> skill_type >> skill_improvement;
  41.  
  42.     //if (participant_number > skills.size()) throw logic_error("wrong participant number");
  43.     Skill& participant_skill = skills[id - 1];
  44.  
  45.     if (skill_type == 1) participant_skill.in_development += skill_improvement;
  46.     else if (skill_type == 2) participant_skill.in_managment += skill_improvement;
  47.     //else throw logic_error("wrong skill type");
  48. }
  49.  
  50. void GetSkillImprovement(vector<Skill>& skills) {
  51.     int participant_number, skill_type, skill_improvement;
  52.     cin >> participant_number >> skill_type >> skill_improvement;
  53.  
  54.     //if (participant_number > skills.size()) throw logic_error("wrong participant number");
  55.     Skill& participant_skill = skills[participant_number - 1];
  56.  
  57.     if (skill_type == 1) participant_skill.in_development += skill_improvement;
  58.     else if (skill_type == 2) participant_skill.in_managment += skill_improvement;
  59.     //else throw logic_error("wrong skill type");
  60. }
  61.  
  62. DifferenceId GetDifferenceId(vector<Skill>& skills, int id) {
  63.     return { skills[id - 1].in_development - skills[id - 1].in_managment, id};
  64. };
  65.  
  66. int GetCurrentTotalBenefitOfAllParticipants(const vector<Skill>& skills) {
  67.     vector<Skill> skills_copy = skills;
  68.     sort(skills_copy.begin(), skills_copy.end(), [](const Skill& lhs, const Skill& rhs) {
  69.         return (lhs.in_development - lhs.in_managment) > (rhs.in_development - rhs.in_managment);
  70.     });
  71.  
  72.     int benefit_of_developers = accumulate(skills_copy.begin(), skills_copy.begin() + skills_copy.size() / 2,
  73.         0, [](int sum, const Skill& skill) {
  74.         return sum + skill.in_development;
  75.     });
  76.  
  77.     int benefit_of_managers = accumulate(skills_copy.begin() + skills_copy.size() / 2, skills_copy.end(),
  78.         0, [](int sum, const Skill& skill) {
  79.         return sum + skill.in_managment;
  80.     });
  81.  
  82.     return benefit_of_developers + benefit_of_managers;
  83. }
  84.  
  85. //O(m * n * log(n)), O(certificates_count * ppc * log(ppc))
  86. int NaiveSolution(vector<Skill>& skills) {
  87.     GetSkillImprovement(skills);
  88.     return GetCurrentTotalBenefitOfAllParticipants(skills);
  89. }
  90.  
  91. int main() {
  92.     ios::sync_with_stdio(0);
  93.     cin.tie(0);
  94.  
  95.     vector<Skill> skills = GetSkills();
  96.     vector<Skill> skills_copy = skills;
  97.  
  98.     set<DifferenceId> developers;
  99.     set<DifferenceId> managers;
  100.     for (int i = 0; i < skills.size(); ++i) {
  101.         DifferenceId difference_id = GetDifferenceId(skills, i + 1);
  102.         developers.insert(difference_id);
  103.         managers.insert(difference_id);
  104.     }
  105.     for (int i = 0; i < skills.size() / 2; ++i) {
  106.         developers.erase(prev(developers.end()));
  107.         managers.erase(managers.begin());
  108.     }
  109.  
  110.     int developers_benefit = 0;
  111.     for (const auto&[_, id] : developers) {
  112.         developers_benefit += skills[id - 1].in_development;
  113.     }
  114.    
  115.     int managers_benefit = 0;
  116.     for (const auto& [_, id] : managers) {
  117.         managers_benefit += skills[id - 1].in_managment;
  118.     }
  119.  
  120.     int certificates_count;
  121.     cin >> certificates_count;
  122.     for (int i = 0; i < certificates_count; ++i) {
  123.         int id; //id - participant id
  124.         cin >> id;
  125.  
  126.         DifferenceId old_diference_id = GetDifferenceId(skills, id);
  127.         GetSkillImprovement(skills, id);
  128.         DifferenceId new_diference_id = GetDifferenceId(skills, id);
  129.        
  130.         if (developers.count(old_diference_id)) {
  131.             developers.erase(old_diference_id);
  132.             developers_benefit -= skills[old_diference_id.id - 1].in_development;
  133.         } else {
  134.             managers.erase(old_diference_id);
  135.             managers_benefit -= skills[old_diference_id.id - 1].in_managment;
  136.         }
  137.  
  138.         developers.insert(new_diference_id);
  139.         developers_benefit += skills[new_diference_id.id - 1].in_development;
  140.        
  141.         managers.insert(new_diference_id);
  142.         managers_benefit += skills[new_diference_id.id - 1].in_managment;
  143.  
  144.         if (developers.rbegin()->difference < managers.begin()->difference) {
  145.             if (developers.size() < managers.size()) {
  146.                 developers_benefit -= skills[prev(developers.end())->id - 1].in_development;
  147.                 developers.erase(prev(developers.end()));
  148.                
  149.                 developers.insert(*managers.begin());
  150.                 developers_benefit += skills[managers.begin()->id - 1].in_development;
  151.  
  152.                 managers_benefit -= skills[managers.begin()->id - 1].in_managment;
  153.                 managers.erase(managers.begin());
  154.             } else {
  155.                 managers_benefit -= skills[managers.begin()->id - 1].in_managment;
  156.                 managers.erase(managers.begin());
  157.  
  158.                 managers.insert(*prev(developers.end()));
  159.                 managers_benefit += skills[prev(developers.end())->id - 1].in_managment;
  160.  
  161.                 developers_benefit -= skills[prev(developers.end())->id - 1].in_development;
  162.                 developers.erase(prev(developers.end()));
  163.             }
  164.         } else {
  165.             if (developers.size() > managers.size()) {
  166.                 developers_benefit -= skills[prev(developers.end())->id - 1].in_development;
  167.                 developers.erase(prev(developers.end()));
  168.             } else {
  169.                 managers_benefit -= skills[managers.begin()->id - 1].in_managment;
  170.                 managers.erase(managers.begin());
  171.             }
  172.         }
  173.  
  174.  
  175.         cout << developers_benefit + managers_benefit << '\n';
  176.     }
  177. }
  178.  
  179. /*
  180. test1
  181. 4
  182. 7 15 3 4
  183. 10 10 0 6
  184. 3
  185. 1 1 4
  186. 4 1 6
  187. 2 2 10
  188.  
  189. 34
  190. 35
  191. 43
  192. */
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199. int main() {
  200.     ios::sync_with_stdio(0);
  201.     cin.tie(0);
  202.  
  203.     vector<Skill> skills = GetSkills();
  204.     int certificates_count;
  205.     cin >> certificates_count;
  206.     for (int i = 0; i < certificates_count; ++i) {
  207.         cout << NaiveSolution(skills) << '\n';
  208.     }
  209. }
  210.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement