HDU 4286(Data Handler-支持翻转的list)

来源:互联网 发布:alpha软件官方网站 编辑:程序博客网 时间:2024/04/29 07:32

要求维护一个seq,有两个光标(左光标和右光标)。
要求维护:移动光标,在光标前后加字母/删除,翻转两个光标间的序列
n<=500000,保证操作合法,左光标总在右光标左边至少一个字母前。

如果没有翻转就是普通链表,
我们考虑将序列拆成左,光标之间,右三段
发现只需要考虑中间那段是否翻转过即可,如果翻转,则变头为尾,向链表一样维护
ps:当然splay块链什么的我也是兹磁de

#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<functional>#include<iostream>#include<cmath>#include<cctype>#include<ctime>#include<iomanip> #include<vector>#include<string>#include<queue>#include<stack>#include<map>#include<deque>#include<sstream>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (1000000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define Pr(kcase,ans) printf("Case #%d: %I64d\n",kcase,ans);#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } #pragma comment(linker, "/STACK:102400000,102400000")typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return ((a-b)%F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} #define MAXN (1000000+10)deque<int> A,B,C;deque<int>::iterator it;int a[MAXN],n;int L,R;int Pop_front(deque<int> &t) {    int tmp=t.front();    t.pop_front();    return tmp;}int Pop_back(deque<int> &t) {    int tmp=t.back();    t.pop_back();    return tmp;}bool fl=0,dir=0;void Print() {    fl=0;    for(it=A.begin();it!=A.end();++it) {        if (fl) putchar(' '); fl=1;        printf("%d",*it);           }    if (!dir)         for(it=B.begin();it!=B.end();++it) {        if (fl) putchar(' '); fl=1;        printf("%d",*it);           }    else         for(deque<int>::reverse_iterator it=B.rbegin();it!=B.rend();++it) {        if (fl) putchar(' '); fl=1;        printf("%d",*it);           }    for(it=C.begin();it!=C.end();++it) {        if (fl) putchar(' '); fl=1;        printf("%d",*it);           }    puts("");}int main(){//  freopen("A.in","r",stdin);//  freopen(".out","w",stdout);    int T=read();    while(T--) {        A.clear();B.clear(),C.clear();         n=read();        For(i,n) a[i]=read();        cin>>L>>R;        For(i,n)            if (i<L) A.push_back(a[i]);            else if (i<=R) B.push_back(a[i]);            else C.push_back(a[i]);        int q=read();        dir=0;        while(q--) {            char s[100]; scanf("%s",s);            if (strcmp(s,"MoveLeft")==0) {                char c[2]; scanf("%s",c);                if (c[0]=='L') {if (!dir) B.push_front(Pop_back(A)); else B.push_back(Pop_back(A));}                else {if (!dir) C.push_front(Pop_back(B)); else C.push_front(Pop_front(B)); }            }            else if (strcmp(s,"MoveRight")==0) {                char c[2]; scanf("%s",c);                if (c[0]=='L') {if (!dir) A.push_back(Pop_front(B)); else A.push_back(Pop_back(B));}                else {if (!dir) B.push_back(Pop_front(C)); else B.push_front(Pop_front(C)); }             }            else if (strcmp(s,"Insert")==0) {                char c[2];int p; scanf("%s%d",c,&p);                if (c[0]=='L' xor dir) B.push_front(p);                else B.push_back(p);            }            else if (strcmp(s,"Delete")==0) {                char c[2]; scanf("%s",c);                if (c[0]=='L' xor dir) B.pop_front();                else B.pop_back();            }            else {                dir^=1;            }        }        Print();    }    return 0;}
0 0
原创粉丝点击