One of DB and TN common interests is traveling. One day, they went to Grand Line and found One Piece !

The One Piece treasure has n gold coins (n is even). Both them like gold coins, but they evaluate them as different values. So they decided to divide those coins by following method :

DB and TN do n / 2 steps, at each step, DB choose 2 coins, TN takes the coin that she evaluates it greater, and DB take the rest coin.

Let’s help DB find how to take the maximum value at possible.

Input

First line : a single integer n (n is even) – the number of coins

Second line : n integers a1, a2, …, an. ai is the value of ith coin that TN evaluates.

Third line : n integers b1, b2, …, bn. bi is the value of ith coin that DB evaluates.

Output

First line : an integer S – the maximum value DB can take.

Last n / 2 lines : ith line contains two number x and y (1 ≤ x, y ≤ n), are the indexes of two 
coins that DB choose on ith step. Each coin must be chose exact one time.

If there are multiple ways, just print any of them.

Constraints

2 ≤ n ≤ 500 000

1 ≤ ai ≤ 109

1 ≤ bi ≤ 109

Note that a1, a2, …, an are n distinct integers.

Example

Input:
6
6 10 11 18 5 14
1 7 6 12 15 1 Output: 
28
5 1
2 6
3 4

Warning: large Input/Output data, be careful with certain languages

题意:有N个物品(N是偶数),对于每个物体,A同学和B同学都有自己的估值。每次A同学取出两个物体,B取走自己认为价值高的一个,然后A拿走剩下的一个,问A应该如果选择。使得A最后获得的价值最高。

思路:我们按B认为的价值排序,假设排成一排,左边大于右边,那么问题就成了:

 The problem:有N个人,从左到右排除一排,每个人有自己的权值,现在需要两两匹配成N/2队,每队的贡献是这一队的右边这个人的权值(即在原题中左边的被B取走了),问如何匹配贡献最大。

错误思路:用优先队列,一开始把除了最右边的那个都放进队列里,从最右边开始匹配,找他左边的还没有被匹配的最小值匹配; 比如12 1 6 7 2 15。得到错误答案24。

正确打开方式:我们先假设把偶数的取走,然后如果右边的未取走的比它大,则可以替换。那么可以用单调队列搞。

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
struct in{
int a,b,id;
in(){ a=b=id=;}
in(int bb,int ii):b(bb),id(ii){}
bool friend operator <(in x,in y){
return x.b>y.b;
}
}s[maxn];
bool cmp(in w,in v){ return w.a>v.a; }
int vis[maxn];
set<in>Set;
int L[maxn],R[maxn];
int main()
{
int N,i,j; long long ans=;
scanf("%d",&N);
for(i=;i<=N;i++) scanf("%d",&s[i].a);
for(i=;i<=N;i++) scanf("%d",&s[i].b);
for(i=;i<=N;i++) s[i].id=i;
sort(s+,s+N+,cmp);
for(i=N;i>=;i--){
if(i%==){
if(Set.empty()) ans+=s[i].b,vis[s[i].id]=;
else {
set<in>::iterator it=Set.begin();
if((*it).b>s[i].b){
ans+=(*it).b; vis[(*it).id]=;
Set.insert(in(s[i].b,s[i].id));
Set.erase(it);
}
else {
vis[s[i].id]=; ans+=s[i].b;
}
}
}
else Set.insert(in(s[i].b,s[i].id));
}
int sum1=,sum2=;
for(i=N;i>=;i--){
if(vis[s[i].id]) L[++sum1]=s[i].id;
else R[++sum2]=s[i].id;
}
printf("%lld\n",ans);
for(i=;i<=N/;i++) printf("%d %d\n",L[i],R[i]);
return ;
}

