这题不难、处理好相应的状态就行
首先说一下几点要注意吧、
(1) words 类型要用 long long 题目说的是所有参数小于1e9、但加起来可能就超了
(2) Top 这只是一种状态,不需要把它放进队列的头部,而且题意也没说,果然英文不好的我....就容易误解
(3) 注意close操作的时候如果关闭了一个Top状态的要记得及时把状态清除
(4) 每次操作后面有一个小点 '.'
(5) 最后Bay 的时候注意 如果有Top状态的肯定先和他/她告别, 然后其他按顺序即可, 但是如果一句话都没说就不用告别了
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<utility>
#include<vector>
#include<string>
#include<iostream>
#include<map>
using namespace std;
typedef __int64 ll;
const int qq = 5005;
map<int, bool>vis;
struct Girl{
int num;
ll word;
}girl[qq];
string x[15]={"Add", "Close", "Chat", "Rotate", "Prior", "Choose", "Top", "Untop",};
int main(){
int t;scanf("%d", &t);
while(t--){
vis.clear();
int n;scanf("%d",&n);
int Top = -1;
int k = 0;
int p = 1;
string a;
int u;
while(n--){
printf("Operation #%d: ", p++);
cin >> a;
if(a==x[0]){
scanf("%d", &u);
if(vis[u]) printf("same priority.\n");
else{
printf("success.\n");
vis[u] = true;
girl[k].num = u;
girl[k++].word = 0;
}
}else if(a==x[1]){
scanf("%d", &u);
if(!vis[u]) printf("invalid priority.\n");
else{
int id;
for(int j=0; j<k; ++j)
if(girl[j].num == u){
id = j;
break;
}
if(Top==girl[id].num) Top = -1;
vis[u] = false;
printf("close %d with %I64d.\n", u, girl[id].word);
for(int j=id; j<k; ++j) girl[j] = girl[j+1];
k--;
}
}else if(a==x[2]){
scanf("%d", &u);
if(k==0) printf("empty.\n");
else{
printf("success.\n");
if(Top!=-1){
for(int j=0; j<k; ++j)
if(girl[j].num==Top){
girl[j].word += u;
break;
}
}else girl[0].word+=u;
}
}else if(a==x[3]){
scanf("%d", &u);
if(k<u) printf("out of range.\n");
else{
printf("success.\n");
struct Girl g=girl[u-1];
for(int j=u-1; j>=1; --j) girl[j] = girl[j-1];
girl[0] = g;
}
}else if(a==x[4]){
if(k==0) printf("empty.\n");
else{
printf("success.\n");
int id,maxn=-1;
for(int j=0; j<k; ++j)
if(maxn<girl[j].num){
maxn = girl[j].num;
id = j;
}
struct Girl g = girl[id];
for(int j=id; j>=1; --j) girl[j] = girl[j-1];
girl[0] = g;
}
}else if(a==x[5]){
scanf("%d", &u);
if(!vis[u]) printf("invalid priority.\n");
else{
printf("success.\n");
int id;
for(int j=0; j<k; ++j)
if(girl[j].num == u){
id = j;
break;
}
struct Girl g = girl[id];
for(int j=id; j>=1; --j) girl[j] = girl[j-1];
girl[0] = g;
}
}else if(a==x[6]){
scanf("%d", &u);
if(!vis[u]) printf("invalid priority.\n");
else{
printf("success.\n");
Top = u;
}
}else if(a==x[7]){
if(Top==-1) printf("no such person.\n");
else{
printf("success.\n");
Top = -1;
}
}
}
if(Top!=-1){
int id;
for(int j=0; j<k; ++j)
if(girl[j].num==Top){
id = j;
break;
}
if(girl[id].word!=0)
printf("Bye %d: %I64d\n", Top, girl[id].word);
}
for(int j=0; j<k; ++j)
if(girl[j].num!=Top&&girl[j].word!=0)
printf("Bye %d: %I64d\n", girl[j].num, girl[j].word);
}
return 0;
}