【JZOJ 5249】【NOIP2017提高A组模拟8.10】文本编辑器
来源:互联网 发布:软件注册赚钱靠谱吗 编辑:程序博客网 时间:2024/05/16 04:15
Description
Solution
这道题用Splay是一道版子题,
但很遗憾,只有90分,
那O(n)怎么做呢?
我们发现,对于全局的数,可以用2个栈,1个队列表示:
设两个光标位置为l,r,
两个栈分别表示l前面的数、r后面的数,队列表示l~r中间的数,
那么对于简单的移动操作,直接做即可,
对于翻转,我们发现,直接打上标记即可,在光标移动的时候判断一下即可,
当然还有特殊情况:当r在l左边(注意题目对左右光标的定义),这样就有问题,
我们发现,对于这种情况,把l,r互换,这样除了不能翻转以外, 操作与正常情况相比没有区别,
那么就打上两个标记即可,代码嘛….真有点恶心啊QwQ~
复杂度
Code
#include <iostream>#include <cstdio>#include <cstdlib>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)#define min(q,w) ((q)>(w)?(w):(q))#define max(q,w) ((q)<(w)?(w):(q))#define SD(q) ((q)==b[b[q].fa].r)using namespace std;const int N=8000500;int read(int &n){ char ch=' ';int q=0,w=1; for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar()); if(ch=='-')w=-1,ch=getchar(); for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n;}int m,n,ans,alln;int dh[N],dt[N];int d[N*2];bool RT,OK;int main(){ int q,w,_;char ch; int S=N,T=N-1; for(ch=getchar();ch<=126&&ch>=33;ch=getchar())d[++T]=ch; read(_); fo(II,1,_) { for(ch=' ';ch!='I'&&ch!='>'&&ch!='<'&&ch!='D'&&ch!='R'&&ch!='S';ch=getchar()); char k=ch; if(ch=='S') { fo(i,1,dh[0])putchar(dh[i]); if(RT)fod(i,T,S)putchar(d[i]); else fo(i,S,T)putchar(d[i]); fod(i,dt[0],1)putchar(dt[i]); putchar('\n'); continue; } if(ch=='R') { if(!OK&&S<=T)RT=!RT,putchar('T'),putchar('\n'); else putchar('F'),putchar('\n'),RT=0; continue; } for(ch=' ';ch!='L'&&ch!='R';ch=getchar()); if(OK){if(ch=='L')ch='R';else ch='L';} if(k=='<') { if(ch=='L') { if(dh[0]) { if(RT)d[++T]=dh[dh[0]--]; else d[--S]=dh[dh[0]--]; putchar('T'),putchar('\n'); } else putchar('F'),putchar('\n'); }else { if(S<=T) { if(RT)dt[++dt[0]]=d[S++]; else dt[++dt[0]]=d[T--]; putchar('T'),putchar('\n'); } else { if(dh[0]) { putchar('T'),putchar('\n'); OK=!OK;RT=0; d[--S]=dh[dh[0]--]; }else putchar('F'),putchar('\n'); } } }else if(k=='>') { if(ch=='R') { if(dt[0]) { if(RT)d[--S]=dt[dt[0]--]; else d[++T]=dt[dt[0]--]; putchar('T'),putchar('\n'); } else putchar('F'),putchar('\n'); }else { if(S<=T) { if(RT)dh[++dh[0]]=d[T--]; else dh[++dh[0]]=d[S++]; putchar('T'),putchar('\n'); } else { if(dt[0]) { putchar('T'),putchar('\n'); OK=!OK;RT=0; d[++T]=dt[dt[0]--]; }else putchar('F'),putchar('\n'); } } }else if(k=='I') { putchar('T'),putchar('\n'); char ch1=ch; for(ch=getchar();ch>126||ch<33;ch=getchar()); if(ch1=='R') { if(RT)d[--S]=ch; else d[++T]=ch; }else dh[++dh[0]]=ch; }else { if(ch=='L') { if(S>T) { if(!dt[0])putchar('F'),putchar('\n'); putchar('T'),putchar('\n'); dt[0]--; } else {if(RT)T--;else S++;putchar('T'),putchar('\n');} }else { if(!dt[0]){putchar('F'),putchar('\n');continue;} dt[0]--;putchar('T'),putchar('\n'); } } } return 0;}
阅读全文
0 0
- 【JZOJ 5249】【NOIP2017提高A组模拟8.10】文本编辑器
- JZOJ5249. 【NOIP2017提高A组模拟8.10】文本编辑器
- 【NOIP2017提高A组模拟8.10】文本编辑器
- 【JZOJ5249】【NOIP2017提高A组模拟8.10】文本编辑器
- jzoj5249 【NOIP2017提高A组模拟8.10】文本编辑器 (序列修改类问题,数据结构)
- 【JZOJ 4931】【NOIP2017提高组模拟12.24】A
- 【JZOJ 4931】【NOIP2017提高组模拟12.24】A
- JZOJ 5195. 【NOIP2017提高组模拟7.3】A
- JZOJ 100026. 【NOIP2017提高A组模拟7.7】图
- JZOJ 100030. 【NOIP2017提高A组模拟7.8】为了爱情
- jzoj. 100031. 【NOIP2017提高A组模拟7.9】外星密码
- JZOJ 100035【NOIP2017提高A组模拟7.10】区间
- JZOJ 100036 【NOIP2017提高A组模拟7.10】随机
- JZOJ 100037【NOIP2017提高A组模拟7.11】后缀数组
- JZOJ 100035. 【NOIP2017提高A组模拟7.10】区间
- JZOJ 100041. 【NOIP2017提高A组模拟7.12】列车调度
- JZOJ 100045. 【NOIP2017提高A组模拟7.13】好数
- JZOJ 100046. 【NOIP2017提高A组模拟7.14】收集卡片
- Java开发中的23种设计模式详解
- 2017多校训练6-1008:Kirinriki(HDU6103)
- 为什么用下标遍历容器如此有用
- 1111111111111111111111111111
- Spark---Datasource(JDBC)---Scala
- 【JZOJ 5249】【NOIP2017提高A组模拟8.10】文本编辑器
- 1062. 最简分数(20)
- 每个程序员都应该收藏的算法复杂度速查表
- 2017杭电多校第六场 1011 (勉强算容斥吧)HDU 6106
- Square Destroyer UVA
- jedis操作redis,结合spring,原生方法
- 微信小程序获取用户信息官方推荐方案
- App冷启动与启动白屏处理
- 站在巨人的肩膀上之bill分享有感