思路:恶心模拟...反正扔给队友做了
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5000 + 100;
typedef long long ll;
struct Node
{
ll u, c;
int ne;
}win[maxn*2];
int sz;
void tak(int th)
{
int ti = win[th].ne;
win[th].ne=win[ti].ne;
win[ti].ne = win[0].ne;
win[0].ne = ti;
}
int find(int x)
{
int i;
for(i=0;win[i].ne != sz;i=win[i].ne)
if(win[win[i].ne].u==x) break;
return i;
}
int main()
{
int ca;
scanf("%d", &ca);
while(ca--)
{
memset(win, 0, sizeof(win));
int m;
scanf("%d", &m);
int altop=-1, size=0; sz=1;
win[0].ne = sz;
for(int ke=1;ke<=m;++ke)
{
string op;
cin>>op;
printf("Operation #%d: ", ke);
if(op=="Untop")
{
if(altop!=-1) puts("success.");
else puts("no such person.");
altop=-1;
}
else if(op=="Prior")
{
int i, ma=0;
for(i=0;win[i].ne != sz;i=win[i].ne)
if(win[win[ma].ne].u < win[win[i].ne].u) ma = i;
if(size==0) puts("empty.");
else{tak(ma); puts("success.");}
}
else
{
int x;
cin>>x;
if(op=="Add")
{
int i=find(x);
i=win[i].ne;
if(i!=sz)
{
puts("same priority.");
}
else
{
win[sz].u=x; win[sz].c=0; win[sz].ne=sz+1;
sz++;
puts("success.");
size++;
}
}
else if(op=="Close")
{
int i=find(x);
if(win[i].ne==sz)
{
puts("invalid priority.");
}
else
{
int ti = win[i].ne;
if(altop==ti) altop=-1;
printf("close %lld with %lld.\n", win[ti].u, win[ti].c);
win[i].ne = win[win[i].ne].ne;
size--;
}
}
else if(op=="Chat")
{
if(size==0)puts("empty.");
else
{
if(altop!=-1) win[altop].c+=x;
else win[win[0].ne].c+=x;
puts("success.");
}
}
else if(op=="Rotate")
{
if(x<1||x>size) puts("out of range.");
else
{
int i,j;
for(i=0,j=1;j<x;++j,i=win[i].ne);
tak(i);
puts("success.");
}
}
else if(op=="Choose")
{
int i = find(x);
if(win[i].ne==sz) puts("invalid priority.");
else
{
tak(i);
puts("success.");
}
}
else if(op=="Top")
{
int i=find(x);
if(win[i].ne==sz) puts("invalid priority.");
else
{
altop = win[i].ne;
puts("success.");
}
}
}
}
if(altop!=-1&&win[altop].c)
printf("Bye %lld: %lld\n", win[altop].u, win[altop].c);
for(int i=win[0].ne;i != sz;i=win[i].ne)
{
if(i!=altop&&win[i].c)printf("Bye %lld: %lld\n", win[i].u, win[i].c);
}
}
return 0;
}