关于这题的两个疑问

P1383 高级打字机

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


|