SPOJ:One piece(不错的带权括号最大匹配问题)的更多相关文章

  1. HDU 2255 奔小康赚大钱(带权二分图最大匹配)

    HDU 2255 奔小康赚大钱(带权二分图最大匹配) Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊 ...

  2. Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配)

    Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配) Description 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的 ...

  3. UVA1349(带权二分图最大匹配 --> KM算法模板)

    UVA1349 题意:给定一些有向带权边,求出把这些边构造成一个个环,总权值最小 解法: 对于带权的二分图的匹配问题可以用通过KM算法求解. 要求最大权匹配就是初始化g[i][j]为0,直接跑就可以: ...

  4. 带权二分图最大匹配KM算法

    二分图的判定 如果一个图是连通的,可以用如下的染色法判定是否二分图: 我们把X部的结点颜色设为0,Y部的颜色设为1. 从某个未染色的结点u开始,做BFS或者DFS .把u染为0,枚举u的儿子v.如果v ...

  5. "《算法导论》之‘图’":不带权二分图最大匹配(匈牙利算法)

    博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利 ...

  6. POJ 2195 Going Home | 带权二分图匹配

    给个地图有人和房子 保证人==房子,每个人移动到房子处需要花费曼哈顿距离的代价 问让人都住在房子里最小代价 显然是个带权二分图最大匹配 转化成以一个网络,规定w是容量,c是代价 1.S向人连边,w=1 ...

  7. hdu4829 带权并查集(题目不错)

    题意: Information Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  8. poj1417 带权并查集 + 背包 + 记录路径

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2713   Accepted: 868 Descrip ...

  9. POJ1417:True Liars(DP+带权并查集)

    True Liars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. Elasticsearch使用syslog发送Watcher告警事件

    https://blog.csdn.net/mvpboss1004/article/details/70158864?locationNum=9&fps=1

  2. 取得mib oidname oid 对应关系表

    snmptranslate -Tz -m ALL > d:\2.txt 取得所有名称与OID的对应表,很有用

  3. jpaRepository findById()数据库有数据却为null

    oracle中的char类型用空格自动将字段补成指定的长度, 而varchar2类型不会.大部分情况下设计表字段类型都是varchar2,今天被char坑了一次, findById()始终为空..

  4. 转:HtmlCxx用户手册

    1.1 简介 使用由KasperPeeters编写的强大的tree.h库文件,可以实现类似STL的DOM树遍历和导航. 打包好的Css解析器. 看似很像C++代码的C++代码(其实已不再是C++了) ...

  5. Android Studio一些常用的快捷键

    光标移动和窗口切换:1.esc:光标从功能窗口回到编辑窗口 2.alt+num:打开指定的功能窗口,重复操作关闭该窗口. 3.alt+←→:切换编辑的文件. 4.ctrl+home/end:跳转到文件 ...

  6. cocos2d-x 3.0 final 移植 android

    准备工作 你仅仅要依照上一篇的 cocos2d-x 3.0 final 环境搭建 完毕就能够了 1.编辑proj.android\jni\Android.mk,更改内容例如以下 LOCAL_PATH ...

  7. 出现异常时直接把e输出比输出e.getMessage()好得多

    之前研究态度不好,出异常时处理草草了事,今天出现问题才觉得该认真对待每个分支.

  8. 机房收费系统(VB.NET)个人版总结

    重构版个人机房收费系统大概从暑假开学開始进行.花了不到一个半月的时间才完毕.以下对我在重构过程中的一写理解. 1.系统设计一个非常重要的目的就是重用.而要做到重用,低耦合是最有效的手段回想一下我们C/ ...

  9. python实现的websocket总结 —— wspy

    之前曾有php版的websocket封装包.见Websocket--php实战,近期使用python做一些功能,须要用到对websocket的操作,因此,參照之前的实现,实现了这个python版本号. ...

  10. INAPP

    1. Login API : 接口為您提供了我們的登入服務,可以讓使用者透過facebook帳號登入我們的服務,在您呼叫此API後,可以得到 使用者的UUID(Unique UID為使用者在平台的唯一 ...