首页 > 其他分享 >Manthan, Codefest 18 (rated, Div. 1 + Div. 2) D. Valid BFS?

Manthan, Codefest 18 (rated, Div. 1 + Div. 2) D. Valid BFS?

时间:2024-04-29 10:12:03浏览次数:26  
标签:Manthan rated cur int al should vis Div 节点

题意:给一个树和一个bfs序,并保证从节点1出发,判bfs序是否合法。

思路:双指针,在bfs序上从左往右遍历。慢指针指向当前节点u,快指针指向当前节点应该访问的节点的位置。 然后设两个集合,一个集合存储在当前节点上应该访问的节点,另一个存储在当前节点上实际访问的节点,然后遍历即可。

总结:一开始想的是对每个节点求一个深度,然后保证节点的深度非递减排序就行了,但是这个算法有个bug,就是如果同层节点的访问顺序不同,那么下一层的节点访问顺序也不同,即使它们的深度都是一样的,这种深度判定的方法漏掉了这种情况。

void solve(){
    int n;
    cin >> n;

    vector<vector<int>> al(n);
    for (int i = 0; i < n - 1; ++i){
        int u, v;
        cin >> u >> v;
        u --;
        v --;
        al[u].emplace_back(v);
        al[v].emplace_back(u);
    }

    vector<int> order(n);
    for (int i = 0; i < n; ++i){
        int cur;
        cin >> cur;
        cur --;
        order[i] = cur;
    }

    vector<bool> vis(n);
    vis[0] = 1;
    bool ok = true;
    int i, j;
    for (i = 0, j = 1; i < n; ){
        int u = order[i];
        set<int> should_vis;
        for (const int& v : al[u]){
            if (vis[v] == false){
                should_vis.insert(v);
            }
        }
        set<int> has_vis;
        for (int s = j; s < j + int(should_vis.size()); ++s){
            has_vis.insert(order[s]);
        }
        if (has_vis != should_vis){
            ok = false;
            break;
        }
        for (const int& v : should_vis){
            vis[v] = true;
        }
        i ++;
        j += int(should_vis.size());
    }

    cout << (ok ? "Yes" : "No") << '\n';
}

标签:Manthan,rated,cur,int,al,should,vis,Div,节点
From: https://www.cnblogs.com/yxcblogs/p/18165078

相关文章

  • Codeforces Round 941 (Div. 1) 题解(A-C)
    比赛链接:https://codeforces.com/contest/1965官解链接:https://codeforces.com/blog/entry/128914比较手速的一场,C与D之间出现了较大的gifficultygap。所幸C题猜得比较快(虽然证明其实比较难),最终rank190,performance2525,成功压线拿下Grandmaster。cpchenpi,堂堂上红!......
  • Codeforces Round 941 (Div. 2)
    A.CardExchange贪心。如果有某个数出现\(k\)次及以上,则通过操作使其数量变为\(k\),再变为其他出现过的数,则会增加至至少\(k\)个,一直进行如上操作,可以发现数组最终只剩\(k-1\)个数;否则为\(n\)。#include<bits/stdc++.h>usingnamespacestd;#definecctieios::......
  • Codeforces Round 941 (Div. 2) D
    好坐牢的一次div2ABC是速通的,结果cf的pretest太弱了。。然后我这次因为想快点,没有再去好好顺一遍思路,状态又不太好,写了一个好简单的错,结果过了。导致我被hack了,爆掉100分。好烦。主要说说这个D。现在能够从算式的层面上理解了这个做法的正确性,就是把二进制位的数字放进去,然后......
  • js调整div顺序
    js调整div顺序并保留div原有事件等<divclass="my_tabs"><divclass="el-tabs__nav-scroll"><divclass="el-tabs__nav"><divclass="el-tabs__itemis-active">AAAA</div><d......
  • Codeforces Round 936 (Div. 2)
    A考虑有\(x\)个数与中位数相同,且在中位数之后,则答案为\(x+1\)(+1是因为中位数本身)。B明显的,每次操作序列的最大子段和。那么操作完以后,继续操作这个区间即可,相当于每次翻倍。假设原序列最大子段和为区间\([l,r]\),则答案为:\[sum(1,n)-sum(l,r)+sum(l,r)\times2^k\]记......
  • Codeforces Round 931 (Div. 2) D2
    挺简单的题目,就是一个普通博弈论套了一个交互的皮。。。但是恶心的就是,交互的皮是真难顶啊,什么sb玩意,我因为爆了int一直给我现实TLEontest1,这我怎么调?不得不说,交互题和普通的题目真是差别太大了,就评测这一块,返回的消息完全无法给我有效的指导。。然后我就直接坐大牢。要是这......
  • Codeforces Round 939 (Div. 2) E1-E2
    CodeforcesRound939(Div.2)E1.Nenevs.Monsters(EasyVersion)题意:有n个怪物,能量等级为\(a_i\),现在可以使用一种法术,使第1个怪物攻击第2个怪物,第2个怪物攻击第3个怪物……第n个怪物攻击第1个怪物,当能量等级为x的怪物攻击能量等级为y的怪物时,怪物y->max(y-x,0),在经过\(1......
  • Codeforces Round 892 (Div. 2) E
    E的话一眼dp,然后观察一下方程,\(f[i][j]表示前i个位置已经选了长度为j的区间,且第i个位置已经被选上时,能够获得的最大值\)\[f[i][j]=\displaystyle\max_{1\leqk\leqmin(i,j)}(f[i-k][j-k]+calc(i-k+1,j))\\calc(l,r)=|b_l-a_r|+|b_r-a_l|\]这样的dp是\(O(n^2k)\)的,而\(1\leqk......
  • cf 1601B Frog Traveler Codeforces Round 751 (Div. 1)
     Problem-1601B-Codeforces BFS然后每次上升可以的范围是一个区间,然后每次都遍历这个区间的所有点,那么超时。用set等方式,合并这些区间,之前没遍历过的范围才更新(加入BFS需要遍历的队列里)。但是区间的更新特别容易写错…… 我的代码和造数据1/**2记录两个vi......
  • Codeforces Round 940 (Div. 2) and CodeCraft-23 题解
    CodeforcesRound940(Div.2)andCodeCraft-23题解题目链接A.Stickogon贪心#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#defineendl'\n'#definedebu......