题意:无力写了。
解题思路:纯模拟
解题代码:
1 // File Name: b.cpp 2 // Author: darkdream 3 // Created Time: 2014年10月22日 星期三 15时51分59秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 struct node{ 28 int x; 29 LL v ; 30 int ne , la; 31 }a[6004]; 32 char str[10]; 33 int first; 34 int last ; 35 int top = 0 ; 36 void print() 37 { 38 for(int i = a[0].ne;i != 6000 ;i = a[i].ne) 39 { 40 printf("%d %lld\n",a[i].x, a[i].v); 41 } 42 } 43 int find(int x) 44 { 45 //printf("%d\n",a[0].ne); 46 for(int i = a[0].ne;i != 6000 ;i = a[i].ne) 47 { 48 if(a[i].x == x) 49 return i ; 50 } 51 return 0 ; 52 } 53 int L; 54 void add(int x ) 55 { 56 if(find(x)) 57 { 58 printf("same priority.\n"); 59 }else { 60 printf("success.\n"); 61 L ++ ; 62 a[L].x = x; 63 a[L].v = 0 ; 64 a[L].ne = last; 65 a[L].la = a[last].la; 66 a[a[last].la].ne = L; 67 a[last].la = L; 68 } 69 } 70 void chat(int x) 71 { 72 if(a[first].ne == 6000) 73 { 74 printf("empty.\n"); 75 return; 76 } 77 printf("success.\n"); 78 if(top) 79 { 80 a[top].v += x; 81 }else { 82 a[a[first].ne].v += x; 83 } 84 } 85 void close(int x) 86 { 87 int k = find(x); 88 if(k) 89 { 90 printf("close %d with %lld.\n",a[k].x,a[k].v); 91 a[a[k].la].ne = a[k].ne; 92 a[a[k].ne].la = a[k].la; 93 if(a[k].x == top) 94 { 95 top = 0 ; 96 } 97 }else { 98 printf("invalid priority.\n"); 99 } 100 } 101 void rotata(int x) 102 { 103 int t = 1 ; 104 for(int i = a[first].ne ;i != last;i = a[i].ne) 105 { 106 if(t == x) 107 { 108 a[a[i].la].ne = a[i].ne; 109 a[a[i].ne].la = a[i].la; 110 111 a[i].ne = a[first].ne; 112 a[i].la = first; 113 a[a[first].ne].la = i; 114 a[first].ne = i; 115 printf("success.\n"); 116 return; 117 } 118 t ++; 119 } 120 printf("out of range.\n"); 121 } 122 void Prior() 123 { 124 if(a[first].ne == last) 125 { 126 printf("empty.\n"); 127 return; 128 } 129 int mx = 0 ; 130 int site = 0; 131 for(int i = a[first].ne ;i != last;i = a[i].ne) 132 { 133 if(a[i].x > mx) 134 { 135 site = i ; 136 mx = a[i].x; 137 } 138 } 139 a[a[site].la].ne = a[site].ne; 140 a[a[site].ne].la = a[site].la; 141 142 a[site].ne = a[first].ne; 143 a[site].la = first; 144 a[a[first].ne].la = site; 145 a[first].ne = site; 146 printf("success.\n") ; 147 } 148 void choose(int x) 149 { 150 int site = find(x); 151 if(site == 0 ) 152 { 153 printf("invalid priority.\n"); 154 return; 155 } 156 a[a[site].la].ne = a[site].ne; 157 a[a[site].ne].la = a[site].la; 158 159 a[site].ne = a[first].ne; 160 a[site].la = first; 161 a[a[first].ne].la = site; 162 a[first].ne = site; 163 printf("success.\n") ; 164 } 165 void Top(int x) 166 { 167 int site = find(x); 168 if(site == 0 ) 169 { 170 printf("invalid priority.\n"); 171 return; 172 } 173 top = site; 174 printf("success.\n") ; 175 } 176 void Untop() 177 { 178 if(top == 0 ) 179 { 180 printf("no such person.\n"); 181 return; 182 } 183 top = 0 ; 184 printf("success.\n") ; 185 } 186 void say() 187 { 188 if(top) 189 { 190 if(a[top].v != 0 ) 191 printf("Bye %d: %lld\n",a[top].x,a[top].v); 192 } 193 for(int i = a[0].ne;i != last;i = a[i].ne) 194 { 195 if(i != top && a[i].v != 0 ) 196 printf("Bye %d: %lld\n",a[i].x,a[i].v); 197 } 198 } 199 int main(){ 200 int t; 201 scanf("%d",&t); 202 while(t--) 203 { 204 int n ; 205 memset(a,0,sizeof(a)); 206 scanf("%d",&n); 207 a[0].ne = 6000 ; 208 a[0].la = 6000; 209 a[6000].ne = 0; 210 a[6000].la = 0; 211 first = 0 ; 212 last = 6000; 213 top = 0 ; 214 int tmp; 215 L = 0 ; 216 for(int i = 1;i <= n;i ++) 217 { 218 scanf("%s",str); 219 printf("Operation #%d: ",i); 220 if(str[0] == 'A') 221 { 222 scanf("%d",&tmp) ; 223 add(tmp); 224 }else if(str[0] == 'C' && str[1] == 'l') 225 { 226 scanf("%d",&tmp); 227 close(tmp); 228 }else if(str[0] == 'C' && str[1] == 'h' && str[2] == 'a') 229 { 230 scanf("%d",&tmp); 231 chat(tmp); 232 }else if(str[0] == 'R' && str[1] == 'o') 233 { 234 scanf("%d",&tmp); 235 rotata(tmp); 236 }else if(str[0] == 'P' && str[1] == 'r') 237 { 238 Prior(); 239 }else if(str[0] == 'C' && str[1] == 'h' && str[2] == 'o') 240 { 241 scanf("%d",&tmp); 242 choose(tmp); 243 }else if(str[0] == 'T') 244 { 245 scanf("%d",&tmp); 246 Top(tmp); 247 }else{ 248 Untop(); 249 } 250 //print(); 251 } 252 say(); 253 } 254 return 0; 255 }