Sample Output
Operation #1: empty. Operation #2: success. Operation #3: success. Operation #4: success. Operation #5: success. Operation #6: success. Operation #7: success. Operation #8: success. Operation #9: success. Operation #10: success. Operation #11: success. Operation #12: success. Operation #13: success. Operation #14: close 2 with 8. Operation #15: success. Operation #16: success. Operation #17: success. Operation #18: close 1 with 11. Bye 3: 2 HintThis problem description does not relate to any real person in THU.
Source 2014 Asia AnShan Regional Contest
#include#include #include #include #include using namespace std; typedef long long int LL; const int INF=0x3f3f3f3f; const int HEAD=0; const int TAIL=6400; struct CHART { int pro,front,back; LL w; }chat[6500]; int n,x,id; int alwayson; set pc; char cmd[50]; void init() { id=1;pc.clear();alwayson=-1; memset(chat,0,sizeof(chat)); chat[HEAD].front=HEAD; chat[HEAD].back=TAIL; chat[TAIL].front=HEAD; chat[TAIL].back=TAIL; chat[HEAD].pro=-INF-1; chat[TAIL].pro=-INF-1; } void Add(int u) { if(pc.count(u)) { puts("same priority."); return ; } pc.insert(u); chat[id].w=0; chat[id].pro=u; chat[id].front=chat[TAIL].front; chat[id].back=TAIL; chat[chat[TAIL].front].back=id; chat[TAIL].front=id; id++; puts("success."); } void Close(int u) { if(pc.count(u)==0) { puts("invalid priority."); return ; } pc.erase(u); if(alwayson==u) alwayson=-1; int pos=HEAD; for(pos=HEAD;pos!=TAIL;pos=chat[pos].back) { if(chat[pos].pro==u) break; } int bc=chat[pos].back; int ft=chat[pos].front; chat[bc].front=ft; chat[ft].back=bc; printf("close %d with %I64d.\n",chat[pos].pro,chat[pos].w); } void Chat(int w) { if(chat[HEAD].back==TAIL) { puts("empty."); return ; } puts("success."); int u=-1; if(alwayson!=-1) u=alwayson; else u=chat[chat[HEAD].back].pro; int pos=HEAD; for(pos=HEAD;pos!=TAIL;pos=chat[pos].back) { if(chat[pos].pro==u) break; } chat[pos].w+=w; } void Rotate(int x) { if(x<1||x>pc.size()) { puts("out of range."); return ; } puts("success."); int pos=HEAD,i=0; for(pos=HEAD;