/**//* 题意: 模拟题
一个人要submit(包含多个数据已修改的,目的是要更新服务器对应的版本) 1)该数据之前更新的时间 < 该人获得数据的时间(SYNC 或 SUBMIT) 则更新服务器该数据的更新时间 2)否则,如果该人的优先级大于之前修改的,则更新服务器该数据的更新时间 否则不变
按时间排个序搞就行了 最后要输出被更新过的数据的最后修改者,数据没被修改过的话不用输出 */ #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<map>
using namespace std;
const int MAXN = 10010;
map<int,int> mp;
struct OP { int id,pr,kind,line; int yy,mm,dd,h,m,s; char str[10]; long long time; void read(int _id,int _pr) { id = _id; pr = _pr; scanf(" [%d/%d/%d %d:%d:%d] %s",&yy,&mm,&dd,&h,&m,&s,str); if(str[0]=='M') { kind = 2; scanf("%d",&line); mp[line] = -1; } else { if(str[1]=='Y')kind = 1; else kind = 3; } time = s + m*60 + h*3600 + dd*3600*24 + mm*3600*24*31 + yy*(long long)3600*24*31*366; } void print() { printf("%d [%04d/%02d/%02d %02d:%02d:%02d] %d\n",id,yy,mm,dd,h,m,s,kind); } bool operator<(const OP &B)const { return time<B.time; } };
char name[MAXN][40]; vector<int>MV[MAXN]; OP op[MAXN*5]; long long get[MAXN];
int main() { //freopen("in","r",stdin); int n; while(scanf("%d",&n),n) { int pr,m; int tot = 0; mp.clear(); for(int i=1;i<=n;i++) { scanf("%s%d%d",&name[i],&pr,&m); MV[i].clear(); for(int j=0;j<m;j++) op[tot++].read(i,pr); } sort(op,op+tot); for(int i=0;i<tot;i++) { //op[i].print(); int id = op[i].id; if(op[i].kind==1)get[id] = op[i].time; else if(op[i].kind==2)MV[id].push_back(op[i].line); else { for(int j=0;j<MV[id].size();j++) { int line = MV[id][j]; long long last = mp[line]==-1?-1:op[mp[line]].time; if(last<get[id])mp[line] = i; else if(op[mp[line]].pr<op[i].pr)mp[line] = i; } MV[id].clear(); get[id] = op[i].time; } } for(map<int,int>::iterator it = mp.begin();it!=mp.end();it++) { if(it->second==-1)continue;// int id = it->second; printf("%d [%04d/%02d/%02d %02d:%02d:%02d] BY %s\n",it->first,op[id].yy,op[id].mm,op[id].dd,op[id].h,op[id].m,op[id].s,name[op[id].id]); } puts("END"); } return 0; }
|