社区讨论
性感代码在线求条
P1383高级打字机参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mj2voe0s
- 此快照首次捕获于
- 2025/12/12 21:03 3 个月前
- 此快照最后确认于
- 2025/12/14 14:50 3 个月前
CPP
//P1383 高级打字机
#include<bits/stdc++.h>
using namespace std;
#define emdl '\n'
const int MAXN=1e5+5;
struct node{
int l,r;
char ch;
int size;
}tr[40*MAXN];
int n;
int root[MAXN];
int idx;
int len[MAXN];
int build(int l,int r){
int p=++idx;
tr[p].size=0;
if(l==r){
return p;
}
int mid=l+r>>1;
tr[p].l=build(l,mid);
tr[p].r=build(mid+1,r);
return p;
}
int insert(int pre,int l,int r,int pos,char c){
int cur=++idx;
tr[cur]=tr[pre];
if(l==r){
tr[cur].ch=c;
tr[cur].size=1;
return cur;
}
int mid=l+r>>1;
if(pos<=mid+tr[tr[pre].l].size){
tr[cur].l=insert(tr[pre].l,l,mid,pos,c);
}
else{
tr[cur].r=insert(tr[pre].r,mid+1,r,pos-tr[tr[pre].l].size,c);
}
tr[cur].size=tr[tr[cur].l].size+tr[tr[cur].r].size;
return cur;
}
char query(int p,int l,int r,int pos){
if(l==r){
return tr[p].ch;
}
int mid=l+r>>1;
int left_size=tr[tr[p].l].size;
if(pos<=left_size){
return query(tr[p].l,l,mid,pos);
}
else{
return query(tr[p].r,mid+1,r,pos-left_size);
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
idx=0;
root[0]=build(1,n);
len[0]=0;
for(int i=1;i<=n;i++){
char op;
cin>>op;
if(op=='T'){
char x;
cin>>x;
root[i]=insert(root[i-1],1,n,len[i-1]+1,x);
len[i]=len[i-1]+1;
}
else if(op=='U'){
int x;
cin>>x;
root[i]=root[i-x-1];
len[i]=len[i-x-1];
}
else if(op=='Q'){
int x;
cin>>x;
char ans=query(root[i-1],1,n,x);
cout<<ans<<emdl;
root[i]=root[i-1];
len[i]=len[i-1];
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...