scanf("%s")碰到空格会停吧
by CarroT5656 @ 2022-11-20 19:12:13
1. 非常显然 scanf 必然是写挂问题,或者您可以挂个代码
2. f 的运算顺序是先把 a 加了然后进 f,第二个的顺序是未定义的,编译器爱咋处理咋处理
3. 这题是见过最恶心的一题,我的建议是多练
by UnyieldingTrilobite @ 2022-11-20 19:12:44
还有++运算好像在你举的例子里面是最优的?
by CarroT5656 @ 2022-11-20 19:14:16
@[UnyieldingTrilobite](/user/250637) 我写挂了???
10分代码:
```cpp
#include<bits/stdc++.h>
#define ls tree[p].l
#define rs tree[p].r
#define N 100010
using namespace std;
int t,cnt=1,node,rt[N<<5];
struct hjt{
int l,r;
char data;
int size;
} tree[N<<5];
void update(int &p,int fa,int l,int r,char c){
p=++cnt;
ls=tree[fa].l;
rs=tree[fa].r;
tree[p].data=tree[fa].data;
tree[p].size=tree[fa].size;
if(l==r){
tree[p].data=c;
tree[p].size=1;
return;
}
int mid=l+r>>1;
if(tree[ls].size==mid-l+1) update(rs,tree[fa].r,mid+1,r,c);
else update(ls,tree[fa].l,l,mid,c);
tree[p].size=tree[ls].size+tree[rs].size;
}
char query(int p,int l,int r,int k){
if(l==r) return tree[p].data;
int mid=l+r>>1;
if(k<=tree[ls].size) return query(ls,l,mid,k);
else return query(rs,mid+1,r,k-tree[ls].size);
}
int main(){
scanf("%d",&t);
for(int i=1;i<=t;i++){
char c[1];
scanf("%s",c);
if(c[0]=='T'){
char x[1];
scanf("%s",x);
node++;
update(rt[node],rt[node-1],1,t,x[0]);
}else if(c[0]=='U'){
int x;
scanf("%d",&x);
node++;
rt[node]=rt[node-x-1];
}else{
int x;
scanf("%d",&x);
putchar(query(rt[node],1,t,x));
putchar(10);
}
}
return 0;
}
```
满分代码:
```cpp
#include<bits/stdc++.h>
#define ls tree[p].l
#define rs tree[p].r
#define N 100010
using namespace std;
int t,cnt=1,node,rt[N];
struct hjt{
int l,r;
char data;
int size;
} tree[N<<5];
void update(int &p,int fa,int l,int r,char c){
p=++cnt;
ls=tree[fa].l;
rs=tree[fa].r;
tree[p].data=tree[fa].data;
tree[p].size=tree[fa].size;
if(l==r){
tree[p].data=c;
tree[p].size=1;
return;
}
int mid=l+r>>1;
if(tree[ls].size==mid-l+1) update(rs,tree[fa].r,mid+1,r,c);
else update(ls,tree[fa].l,l,mid,c);
tree[p].size=tree[ls].size+tree[rs].size;
}
char query(int p,int l,int r,int k){
if(l==r) return tree[p].data;
int mid=l+r>>1;
if(k<=tree[ls].size) return query(ls,l,mid,k);
else return query(rs,mid+1,r,k-tree[ls].size);
}
int main(){
scanf("%d",&t);
for(int i=1;i<=t;i++){
char c;
cin>>c;
if(c=='T'){
char x;
cin>>x;
node++;
update(rt[node],rt[node-1],1,t,x);
}else if(c=='U'){
int x;
cin>>x;
node++;
rt[node]=rt[node-x-1];
}else{
int x;
scanf("%d",&x);
putchar(query(rt[node],1,t,x));
putchar(10);
}
}
return 0;
}
```
by YuRuochen @ 2022-11-20 19:36:20
@[YuRuochen](/user/658786) 数组开小,c开到[2]就可以了
字符数组最后一位要存\0,长度要预留一个
by UnyieldingTrilobite @ 2022-11-20 21:00:19