1 条题解
-
0
POJ上又一个通过率较低的模拟题,还有一个是POJ 。 这道题比1025简单了不少,但仍有些难度。 比较难处理的操作就是和,而这两个操作又比较相似。 不论简单复杂,模拟题的一般思路是分析 事件。这个题目对要求维护的东西叙述比较明确,所涉及的事件基本上就是所列的若干操作。 实现思路: 用 ;维护的信息 对每个,用一个 priority_queue ; 维护其队列,这要求将 离散化,用 ;实现。 用两个 ; 分别支持两操作
难点: 如何实时更新上述4个数据结构。
下面具体叙述如何实现各个操作:
更新,初始化
更新 。
更新 ,对应的 队列。
更新 ,更新。
更新 。
更新 ,可能涉及清除一个。
更新
更新 清空对应的 队列。
更新 ;清空对应的 队列。
注意: 操作中可能为零$(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
- 上传者