Advertisement
ambition-xx

3

Aug 6th, 2022
1,204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long LL;
  6.  
  7. struct Event{
  8.     int t;
  9.     int id;
  10.     int type; // 0交易事件 1 迁移事件
  11.     Event() : t(-1), id(-1), type(-1){}
  12.     Event(int _t, int _id, int _type) : t(_t), id(_id), type(_type){}
  13.    
  14.     bool operator < (const Event &other) const {
  15.         if(t != other.t) return t < other.t;
  16.         if(id != other.id) return t < other.id;
  17.         return type < other.type;
  18.     }
  19.    
  20.     friend ostream & operator << ( ostream &os, const Event &e){
  21.         printf("%02d:%02d:%02d %d %d\n", e.t/3600, e.t/60%60, e.t%60, e.id, e.type);
  22.         return os;
  23.     }
  24. };
  25.  
  26. int main() {
  27.     freopen("in.txt", "r", stdin);
  28.     int HH,mm,ss,ID,n, m, t;
  29.  
  30.     map<int, int> mlock, dlock;
  31.     // mlock[id] = t 表示客户id的迁移锁在 t 时刻结束
  32.     // dlock[id] = t 表示客户id的交易锁在 t 时刻结束
  33.     map<int, int> router;
  34.     // 客户id的路由结果 0 老系统 1 新系统
  35.     while(cin >> n >> m){
  36.         vector<Event> events;
  37.         for(int i = 0; i < n; i++){
  38.             scanf("%d:%d:%d %d", &HH,&mm,&ss,&ID);
  39.              t = HH*60*60+mm*60+ss;
  40.              
  41.             events.emplace_back(t, ID, 1);
  42.  
  43.         }
  44.        
  45.         for(int i = 0; i < m; i++){
  46.             scanf("%d:%d:%d %d", &HH,&mm,&ss,&ID);
  47.              t = HH*60*60+mm*60+ss;
  48.             events.emplace_back(t, ID, 0);
  49.         }
  50.         // 排序规则保证了时间相同的情况下 交易事件优先处理
  51.         sort(events.begin(), events.end());
  52.        
  53.         for(auto &e : events){
  54.             // 交易事件
  55.             if(e.type == 0) {
  56.                 // 如果遇到迁移锁  则本次交易失败
  57.                 if(mlock[e.id] - e.t > 0 && mlock[e.id] - t <= 60){
  58.                     printf("%02d:%02d:%02d %d %d\n",
  59.                         e.t/3600, e.t/60%60, e.t%60, e.id, -1);
  60.                     continue;
  61.                 }
  62.                 // 不管是否遇到 交易锁 本次交易都能成功
  63.                 dlock[e.id] = e.t + 60; // 更新交易锁
  64.                 printf("%02d:%02d:%02d %d %d\n",
  65.                     e.t/3600, e.t/60%60, e.t%60, e.id, router[e.id]);
  66.             } else {
  67.                 // 迁移事件
  68.                 // 如果已经迁移过了
  69.                 if(router[e.id] == 1) continue; // 本行考试忘记写了
  70.                 if( (dlock[e.id] - e.t > 0 && dlock[e.id] - t <= 60) ||
  71.                     (mlock[e.id] - e.t > 0 && mlock[e.id] - t <= 60) ){
  72.                     // 如果遇到了交易锁 或者 迁移锁 则本次迁移失败
  73.                     continue;
  74.                 }
  75.                 else {
  76.                     // 更新迁移锁时间
  77.                     mlock[e.id] = e.t + 60;
  78.                     // 更新路由
  79.                     router[e.id] = 1;
  80.                 }
  81.                
  82.             }
  83.         }  
  84.     }
  85.     return 0;
  86. }
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement