NOI’2003 - Day1 - Problem2 文本编辑器(Editor) 空间

题目百度把,太长了。

程序有点长,写的很渣。就不注释了。

 

  1 Program Stone;
  2
  3 var n,qu,ji,tot,root,move:longint;
  4
  5     s:array[0..5000000]of char;
  6
  7     lc,rc,f,o:array[0..5000000]of longint;
  8
  9
 10
 11  Procedure rightturn(x:longint);
 12
 13  var i,j,k:longint;
 14
 15   Begin
 16
 17     i:=f[x];
 18
 19     f[x]:=f[i];
 20
 21     if i=lc[f[i]] then lc[f[i]]:=x else rc[f[i]]:=x;
 22
 23     lc[i]:=rc[x];f[lc[i]]:=i;
 24
 25     rc[x]:=i;f[i]:=x;
 26
 27
 28
 29     o[i]:=o[lc[i]]+o[rc[i]]+1;
 30
 31     o[x]:=o[lc[x]]+o[rc[x]]+1;
 32
 33    end;
 34
 35  Procedure leftturn(x:longint);
 36
 37  var i,j,k:longint;
 38
 39   Begin
 40
 41     i:=f[x];
 42
 43     f[x]:=f[i];
 44
 45     if i=lc[f[i]] then lc[f[i]]:=x else rc[f[i]]:=x;
 46
 47     rc[i]:=lc[x];f[rc[i]]:=i;
 48
 49     lc[x]:=i;f[i]:=x;
 50
 51
 52
 53     o[i]:=o[lc[i]]+o[rc[i]]+1;
 54
 55     o[x]:=o[lc[x]]+o[rc[x]]+1;
 56
 57   end;
 58
 59
 60
 61  Procedure promote(x,z:longint);
 62
 63  var i,j,k:longint;
 64
 65   begin
 66
 67     k:=f[x];
 68
 69     if f[k]=z then begin
 70
 71                      if x=lc[k] then rightturn(x) else leftturn(x);
 72
 73                      exit;
 74
 75                    end;
 76
 77     if k=lc[f[k]] then begin
 78
 79                          if x=lc[k] then begin
 80
 81                                            rightturn(k);
 82
 83                                            rightturn(x);
 84
 85                                          end
 86
 87                                     else begin
 88
 89                                            leftturn(x);
 90
 91                                            rightturn(x);
 92
 93                                          end;
 94
 95                        end
 96
 97                   else begin
 98
 99                          if x=lc[k] then begin
100
101                                             rightturn(x);
102
103                                             leftturn(x);
104
105                                          end
106
107                                     else begin
108
109                                             leftturn(k);
110
111                                             leftturn(x);
112
113                                          end;
114
115                        end;
116
117   end;
118
119  Procedure splay(x,y:longint);
120
121  var i:longint;
122
123   begin
124
125     if x=y then exit;
126
127     while f[x]<>y do
128
129      begin
130
131        promote(x,y);
132
133      end;
134
135   end;
136
137
138
139  Procedure findk(m,x:longint);
140
141  var i,j,k:longint;
142
143   begin
144
145     if o[lc[x]]+1=m then begin qu:=x;exit;end;
146
147     if o[lc[x]]+1<m then begin findk(m-o[lc[x]]-1,rc[x]);exit;end;
148
149     if o[lc[x]]+1>m then begin findk(m,lc[x]);exit;end;
150
151   end;
152
153
154
155  Procedure built(x,y:longint);
156
157  var k:longint;
158
159   begin
160
161     if x=y then begin o[x]:=1;exit;end;
162
163     k:=(x+y)div 2;
164
165     o[k]:=y-x+1;
166
167     if x<=k-1 then begin
168
169                     lc[k]:=(x+k-1)div 2;
170
171                     f[(x+k-1)div 2]:=k;
172
173                     built(x,k-1);
174
175                    end;
176
177     if y>=k+1 then begin
178
179                     rc[k]:=(y+k+1)div 2;
180
181                     f[(y+k+1)div 2]:=k;
182
183                     built(k+1,y);
184
185                    end;
186
187   end;
188
189
190
191  Procedure insert(m:longint);
192
193  var i,j,k:longint;
194
195      c:char;
196
197   begin
198
199     k:=0;
200
201     while k<m do
202
203      begin
204
205        read(c);
206
207        if (ord(c)>=32)and(ord(c)<=126) then
208
209           begin
210
211             inc(tot);
212
213             s[tot]:=c;
214
215             inc(k);
216
217           end;
218
219      end;
220
221     readln;
222
223     if (tot-m+1<=tot-1) then begin
224
225                               built(tot-m+1,tot-1);
226
227                               lc[tot]:=(tot-m+tot)div 2;
228
229                               f[(tot-m+tot)div 2]:=tot;
230
231                              end;
232
233     o[tot]:=m+o[rc[root]];
234
235     rc[tot]:=rc[root];
236
237     f[rc[root]]:=tot;
238
239     rc[root]:=tot;
240
241     f[tot]:=root;
242
243     o[root]:=o[lc[root]]+o[rc[root]]+1;
244
245
246
247   end;
248
249
250
251  Procedure print(x:longint);
252
253   begin
254
255     if x<1 then exit;
256
257     if lc[x]<>0 then print(lc[x]);
258
259     if x<>1 then write(s[x]);
260
261     if rc[x]<>0 then print(rc[x]);
262
263   end;
264
265  procedure init;
266
267  var i,j,k,l,m:longint;
268
269      c:char;
270
271   begin
272
273      tot:=1;
274
275      root:=1;o[1]:=1;
276
277      move:=1;
278
279     readln(n);
280
281     for j:=1 to n do
282
283      begin
284
285        read(c);
286
287        case c of
288
289         ‘I‘:Begin
290
291               for i:=1 to 6 do read(c);
292
293               readln(m);
294
295               findk(move,root);
296
297               splay(qu,0);root:=qu;
298
299               insert(m);
300
301             end;
302
303         ‘M‘:Begin
304
305               for i:=1 to 4 do read(c);
306
307               readln(m);
308
309               move:=m+1;
310
311             end;
312
313         ‘D‘:Begin
314
315               for i:=1 to 6 do read(c);
316
317               readln(m);
318
319               findk(move,root);
320
321               splay(qu,0);root:=qu;
322
323               if m>o[rc[root]] then m:=o[rc[root]];
324
325               findk(m,rc[root]);
326
327               splay(qu,root);
328
329               rc[root]:=rc[qu];
330
331               f[rc[qu]]:=root;
332
333               o[root]:=o[root]-o[qu];
334
335             end;
336
337         ‘G‘:Begin
338
339               for i:=1 to 3 do read(c);
340
341               readln(m);
342
343               findk(move,root);
344
345               splay(qu,0);root:=qu;
346
347               findk(m,rc[root]);
348
349               splay(qu,root);
350
351               print(lc[qu]);
352
353               writeln(s[qu]);
354
355             end;
356
357         ‘P‘:Begin
358
359               for i:=1 to 4 do read(c);
360
361               readln;
362
363               move:=move-1;
364
365             end;
366
367         ‘N‘:Begin
368
369               for i:=1 to 4 do read(c);
370
371               readln;
372
373               move:=move+1;
374
375             end;
376
377        end;
378
379      end;
380
381   end;
382
383 Begin
384
385  assign(input,‘editor.in‘);assign(output,‘editor.out‘);
386
387  reset(input);rewrite(output);
388
389   init;
390
391  close(input);close(output);
392
393 end.
时间: 2024-10-12 08:00:09

NOI’2003 - Day1 - Problem2 文本编辑器(Editor) 空间的相关文章

BZOJ 1269 【AHOI2006】 文本编辑器editor

题目链接:文本编辑器editor 这道题没啥好说的,直接上\(Splay\)就行了,板子题-- 但是我某个地方忘了下放标记导致调了一晚上 保存一发板子: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define File(s) freopen(s".in","r",std

BZOJ 1269: [AHOI2006]文本编辑器editor( splay )

splay..( BZOJ 1507 题目基本相同..双倍经验 ) ----------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i <

【BZOJ1269】[AHOI2006]文本编辑器editor Splay

[BZOJ1269][AHOI2006]文本编辑器editor Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对"文本编辑器"做了一个抽象的定义:   文本:由0个或多个字符构成的序列.这些字符的ASCII码在闭区间[32, 126]内,也就是说,这些字符均为可见字符或空格.光标:在一段文本中用于指示位置的标记,可以位于文本的第一个字符之前,文本的最后一个字符之后或文本的某两个相邻字符之间

NOI2003 文本编辑器editor

1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1908  Solved: 738[Submit][Status] Description Input 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉它们(如果难以理解这句话,可以参考样例). 除了回车符之外,输入文件的所有字符的ASCII码都在

HYSBZ - 1269 文本编辑器editor (Splay 字符串的区间操作)

文本编辑器editor Time Limit: 10000MS   Memory Limit: 165888KB   64bit IO Format: %lld & %llu Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:   文本:由0个或多个字符构成的序列.这些字符的ASCII码在闭区间[32, 126]内,也就是说,这些字符均为可见字符或空格.光标:在一段文

[AHOI2006]文本编辑器editor

一不小心又开启了每天昏迷24个小时的状态,脑子不清醒的时候就该去看动画片. 只需要记录光标的位置即可,剩下的就是Splay的经典操作了,不多说了,我只是为了测试模板. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath>

AHOI2006文本编辑器editor

1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1885  Solved: 683[Submit][Status] Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:   文本:由0个或多个字符构成的序列.这些字符的ASCII码在闭区间[32, 126]内,也就是说

[AHOI2006]文本编辑器editor (Splay tree)

我感觉伸展树越来越模版了,没想到这么轻易的就过了... 把光标位置标记为pos MOVE:pos++或者pos-- INSERT:把光标旋转至根部,然后把光标后一个字母旋转至根的右子树,然后把insert的内容插入到root的右子树的左子树 ROTATE:把光标旋转至根部,然后把光标后一个字母旋转至根的右子树,然后把rev[root10]取反 GET:得到光标位置的后继,可以GET_KTH后然后GET_NEXT,也可以直接旋转,或者旋转后GET_MIN PREV,NEXT:都只需要改变光标位置变

【BZOJ】【1269】【AHOI2006】文本编辑器editor

Splay Splay序列维护的模板题了……为了便于处理边界情况,我们可以先插入两个空格当作最左端和最右端,然后……其实本题主要考察的就是Build.splay和Findkth这三个操作,我们可以实现一个splay(x,s)操作,使x结点旋转到s结点的下方(如果s为0则x旋转到根),这样可以方便地提取出要处理的区间. 这份模板我还是比较满意的,因为写的没那么长…… 1 /**************************************************************