首页 > 代码库 > HDU5071 - Chat(STL模拟)
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 }
HDU5071 - Chat(STL模拟)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。