XJTUOJ #1323. [L2-2]三倍满世界

题目

https://oj.xjtuicpc.com/problem/1323

思路

题目说明有点绕。

然后我们仔细观察一下,这个东西很显然是一个天然的树形结构。

我们可以把一个空间(或者一个数)当成结点,门当成边,然后这个问题就是在树上边上上下下,支持随时加点删点和输出子结点。

然后一个大模拟就过了。

插入和删除很讨厌,可以直接用vector省得手写。

大水题一道,然而赛时降智打击加上前面的题一直pending心态爆炸,没调出来。

每次打比赛都状态奇差,属实丢人,感觉还是得多打多练。。。

代码

点击查看代码
#include<cstdio>
#include<cstdlib>
#include<vector>
#define maxn 100010
using namespace std;
int fa[maxn],idx=1,val[maxn];
vector<int> son[maxn];
int main(){
    int i,j,q,p,v,op;
    int pos=1;
    scanf("%d",&q);
    for(i=1;i<=q;++i){
        scanf("%d",&op);
        if(op==1){
            scanf("%d%d",&p,&v);
            son[pos].insert(son[pos].begin()+p,++idx);
            fa[idx]=pos;
            val[idx]=v;
        }
        if(op==2){
            scanf("%d",&p);
            son[pos].erase(son[pos].begin()+p-1);
        }   
        if(op==3){
            scanf("%d",&p);
            if(!p){
                if(fa[pos]) pos=fa[pos];
            }
            else{
                if(!val[son[pos][p-1]]) pos=son[pos][p-1];
            }
        }
        if(op==4){
            int k=son[pos].size();
            printf("{");
            for(j=0;j<k;++j){
                if(val[son[pos][j]]) printf("%d",val[son[pos][j]]);
                else printf("[]");
                if(j<k-1) printf(" ");
            }
            printf("}\n");
        }
    }
    // system("pause");
    return 0;
}
posted @ 2022-04-21 13:36  文艺平衡树  阅读(25)  评论(1编辑  收藏  举报