这次可就轮到我们队现场搞了……
回顾一下前面的情况:
首先是翻整本题册,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; }