CodeForces - 518C Anya and Smartphone

题意:

安雅购买了一只带有Berdroid操作系统的智能手机。智能手机菜单中有n个应用,每个应用程序都有其自己的图标。每个应用的图标都在相应的屏幕上,一个屏幕包含ķ个图标。第1个应用到第k个应用的图标位于第一个屏幕上,从第(k + 1)个至第2k个应用在第二个屏幕上,依次类推(最后屏幕可以是部分为空) 。
 
开始的时候,智能手机显示的屏幕是第一个屏幕,为了去启动第t个屏幕上的应用,安雅需要做如下的手势:首先是连续切换屏幕t-1次,其次是点击第t个屏幕上的那个应用程序。
 
在应用程序启动以后,屏幕会重新返回到第1个屏幕。也就是说,如果你要启动下一个程序,必须又要重头来过。
 
所有应用程序的编号是从1到n。我们知道所有屏幕中每个应用程序的位置。但是Berdroid是智能系统,他会根据用户实际的使用情况,自动把使用次数最多的应用放到最前面。变化规则是这样的,当一个应用程序启动以后,系统会自动的将该程序的图标位置和他前面的那个应用程序的图标互换位置(可能会导致图标不在原来的屏幕上)。当然了,如果那个被启动的应用程序已经在第一个位置上了,就不需要再更换位置了。
 
如果你已经知道安雅启动某些应用程序的顺序,请你来计算他需要多个手势(切换一个屏幕或者点击一个应用程序图标都算作一次手势)来完成这些任务。
 
注意,一个应用可以发起多次。
Input
输入的第一行包含三个整数n,m,k(1≤n,m,k≤10^5),n表示应用程序的数量,m表示将要启动的应用程序的数量,k表示每个屏幕上图标的数量。
 
第二行包含n个整数,分别为a1,a2,...,an,表示初始的时候应用程序图标的顺序,按照这个顺序放到一个个屏幕中去。ai是每个应用程序的编号,ai不会重复。
 
第三行包含m个整数b1,b2,...,bm(1≤bm≤n),表示安雅计划启动的应用程序的编号。一个应用程序可能会启动多次。
Output

输出一个整数,表示安雅完成这些任务需要使用的手势次数。

Sample Input
输入样例1:
8 3 3
1 2 3 4 5 6 7 8
7 8 1
 
输入样例2:
5 4 2
3 1 5 2 4
4 4 4 4
Sample Output
输出样例1:
7
 
输出样例2:
8
Hint
在第一个样例中的起始位置是(123)(456)(78),也就是,在第一个屏幕包含应用程序1,2,3的图标,第二个屏幕包含图标4,5,6,第三个屏幕包含图标7,8。
 
应用7启动后,我们得到新的图标位置-(123)(457)(68)。这过程需要3次手势。
 
应用8被启动后,我们得到的位置(123)(457)(86),要启动它安雅需要使用3次手势。
 
应用1启动后,图标菜单中的排列没有变化,要启动它安雅需要1次手势。
 
所以说,总共需要3+3+1=7次手势。

思路:

        维护每个位置上的数,和每个数的位置就行。

代码:

#include <bits/stdc++.h>

using namespace std;
const int MAXN=1e5+100;
int n,m,k,x,num1,num2,pos1,pos2;
int pos[MAXN];
int num[MAXN];
int main()
{
    while(cin>>n>>m>>k){
        for(int i=1;i<=n;i++){
            scanf("%d",&x);
            pos[x]=i;
            num[i]=x;
        }
        long long ans=m;
        while(m--){
            scanf("%d",&x);
            ans+=(pos[x]-1)/k;
            if(pos[x]!=1){
                pos1=pos[x];
                num1=x;
                num2=num[pos1-1];
                pos2=pos[num2];
                swap(num[pos1],num[pos2]);
                swap(pos[num1],pos[num2]);
            }
        }
        cout<<ans<<endl;
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值