HDU5071 - Chat(STL模拟)

题目描述

略。。。

题解

现场赛的时候真是脑残。。。用splay去写。。写完发现调试不出来。。。然后才发现数据范围才5000。。。不过那时候只有40分钟了。。用数组模拟了速度敲了一发。写完只剩10几分钟了。。。最终也没调试出来。。赛后想了想发现此题用deque真是巨好写。。

代码:

bye是个坑。必须得在队列里并且是说过话的。。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<queue>
  5 #include<algorithm>
  6 using namespace std;
  7 typedef long long LL;
  8 #define maxn 1111111
  9 #define MOD 1000000007
 10 deque< pair<int,LL> >arr;
 11 int tp;
 12 void Add(int x)
 13 {
 14     for(deque< pair<int,LL> >::iterator it=arr.begin(); it!=arr.end(); ++it)
 15         if(it->first==x)
 16         {
 17             puts("same priority.");
 18             return;
 19         }
 20     arr.push_back(make_pair(x,0));
 21     puts("success.");
 22 }
 23 void Close(int x)
 24 {
 25     for(deque< pair<int,LL> >::iterator it=arr.begin(); it!=arr.end(); ++it)
 26         if(it->first==x)
 27         {
 28             if(tp==x) tp=0;
 29             printf("close %d with %I64d.\n",x,it->second);
 30             arr.erase(it);
 31             return;
 32         }
 33     puts("invalid priority.");
 34 }
 35 void Chat(int x)
 36 {
 37     if(arr.size()==0)
 38     {
 39         puts("empty.");
 40         return;
 41     }
 42     if(tp)
 43     {
 44         for(deque< pair<int,LL> >::iterator it=arr.begin(); it!=arr.end(); ++it)
 45             if(it->first==tp)
 46             {
 47                 it->second+=x;
 48                 break;
 49             }
 50     }
 51     else arr.front().second+=x;
 52     puts("success.");
 53 }
 54 void Rotate(int x)
 55 {
 56     if(arr.size()<x||x<1)
 57     {
 58         puts("out of range.");
 59         return;
 60     }
 61     int cnt=1;
 62     for(deque< pair<int,LL> >::iterator it=arr.begin(); it!=arr.end(); ++it,++cnt)
 63         if(cnt==x)
 64         {
 65             pair<int,LL>pa=*it;
 66             arr.erase(it);
 67             arr.push_front(pa);
 68             break;
 69         }
 70     puts("success.");
 71 }
 72 void Prior()
 73 {
 74     if(arr.size()==0)
 75     {
 76         puts("empty.");
 77         return;
 78     }
 79     deque< pair<int,LL> >::iterator mx=arr.begin();
 80     for(deque< pair<int,LL> >::iterator it=arr.begin(); it!=arr.end(); ++it)
 81         if(mx->first<it->first) mx=it;
 82     pair<int,LL>pa=*mx;
 83     arr.erase(mx);
 84     arr.push_front(pa);
 85     puts("success.");
 86 }
 87 void Choose(int x)
 88 {
 89     for(deque< pair<int,LL> >::iterator it=arr.begin(); it!=arr.end(); ++it)
 90         if(it->first==x)
 91         {
 92             pair<int,LL>pa=*it;
 93             arr.erase(it);
 94             arr.push_front(pa);
 95             puts("success.");
 96             return;
 97         }
 98     puts("invalid priority.");
 99 }
