首先可以发现我们可以发现最终状态和初始状态都是一个大小为 \(n\) 的排列,且恰好有 \(n\) 种关系,于是我们对于每个 \(a_i\) 连一条 \(a_i \rightarrow b_i\) 的有向边,这张图的形态将会相对简单。

因为每个位置最终变成的数不同,因此这张图将会是由若干个简单环构成。如果环的大小为 \(1\) 则不需要交换,如果环的大小为 \(2\) 则直接交换即可,下面我们考虑环的大小至少为 \(3\) 的情况。

不难发现我们要做的相当于把环上的每个点向前挪一个,我们先考虑只交换环内点,那么最小的方案就会是从某个点开始一直往下不断交换,令 \(S\) 为环上点权值之和,\(len\) 为环的大小,那么这样的代价就会是 \(S + (len - 2) \times w_i\) 那么我们只需要选择一个最小的 \(w_i\) 上去交换一圈即可。如果考虑可以和环外的点交换,必然是选择环内环外权值最小的两个点交换,再由环外最小的点在环内交换一圈,实际上每次环外权值最小的点交换完后我们可以直接和原来的交换回来,因为如果我们不交换回来,那么最终这小和它交换的点可以构成一个新的环,那么还需要再交换回来一次,这样的代价是一样的,为了方便起见我们直接交换回来即可。

