Educational Codeforces Round 177 (Rated for Div. 2) Finished - C - 思维

当Pdi被修改为0时,可能会引起一连串修改。

举个例子,题目样例2 :
5
4 5 3 1 2
4 5 1 3 2

当P4被修改为0时,我们肯定就需要对P4进行复原操作,P排列出现两个4了,这时也需要对P1进行复原操作(大家可以尝试其他样例)。
相信大家不难发现规律,当我们修复Pi时,令idx1 = Pi,Pidx1也可能需要进行修复,同理令idx2 = Pidx1,Pidx2也可能需要进行修复,以此类推...

为什么说是“可能需要进行修复呢”,是因为如果某个位置之前就被修复过了的话,就不需要重复修复了

代码:

#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>
#define ll long long
#define endl '\n'
using namespace std;

ll a[100010];
void solve()
{
    ll n;
    cin >> n;
    for(ll i = 1; i <= n; i ++)
    {
        cin >> a[i];
    }
    bool markk[n + 10] = {0};
    ll ans = 0;
    for(ll i = 1; i <= n; i ++)
    {
        ll d;
        cin >> d;
        for(ll i = d; markk[i] == 0; i = a[i])
        {
            ans ++;
            markk[i] = 1;
        }
        cout << ans << " ";
    }
    cout << endl;
    return ;
}
int main()
{
    ll t = 1;
    cin >> t;
    while(t --)
    {
        solve();
    }
    return 0;
}

刚开始我没想明白顺序进行,于是我就开始想逆序进行,没有太想明白,而且好麻烦,然后就转顺序进行了,还是比较容易想起来的
最近做了几道逆序思考的题,给我做魔怔了QWQ

posted @ 2025-04-04 16:25  zzuxx  阅读(123)  评论(0)    收藏  举报