代码(有wa也有re,样例1和2过了,第三个没过):
#include <bits/stdc++.h>
using namespace std;
int n, vis[1000], cs, ccl[1000];
vector <vector <pair <int, int> > > stu (1000), room (1000);
vector <pair <int, pair <int, int> > > yy;
int main () {
cin >> n;
while (n --) {
string s;
cin >> s;
if (s == "reserve") {
int stid, rmid, drt;
string stt;
cin >> stid >> rmid >> stt >> drt;
int st_time = ((stt[0] - '0') * 10 + (stt[1] - '0')) * 60 + ((stt[3] - '0') * 10 + (stt[4] - '0'));
if (drt > 120 || vis[stid] == 3) {
cout << "FAIL\n";
vis[stid] = min (vis[stid] + 1, 3);
if (vis[stid] > 1) {
while (stu[stid].size ()) {
if (room[stu[stid].back ().first].back ().first == stid) room[stu[stid].back ().first].pop_back ();
stu[stid].pop_back ();
}
}
}
else if ((stu[stid].size () == 0 || stu[stid].back ().second <= st_time)) {
if (room[rmid].size () == 0 || room[rmid].back ().second <= st_time) {
stu[stid].push_back ({rmid, st_time + drt});
room[rmid].push_back ({stid, st_time + drt});
yy.push_back ({stid, {rmid, st_time + drt}});
cs ++;
cout << "SUCCESS " << cs << '\n';
} else cout << "FAIL\n";
} else if (stu[stid].back ().second > st_time) {
vis[stid] = min (vis[stid] + 1, 3);
if (vis[stid] > 1) {
while (stu[stid].size ()) {
if (room[stu[stid].back ().first].back ().first == stid) room[stu[stid].back ().first].pop_back ();
stu[stid].pop_back ();
}
}
cout << "FAIL\n";
} else /*if (room[rmid].back ().second > st_time)*/ {
cout << "FAIL\n";
}
} else {
int x;
cin >> x;
if (ccl[x]) cout << "FAIL\n";
else {
ccl[x] = 1;
if (x <= yy.size ()) {
cout << "SUCCESS\n";
if (stu[yy[x - 1].first].back ().first == yy[x - 1].second.first && stu[yy[x - 1].first].back ().second == yy[x - 1].second.second) stu[yy[x - 1].first].pop_back ();
if (room[yy[x - 1].second.first].back ().first == yy[x - 1].first && room[yy[x - 1].second.first].back ().second == yy[x - 1].second.second) room[yy[x - 1].second.first].pop_back ();
} else cout << "FAIL\n";
}
}
}
}
还有不理解第三个样例为什么第一次取消操作是fail