#include<bits/stdc++.h>
using namespace std;
#define N 1000000 + 5
#define inf 1000000000
#define int long long
#define rep(i, l, r) for(int i = l; i <= r; ++i)
bool book[N];
int n, sum, len, ans, M, Min, w[N], a[N], b[N], nxt[N];
int read(){
char c; int x = 0, f = 1;
c = getchar();
while(c > '9' || c < '0'){ if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
void dfs(int u){
if(book[u]) return; book[u] = true;
Min = min(Min, w[u]), sum += w[u], ++len;
dfs(nxt[u]);
}
signed main(){
n = read(), M = inf;
rep(i, 1, n) w[i] = read(), M = min(M, w[i]);
rep(i, 1, n) a[i] = read();
rep(i, 1, n) b[i] = read();
rep(i, 1, n) nxt[a[i]] = b[i];
rep(i, 1, n) if(!book[i]){
Min = inf, sum = 0, len = 0;
dfs(i);
if(len == 1) continue;
if(sum + (len - 2) * Min < Min + sum + (len + 1) * M) ans += sum + (len - 2) * Min;
else ans += Min + sum + (len + 1) * M;
}
printf("%lld", ans);
return 0;
}

[POI2009]SLO-Elephants的更多相关文章

  1. BZOJ1119: [POI2009]SLO

    1119: [POI2009]SLO Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 379  Solved: 181[Submit][Status] ...

  2. BZOJ1119[POI2009]SLO && BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序

    Problem J: [POI2009]SLO Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 622  Solved: 302[Submit][Sta ...

  3. 【BZOJ 1119】 1119: [POI2009]SLO (置换)

    1119: [POI2009]SLO Description 对于一个1-N的排列(ai),每次你可以交换两个数ax与ay(x<>y),代价为W(ax)+W(ay) 若干次交换的代价为每次 ...

  4. 【BZOJ】1119: [POI2009]SLO

    题意 长度为\(n(1 \le n \le 1000000)\)的账单,\(+\)表示存1,\(-\)表示取1,任意时刻存款不会为负.初始有\(p\),最终有\(q\).每一次可以耗时\(x\)将某位 ...

  5. P1119: [POI2009]SLO

    这题预处理稍微动动脑,其实还是个裸的置换群=-=,没什么压力. ; var n,i,j,minx,tem,now,tmin,len:longint; cursum,sum:int64; pos,num ...

  6. bzoj1697:[Usaco2007 Feb]Cow Sorting牛排序 & bzoj1119:[POI2009]SLO

    思路:以bzoj1119为例,题目已经给出了置换,而每一次交换的代价是交换二者的权值之和,而置换一定是会产生一些环的,这样就可以只用环内某一个元素去置换而使得其余所有元素均在正确的位置上,显然要选择环 ...

  7. BZOJ 1119: [POI2009]SLO [置换群]

    传送门:现在$POI$上的题洛谷都有了,还要$BZOJ$干什么 和$cow\ sorting$一样,只不过问$a_i \rightarrow b_i$ 注意置换是位置而不是数值...也就是说要$i$的 ...

  8. bzoj 1119 [POI2009]SLO && bzoj 1697 [Usaco2007 Feb]Cow Sorting牛排序——思路(置换)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1119 https://www.lydsy.com/JudgeOnline/problem.p ...

  9. bzoj 1119 [POI2009] SLO & bzoj 1697 牛排序 —— 置换+贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1119 https://www.lydsy.com/JudgeOnline/problem.p ...

  10. [POI2009]SLO

    Description 对于一个1-N的排列(ai),每次你可以交换两个数ax与ay(x<>y),代价为W(ax)+W(ay) 若干次交换的代价为每次交换的代价之和.请问将(ai)变为(b ...

随机推荐

  1. 定义制造业操作(定义 MES/MOM 系统)

    定义制造业操作(定义 MES/MOM 系统) 制造业操作包含众多工厂级活动,涉及设备(定义.使用.时间表和维护).材料(识别.属性.位置和状态).人员(资格.可用性和时间表),以及这些资源与包含其信息 ...

  2. Capstone CS5213|HDMI转VGA|CS5213设计参考电路

    Capstone CS5213是一款HDMI到VGA转换器结合了HDMI输入接口和模拟RGB DAC输出且带支持片上音频数模转换器.CS5213芯片设计简单,整体芯片尺寸精悍,外围电路集成优化度较高, ...

  3. 剖析Defi之Uinswap_2

    学习核心合约UniswapV2Pair,在父合约UniswapV2ERC20的基础上增加资产交易及流动性提供等功能. 交易对合约本身是erc20合约,代币表示流动性,代币在提供流动性的地址里,当提供流 ...

  4. Vue.js高效前端开发 • 【Vue组件】

    全部章节 >>>> 文章目录 一.Vue组件介绍 1.组件概述 2.组件使用步骤 3.实践练习 一.Vue组件使用 1.组件注册 2.组件注册语法糖 3.使用script或te ...

  5. Centos8 设置中文

    1.一般情况 1.1 进入设置选择 Region&Language 1.2 点击 加号 1.3 点击 汉语(中国) 1.4 选择 汉语(智能拼音) 2.特殊情况 有些虚拟机可能没有 汉语(智能 ...

  6. Notepad++在线安装使用JSON插件

    1.介绍 JSON Viewer是Notepad++的JSON插件, Notepad++的Plugins Admin可以安装管理插件, 它不仅可以格式化JSON字符串, 还可以打开JSON查看器查看结 ...

  7. Debug解决问题方法论

    发现问题怎么办,如何处理, 所谓的Debug的一般流程是什么, 下面是我对此的一些思考总结, 后面还会继续完善补充. 1.处理思路总纲 发现问题 查看日志 没有日志,去找日志 找不到日志,继续找,有些 ...

  8. POJ 2442 Sequence堆 优先队列

    题目描述 给定m个序列,每个序列包含n个非负整数.现在我们可以从每个序列中选择一个数字以形成一个具有m个整数的序列.显然,我们可以得到n ^ m种这种序列.然后,我们可以计算每个序列中的数字总和,并获 ...

  9. HttpRunner_参数化进阶

    一.获取返回包数据   在提取参数时,当 HTTP 的请求响应结果为 JSON 格式,则可以采用.运算符的方式,逐级往下获取到参数值:响应结果的整体内容引用方式为 content 或者 body,如上 ...

  10. mybatis学习笔记(四)

    resultType 语句返回值类型的完整类名或别名 resultType 返回的是一个map集合,key是列名,value是对应的值 使用resultMap实现联表查询 resultMap 查询的结 ...