P1119: [POI2009]SLO

这题预处理稍微动动脑,其实还是个裸的置换群=-=,没什么压力。

 1 const maxn=1000001;
 2 var n,i,j,minx,tem,now,tmin,len:longint;
 3 cursum,sum:int64;
 4 pos,num,tnum,ys:array[0..maxn] of longint;
 5 p:array[0..maxn] of boolean;
 6 function min(a,b:longint):longint;
 7 begin
 8   if a>b then exit(b)    
 9     else exit(a);
10 end;
11 begin
12   readln(n);
13   minx:=maxn;
14   for i:=1 to n do
15     begin
16       read(tnum[i]);
17       minx:=min(minx,tnum[i]);
18     end;
19   readln;
20   for i:=1 to n do
21     begin
22       read(tem);
23       num[i]:=tnum[tem];
24       ys[tem]:=i;
25     end;
26   readln;
27   for i:=1 to n do
28     begin
29       read(tem);
30       pos[ys[tem]]:=i;
31     end;
32   fillchar(p,sizeof(p),true);
33   for i:=1 to n do
34     if p[i] then
35       begin
36         cursum:=0;
37         now:=i;
38         len:=0;
39         tmin:=num[i];
40         while p[now] do
41           begin
42             inc(len);
43             tmin:=min(tmin,num[now]);
44             inc(cursum,num[now]);
45             p[now]:=false;
46             now:=pos[now];
47           end;
48         if len>1 then inc(sum,cursum);
49         if len>2 then inc(sum,min(tmin*(len-2),minx*(len+1)+tmin));
50       end;
51   writeln(sum);
52 end.

 (转载请注明出处:http://www.cnblogs.com/Kalenda/)

转载于:https://www.cnblogs.com/Kalenda/p/4814170.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值