New Year is coming, and Jaehyun decided to read many books during 2015, unlike this year. He has n books numbered by integers from 1 to n. The weight of the i-th (1 ≤ i ≤ n) book is wi.
As Jaehyun‘s house is not large enough to have a bookshelf, he keeps the n books by stacking them vertically. When he wants to read a certain book x, he follows the steps described below.
- He lifts all the books above book x.
- He pushes book x out of the stack.
- He puts down the lifted books without changing their order.
- After reading book x, he puts book x on the top of the stack.
He decided to read books for m days. In the j-th (1 ≤ j ≤ m) day, he will read the book that is numbered with integer bj(1 ≤ bj ≤ n). To read the book, he has to use the process described in the paragraph above. It is possible that he decides to re-read the same book several times.
After making this plan, he realized that the total weight of books he should lift during m days would be too heavy. So, he decided to change the order of the stacked books before the New Year comes, and minimize the total weight. You may assume that books can be stacked in any possible order. Note that book that he is going to read on certain step isn‘t considered as lifted on that step. Can you help him?
Input
The first line contains two space-separated integers n (2 ≤ n ≤ 500) and m (1 ≤ m ≤ 1000) — the number of books, and the number of days for which Jaehyun would read books.
The second line contains n space-separated integers w1, w2, ..., wn (1 ≤ wi ≤ 100) — the weight of each book.
The third line contains m space separated integers b1, b2, ..., bm (1 ≤ bj ≤ n) — the order of books that he would read. Note that he can read the same book more than once.
Output
Print the minimum total weight of books he should lift, which can be achieved by rearranging the order of stacked books.
Sample test(s)
input
3 51 2 31 3 2 3 1
output
12
题意:有n本书,编号为1~n,每一本书的重量为w[i],这堆书竖直堆在一起
现在有m天,第i天会从中拿出编号为day[i]的书看,代价是day[i]上面的书的总重量,书一天看完,看完后放在最上面。
问:最开始的时候你按照什么顺序放书,会让你这m天要搬的书的总重量最小。
贪心可知,拿每一本书第一次出现的序列作为初始序列,没有出现的序列放在最下面,不用管了。
用一个vector存放这个序列,看完后放在最上面删除,插入到最上面。
1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<iostream> 5 6 using namespace std; 7 8 #define ll long long 9 #define pb push_back 10 11 bool vis[505]; 12 int w[505]; 13 int day[1005]; 14 vector<int>v; 15 16 int main() 17 { 18 int n,m; 19 scanf("%d %d",&n,&m); 20 for(int i=1;i<=n;i++){ 21 scanf("%d",&w[i]); 22 } 23 memset(vis,false,sizeof vis); 24 for(int i=1;i<=m;i++){ 25 scanf("%d",&day[i]); 26 if(!vis[day[i]]){ 27 v.pb(day[i]); 28 vis[day[i]]=true; 29 } 30 } 31 int ans=0; 32 for(int i=2;i<=m;i++){ 33 int j=0; 34 for(;v[j]!=day[i];j++){ 35 ans+=(ll)(w[v[j]]); 36 } 37 v.erase(v.begin()+j); 38 v.insert(v.begin(),day[i]); 39 } 40 41 printf("%d\n",ans); 42 43 return 0; 44 }