这次可就轮到我们队现场搞了……
回顾一下前面的情况:
首先是翻整本题册,8min的时候队友提出来看板,一下子发现I题很快FB就没了,然后马上跟风下去搞I,队友去看另一个有过的E,很快也搞定了
然后漫长的卡了D题4次,114min 5Y以后准备继续跟榜搞C,结果怎么想都没想出来平白无故浪费无数时间gg……
然后看板,发现B题有6个过了,看了一下B,很多操作的沙茶模拟,队友同时看了K和H,表示这个另外的题目搞定比搞B麻烦,于是我马上下手搞B题了。
一开始读完题,n^2的暴力很快就能出来的,但是我一开始把Top和Untop的意义理解错了,理解成队列的操作,后来一发Clarification问出去,返回Read Again后再看,一下子懂了——Top本质是一个特别的指针,一直指向队列里优先级为u的那个。
B题首先读完操作要对这些操作归类(模拟题做多了这种会注意起来的,繁杂的规则中整理出一些共性的东西)
1、增删和改值——Add、Close、Chat
2、维护Top指针——Top、Untop
3、队列里抽调某一个——Rotate、Choose、Prior
第一组肯定是首先实现的,不然后面的没法调试(不过老实说,时间紧张,只有写完了才会去调试吧……)
然后考虑第二组。
Top指针 记录优先级u 好还是 记录优先级为u的在队列里是哪一个 比较好?
当时也没细想,一拍大腿,选择记录优先级为u的在队列里是哪一个——这样埋下了出错的隐患
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct Girl
{
int id;
long long words;
}queue[10005];
int qtail;
int topid;
int find(int u)
{
for(int i=0;i<qtail;i++)
if(queue[i].id==u)
return i;
return -1;
}
void movetotop(int x){
int topu=queue[topid].id;
Girl tmp=queue[x];
for(int i=x;i>0;i--){
queue[i]=queue[i-1];
if(queue[i].id==topu)
topid=i;
}
queue[0]=tmp;
if(queue[0].id==topu)
topid=0;
}
int main()
{
int T;
int op;
char t[15];
int id;
for(scanf("%d",&T);T--;){
scanf("%d",&op);
qtail=0;topid=-1;
for(int O=1;O<=op;O++){
scanf("%s",t);
printf("Operation #%d: ",O);
if(strcmp(t,"Add")==0){
scanf("%d",&id);
if(find(id)>=0){
printf("same priority.\n");
continue;
}
queue[qtail].id=id;
queue[qtail].words=0;
qtail++;
printf("success.\n");
}else if(strcmp(t,"Close")==0){
scanf("%d",&id);
int pl=find(id);
if(pl>=0){
printf("close %d with %I64d.\n",id,queue[pl].words);
for(int i=pl;i<qtail;i++)
queue[i]=queue[i+1];
qtail--;
if(pl==topid) topid=-1;
else if(pl<topid) topid--;
}
else{
printf("invalid priority.\n");
}
}else if(strcmp(t,"Chat")==0){
scanf("%d",&id);
if(qtail==0){
printf("empty.\n");
continue;
}
if(topid>=0)
queue[topid].words+=id;
else
queue[0].words+=id;
printf("success.\n");
}else if(strcmp(t,"Top")==0){
scanf("%d",&id);
int pl=find(id);
if(pl>=0){
printf("success.\n");
topid=pl;
}
else
printf("invalid priority.\n");
}else if(strcmp(t,"Untop")==0){
if(topid>=0){
printf("success.\n");
topid=-1;
}
else
printf("no such person.\n");
}else if(strcmp(t,"Rotate")==0){
scanf("%d",&id);
if(id<=qtail){
printf("success.\n");
movetotop(id-1);
}
else
printf("out of range.\n");
}else if(strcmp(t,"Choose")==0){
scanf("%d",&id);
int pl=find(id);
if(pl>=0){
printf("success.\n");
movetotop(pl);
}
else{
printf("invalid priority.\n");
}
}else if(strcmp(t,"Prior")==0){
if(qtail==0){
printf("empty.\n");
continue;
}
int maxid=0;
for(int i=1;i<qtail;i++)
if(queue[i].id>queue[maxid].id)
maxid=i;
printf("success.\n");
movetotop(maxid);
}
}
if(topid>=0&&queue[topid].words>0){
printf("Bye %d: %I64d\n",queue[topid].id,queue[topid].words);
queue[topid].words=0;
}
for(int i=0;i<qtail;i++){
if(queue[i].words>0)
printf("Bye %d: %I64d\n",queue[i].id,queue[i].words);
}
}
return 0;
}