Codeforces 518C - Anya and Smartphone (模拟)

题意

一个屏幕有K个图标,每点一次图标图标就会往前移一位,现在问总的点击次数。

思路

模拟即可。我还用了两个map来映射,其实只要用数组就行了。懒得改了。

代码

map<int, pii> mp;
map<pii, int> rmp;
 
void Swap(int a, int b)
{
    int xa = mp[a].X, ya = mp[a].Y;
    int xb = mp[b].X, yb = mp[b].Y;
    mp[a].X = xb, mp[a].Y = yb;
    mp[b].X = xa, mp[b].Y = ya;
    rmp[MP(xa, ya)] = b; rmp[MP(xb, yb)] = a;
}
 
int main()
{
    //ROP;
    ios::sync_with_stdio(0);
 
    int n, m, k;
    cin >> n >> k >> m;
    int tmp;
    for (int i = 0; i < n; i++)
    {
        cin >> tmp;
        mp[tmp] = {i/m, i%m};
        rmp[MP(i/m, i%m)] = tmp;
    }
    LL ans = 0;
    while (k--)
    {
        cin >> tmp;
        int x = mp[tmp].X, y = mp[tmp].Y;
        ans += x+1;
        if (x == 0 && y == 0) continue;
        //处理不跨页的情况
        if (y != 0)
        {
            int preElement = rmp[MP(x, y-1)];
            Swap(tmp, preElement);
        }
        if (y == 0) //跨页
        {
            int preElement = rmp[MP(x-1, m-1)];
            Swap(tmp, preElement);
        }
    }
    cout << ans << endl;
    return 0;
}

Powered by Jekyll and Theme by solid