1 条题解

  • 0
    @ 2025-4-6 21:50:30

    POJ上又一个通过率较低的模拟题,还有一个是POJ 1025Department1025 Department。 这道题比1025简单了不少,但仍有些难度。 比较难处理的操作就是RunRunCloseMaxMemoryCloseMaxMemory,而这两个操作又比较相似。 不论简单复杂,模拟题的一般思路是分析 事件events(events)。这个题目对要求维护的东西叙述比较明确,所涉及的事件基本上就是所列的若干操作。 实现思路: 用 map<int,pair<int,int>>infomap<int,pair<int,int>> info;维护processprocess的信息 对每个processprocess,用一个 priority_queue que[N]que[N]; 维护其messagemessage队列,这要求将pidpid 离散化,用 map<int,int>idmap<int,int> id;实现。 用两个 set<pair<int,longlong>>memory,hpset<pair<int,long long>> memory, hp; 分别支持CloseMaxMemoryRunCloseMaxMemory、Run两操作

    难点: 如何实时更新上述4个数据结构。

    下面具体叙述如何实现各个操作:

    CreateProcess(PID,Memory,Priority)CreateProcess(PID,Memory,Priority) 更新infoidmemory info, id, memory,初始化 que[id[PID]]que[id[PID]]。

    AddMessage(PID,Priority)AddMessage(PID,Priority) 更新 que[id[pid]]hpque[id[pid]], hp

    RunRun 更新 hphp,对应的 messagemessage队列。

    ChangePriority(PID,NewValue)ChangePriority(PID,NewValue) 更新 info[PID]info[PID],更新hp hp

    GetMemory(PID,Memory)GetMemory(PID,Memory) 更新 memorymemory

    FreeMemory(PID,Memory)FreeMemory(PID,Memory) 更新 memorymemory,可能涉及清除一个processprocess

    RunProcess(PID)RunProcess(PID) 更新 que[id[PID]]hpque[id[PID]], hp。

    CloseMaxMemoryCloseMaxMemory 更新 hpmemoryinfohp, memory,info;清空对应的 messagemessage队列。

    CloseProcess(PID)CloseProcess(PID) 更新 hpmemoryinfohp, memory,info;清空对应的 messagemessage队列。

    注意: CreatProcess(PID,Memory,Priority)CreatProcess(PID, Memory, Priority)操作中MemoryMemory可能为零$(Any number given in the input file will be non-negative integer)$。 代码:

    #include <bits/stdc++.h>
    
    #define LL long long 
    #define MEM second
    #define PRO first
    #define PID first
    #define HP second
    using namespace std;
      
      const int N(1e5+5);
      priority_queue<int> que[N];
      
      typedef pair<int,LL> P;
      
      map<int,P> mp;
      map<int,int> ID;
      
      bool cmp(const P &a, const P &b){
          return a.second!=b.second?a.second>b.second:a.first<b.first;
      }
      
      set<P, bool(*)(const P &, const P &)> o(cmp), m(cmp);
      
      void Erase(int pid){
          int id=ID[pid];
          if(que[id].size()){
             o.erase(P(pid, (LL)que[id].top()*mp[pid].PRO));
            que[id].pop();
          }
      }
      
      void remove_process(int pid){
          Erase(pid);
          m.erase(P(pid, mp[pid].MEM));
          int id=ID[pid];
          for(; que[id].size(); que[id].pop());
         mp.erase(pid);
      }
      
      void Insert(int pid){
          int id=ID[pid];
          if(que[id].size()){
              o.insert(P(pid, (LL)que[id].top()*mp[pid].PRO));
          }
      }
      
      void close_process(int pid){
          if(mp.find(pid)==mp.end()) puts("Error");
          else remove_process(pid);
      }
      
      void close_max_memory(){
          if(m.empty()) puts("Empty");
          else remove_process(m.begin()->PID);    //error-prone
      }
      
      void run_process(int pid){
          if(mp.find(pid)==mp.end()){
             puts("Error");
              return;
          }
          int id=ID[pid];
          if(que[id].empty()) puts("Empty");
          else{
              printf("Run Process: %d\n", que[id].top());
              Erase(pid), Insert(pid);
          }
      }
      
      void modify_memory(int pid, int mem){
          if(mp.find(pid)==mp.end()){
             puts("Error");
              return;
          }
          if(mp[pid].MEM+mem<=0)
              remove_process(pid);
          else{
              P now=mp[pid];
              m.erase(P(pid, now.MEM));
              m.insert(P(pid, now.MEM+mem));
              mp[pid].MEM+=mem;
          }
      }
      
      void change_priority(int pid, int pro){
          if(mp.find(pid)==mp.end()){
              puts("Error");
              return;
          }
          int id=ID[pid];
          if(que[id].size()){
              int i_pro=que[id].top();
             o.erase(P(pid, (LL)mp[pid].PRO*i_pro));
             o.insert(P(pid, (LL)pro*i_pro));
         }
          mp[pid].PRO=pro;
     }
     
     void run(){
         if(o.empty()) puts("Empty");
         else{
             printf("Run: %lld\n", o.begin()->HP);
             int pid=o.begin()->PID;
             Erase(pid), Insert(pid);
         }
     }
     
     void add_message(int pid, int pro){
        if(mp.find(pid)==mp.end()){
             puts("Error");
             return;
         }
         int id=ID[pid];
         if(que[id].size()){
             int i_pro=que[id].top();
             o.erase(P(pid, (LL)i_pro*mp[pid].PRO));
         }
         que[id].push(pro);
         o.insert(P(pid, (LL)que[id].top()*mp[pid].PRO));
     }
     
     int tail;
     
     void create_process(int pid, int mem, int pro){
         if(mp.find(pid)!=mp.end()){
             puts("Error");
             return;
         }
         if(mem){
             mp[pid]=P(pro, mem);
             m.insert(P(pid, mem));
             ID[pid]=tail++;
         }
     }
     
     char s[100];
     
     int main(){
         int n, pid, mem, pro;
         for(scanf("%d", &n); n--; ){
             scanf("%s", s);
             if(s[0]=='C'){
                 if(s[1]=='r'){
                     sscanf(s, "CreateProcess(%d,%d,%d)", &pid, &mem, &pro);
                     create_process(pid, mem, pro);
                 }
                 else if(s[1]=='l'){
                     if(s[5]=='M')
                         close_max_memory();
                     else{
                         sscanf(s, "CloseProcess(%d)", &pid);
                         close_process(pid);
                     }
                 }
                 else{
                     sscanf(s, "ChangePriority(%d,%d)", &pid, &pro);
                     change_priority(pid, pro);
                 }
             }
             else if(s[0]=='A'){
                 sscanf(s, "AddMessage(%d,%d)", &pid, &pro);
                 add_message(pid, pro);
             }
             else if(s[0]=='G'){
                 sscanf(s, "GetMemory(%d,%d)", &pid, &mem);
                 modify_memory(pid, mem);
             }
             else if(s[0]=='F'){
                 sscanf(s, "FreeMemory(%d,%d)", &pid, &mem);
                 modify_memory(pid, -mem);
             }
             else{
                 if(s[3]){
                     sscanf(s, "RunProcess(%d)", &pid);
                     run_process(pid);
                 }
                else run();
            }
        }
         return 0;
     }
    
    • 1

    信息

    ID
    1448
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者