input:
3 6
N
N
E 1
N
N
N
10 2
N
N
0 0
思路:
受可旋栈1016的启发
本来觉得办法搞,因为p的范围给的很大,但是仔细思考之后就能发现c的范围并不大,只有1000,只要分类讨论,本质和1016是一样的
#include <cstdio>
#include <iostream>
using namespace std;
long long p,c;
bool vis[1111111111];
struct QUEUE
{
int head,tail,data[1111111];void init(){
head=1111,tail=1110;}int size(){
return tail-head+1;}int front(){
return data[head];}int back(){
return data[tail];}void pop(){
head++;}void push_back(const int &x){
tail++;data[tail]=x;}void push_front(const int &x){
head--;data[head]=x;}
}qu;
int main()
{
int n,p,cnt=0;while(cin>>p>>n){
if (p==0&&n==0) return 0;cnt++;cout<<"Case "<<cnt<<":"<<endl;qu.init();for(int i=1;i<=min(p,1000);i++) {
qu.push_back(i);//cout<<i<<endl;}for(int i=1;i<=n;i++){
char c;cin>>c;if(c=='N') {
cout<<qu.front()<<endl;qu.push_back(qu.front());qu.pop(); continue;}if(c=='E'){
int x;cin>>x;if(x>1000){
qu.push_front(x);//cout<<qu.front()<<endl;//qu.pop(); }else{
for(int i=qu.head+1;i<=qu.tail;i++){
//cout<<"qu.data[i]="<<qu.data[i]<<endl;if(qu.data[i]==x){
for(int j=i;j>qu.head;j--){
qu.data[j]=qu.data[j-1];}qu.data[qu.head]=x;break;} }//cout<<qu.front()<<endl;//qu.push_back(x);//qu.pop();}}}}return 0;
}