100 void Top(int x)
101 {
102     for(deque< pair<int,LL> >::iterator it=arr.begin(); it!=arr.end(); ++it)
103         if(it->first==x)
104         {
105             tp=x;
106             puts("success.");
107             return;
108         }
109     puts("invalid priority.");
110 }
111 void Untop()
112 {
113     if(!tp)
114     {
115         puts("no such person.");
116         return;
117     }
118     tp=0;
119     puts("success.");
120 }
121 void Bye()
122 {
123     deque< pair<int,LL> >::iterator fuck=arr.end();
124     if(tp)
125     {
126         for(deque< pair<int,LL> >::iterator it=arr.begin(); it!=arr.end(); ++it)
127             if(it->first==tp&&it->second)
128             {
129                 printf("Bye %d: %I64d\n",tp,it->second);
130                 arr.erase(it);
131                 break;
132             }
133     }
134     for(deque< pair<int,LL> >::iterator it=arr.begin(); it!=arr.end(); ++it)
135     if(it->second)
136     {
137         printf("Bye %d: %I64d\n",it->first,it->second);
138     }
139 }
140 int main()
141 {
142     int T;
143     scanf("%d",&T);
144     while(T--)
145     {
146         int n;
147         scanf("%d",&n);
148         arr.clear();
149         tp=0;
150         for(int i=1; i<=n; i++)
151         {
152             printf("Operation #%d: ",i);
153             char op[10];
154             int x;
155             scanf("%s",op);
156             if(op[0]==‘A‘)
157             {
158                 scanf("%d",&x);
159                 Add(x);
160             }
161             else if(op[1]==‘l‘)
162             {
163                 scanf("%d",&x);
164                 Close(x);
165             }
166             else if(op[2]==‘a‘)
167             {
168                 scanf("%d",&x);
169                 Chat(x);
170             }
171             else if(op[0]==‘R‘)
172             {
173                 scanf("%d",&x);
174                 Rotate(x);
175             }
176             else if(op[0]==‘P‘) Prior();
177             else if(op[0]==‘C‘)
178             {
179                 scanf("%d",&x);
180                 Choose(x);
181             }
182             else if(op[0]==‘T‘)
183             {
184                 scanf("%d",&x);
185                 Top(x);
186             }
187             else Untop();
188         }
189         Bye();
190     }
191     return 0;
192 }

时间: 2024-10-12 05:31:39

HDU5071 - Chat(STL模拟)的相关文章

HDU 4028 The time of a day STL 模拟题

暴力出奇迹.. #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define ll __int64 #define N 42 ll n,m,ans;

HDU 4022 Bombing STL 模拟题

手动模拟.. #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define N 10100 #define inf 1000000010 map<

stl+模拟 CCF2016 4 路径解析

1 // stl+模拟 CCF2016 4 路径解析 2 // 一开始题意理解错了.... 3 4 #include <iostream> 5 #include <string> 6 #include <vector> 7 using namespace std; 8 void fre() {freopen("in.txt","r",stdin);} 9 vector<string> l; 10 int main(){

HDU - 5071 Chat(模拟)

原题链接 题意:有各种操作,模拟这个程序并输出每次操作的信息 分析:恶心模拟题...用个map记录一下各个等级女孩的谈话数,同时也便于查找权值为u的在不在队列里.因为n很小,其他就暴力模拟了. #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #define ll long long #define ull unsign

【STL+模拟】UVa 506 - System Dependencies

System Dependencies  Components of computer systems often have dependencies--other components that must be installed before they will function properly. These dependencies are frequently shared by multiple components. For example, both the TELNET cli

HDU-4961 Boring Sum STL模拟

给出一个序列A,对于A里面的每个元素,左边最近的能被它整除的元素记为B序列对应位置的,右边最近的是它的整数倍的元素记为C序列对应位置,找不到的记它本身,最后算出对应位置B*C的总和. 容器模拟,按顺序扫一遍,每次如果有符合条件的取出来,即为最近的.最后把它的下标放到对应位置的容器中,然后倒序求一遍,最后求和. #include <iostream> #include <cmath> #include <cstdio> #include <cstring> #

HDU-4841 圆桌问题 STL模拟约瑟夫问题

中文题,题意一看就是卧槽,这不约瑟夫么,然后脑子一抽就用了链表写,然后果然T了,最后用Vector模拟的约瑟夫问题. #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <queue> #include <iomanip> #include <algorithm> #include <vector>

CCF 201403-3 命令行选项 (STL模拟)

问题描述 请你写一个命令行分析程序,用以分析给定的命 令行里包含哪些选项.每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔.这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序 不用对它进行处理.在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数. 选项有两类:带参数的选项和不带参数的选项.一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b".而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求

CCF 201509-3 模板生成系统 (STL+模拟)

问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的.例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是 而当用户为 Jerry 时,网页的源代码是 这样的例子在包含动态内容的网站中还有很多.为了简化生成网页的工作,成成觉得他需要引入一套模板生成系统. 模板是包含特殊标记的文本.成成用到的模板只包含一种特殊标记,格式为 {{ VAR }},其中 VAR 是一个变量.该标记在模板生成时会被变量 VAR 的值所替代.例如,如果