题目链接:https://codeforces.com/problemset/problem/665/B
Ayush is a cashier at the shopping center. Recently his department has started a ''click and collect" service which allows users to shop online.
The store contains k items. n customers have already used the above service. Each user paid for m items. Let aij denote the j-th item in the i-th person’s order.
Due to the space limitations all the items are arranged in one single row. When Ayush receives the i-th order he will find one by one all the items aij (1 ≤ j ≤ m) in the row. Let pos(x) denote the position of the item x in the row at the moment of its collection. Then Ayush takes time equal to pos(ai1) + pos(ai2) + … + pos(aim) for the i-th customer.
When Ayush accesses the x-th element he keeps a new stock in the front of the row and takes away the x-th element. Thus the values are updating.
Your task is to calculate the total time it takes for Ayush to process all the orders.
You can assume that the market has endless stock.
Input
The first line contains three integers n, m and k (1 ≤ n, k ≤ 100, 1 ≤ m ≤ k) — the number of users, the number of items each user wants to buy and the total number of items at the market.
The next line contains k distinct integers pl (1 ≤ pl ≤ k) denoting the initial positions of the items in the store. The items are numbered with integers from 1 to k.
Each of the next n lines contains m distinct integers aij (1 ≤ aij ≤ k) — the order of the i-th person.
Output
Print the only integer t — the total time needed for Ayush to process all the orders.
Example
Input
2 2 5
3 4 1 2 5
1 5
3 1
Output
14
Note
Customer 1 wants the items 1 and 5.
pos(1) = 3, so the new positions are: [1, 3, 4, 2, 5].
pos(5) = 5, so the new positions are: [5, 1, 3, 4, 2].
Time taken for the first customer is 3 + 5 = 8.
Customer 2 wants the items 3 and 1.
pos(3) = 3, so the new positions are: [3, 5, 1, 4, 2].
pos(1) = 3, so the new positions are: [1, 3, 5, 4, 2].
Time taken for the second customer is 3 + 3 = 6.
Total time is 8 + 6 = 14.
Formally pos(x) is the index of x in the current row.
题意:
商店由于空间限制,所有物品排列成一排。当收到要买第i个订单时,将逐行找到这个位置的商品的值,然后把这个商品位置下标找出,拿出来,并把它前面数往后移一位,然后把找到的这个商品移到最前面的位置,有n*m次这样的操作;让你求出在每一次pos后所有需要找出的商品的下标的和。
当时做时把题意看成是求所要找数的值加起来,刚好第一组样例过了,后来比完赛后发现就改成求查找的下标的和;就把一个地方给成num,就过了,好气,¥%&#@#3…
英语是硬伤!!!
解题思路:
使用两个数组,一个a数组存入要输入的数,另一个b数组也同样存入这样的数,之后输入的一个数,找出它再a数组的位置下标,并拿出这个数,然后把这个数前面的数都往后移,再将这个数放到最前面。每次都用b数组做桥梁;具体看代码,很简单,坑点就是样例,你可能会看成是求的是找出得数而不是下标的和;
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include<queue>
#include <math.h>
#include <string.h>
#define ll long long
#define pi 3.14159265358979
using namespace std;
const int MAXN=500;
int b[MAXN],w[MAXN];
int main()
{
int a,bb,c,s;
while(cin>>a>>bb>>c){
memset(b,0,sizeof(b));
memset(w,0,sizeof(w));
for(int i=1;i<=c;i++)
{
cin>>b[i];
w[i]=b[i];
}
int sum;
ll num=0;
for(int i=0;i<a;i++)
{
for(int j=0;j<bb;j++)
{
cin>>s;//输入一个值
for(int k=1;k<=c;k++)
{
if(s==b[k])//查找到这个值的下标
{
sum=k;//记录下标
break;
}
}
num+=sum;//将找到的下标的值进行相加
// cout<<num<<"*"<<endl;
b[1]=b[sum];//开始把要查找的那个数,拿出来移到最前面,把数往后移一位,形成新的位置
for(int k=1;k<=c;k++)
{
if(k==sum)//指标到之前找到的那个下标的位置时,后面的数其实就不用改变了;
break;
b[k+1]=w[k];
}
for(int k=1;k<=c;k++)
{
w[k]=b[k];
//cout<<w[k]<<" ";
}
//cout<<endl;
}
}
cout<<num<<endl;
}
return 0;
}
翻译
商店包含k个项目。 n客户已使用上述服务。每个用户支付m项。让aij表示第i个人的顺序中的第j个项目。由于空间限制,所有物品排列成一排。当Ayush收到第i个订单时,他将逐一找到该行中所有项目aij(1≤j≤m)。设pos(x)表示项目x在收集时的行中的位置。然后Ayush花费时间等于pos(ai1)+ pos(ai2)+ … + pos(目标)为第i个顾客。
当Ayush访问第x个元素时,他在行的前面保留一个新的股票并取走第x个元素。因此值正在更新。
您的任务是计算Ayush处理所有订单所需的总时间。
你可以假设市场有无穷无尽的股票。
输入
第一行包含三个整数n,m和k(1≤n,k≤100,1≤m≤k) - 用户数量,每个用户想要购买的商品数量以及市场上的商品总数。
下一行包含k个不同的整数pl(1≤pl≤k),表示商店中商品的初始位置。这些项目的编号为1到k之间的整数。
接下来的n行中的每一行包含m个不同的整数aij(1≤aik≤k) - 第i个人的顺序。
产量
打印唯一的整数t - Ayush处理所有订单所需的总时间。
例
输入
2 2 5
3 4 1 2 5
1 5
3 1
产量
14
注意
客户1需要项目1和5。
pos(1)= 3,所以新的位置是:[1,3,4,2,5]。
pos(5)= 5,所以新的位置是:[5,1,3,4,2]。
第一位客户的时间是3 + 5 = 8。
客户2想要商品3和1。
pos(3)= 3,所以新的位置是:[3,5,1,4,2]。
pos(1)= 3,所以新的位置是:[1,3,5,4,2]。
第二个客户的时间是3 + 3 = 6。
总时间为8 + 6 = 14。
正式pos(x)是当前行中x的索引。