链接https://ac.nowcoder.com/acm/contest/3003/F

牛牛和 牛可乐 面前有 n 个物品,这些物品编号为 1,2,\dots,n1,2,…,n ,每个物品有两个属性 a_i, b_iai​,bi​ 。

 

牛牛与 牛可乐会轮流从剩下物品中任意拿走一个, 牛牛先选取。

 

设 牛牛选取的物品编号集合为 H,牛可乐选取的物品编号的集合为 T,取完之后,牛牛 得分为 \sum_{i\in H} a_i∑i∈H​ai​;而 牛可乐得分为 \sum_{i\in T} b_i∑i∈T​bi​。

 

牛牛和 牛可乐都希望自己的得分尽量比对方大(即最大化自己与对方得分的差)。

 

你需要求出两人都使用最优策略的情况下,最终分别会选择哪些物品,若有多种答案或输出顺序,输出任意一种。

输入描述:

第一行,一个正整数 n,表示物品个数。
第二行,n 个整数 a_1,a_2,\dots,a_na1​,a2​,…,an​,表示 n 个物品的 A 属性。
第三行,n 个整数 b_1,b_2,\dots,b_nb1​,b2​,…,bn​,表示 n 个物品的 B 属性。
保证 2\leq n\leq 2\times 10^52≤n≤2×105,0\leq a_i,b_i\leq 10^90≤ai​,bi​≤109。

输出描述:

输出两行,分别表示在最优策略下 牛牛和 牛可乐各选择了哪些物品,输出物品编号。

示例1

输入

复制

3
8 7 6
5 4 2

输出

复制

1 3
2

说明


 

3 1

2

也会被判定为正确

代码:

#include<bits/stdc++.h>
using namespace std;
long long n,t,g,k,l,o,s,r,ans,ss,max1=0;
struct node {
    int s;
    int f;
    int id;
}a[200005],b[200005];
bool cmp(node p,node q)
{
    if(p.s+p.f!=q.s+q.f)
    return p.s+p.f>q.s+q.f;
    else if(p.s!=q.s)
    return p.s>q.s;
    else
    return p.f>q.f;
}
map<long long,long long>m;
queue<long long>aa,bb;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].s;
        a[i].id=i;
    }
    for(int i=1;i<=n;i++)
    {
        cin>>b[i].s;
        a[i].f=b[i].s;
        b[i].id=i;
        b[i].f=a[i].s;
    }
    sort(a+1,a+1+n,cmp);
    sort(b+1,b+1+n,cmp);
    int ia=1,ib=1;
    for(int i=1;i<=n;i++)
    {
        if(i%2==1)
        {
            while(m[a[ia].id]!=0)
            {
                ia++;
            }
            aa.push(a[ia].id);
            m[a[ia].id]=1;
            ia++;
        }
        else
        {
            while(m[b[ib].id]!=0)
            {
                ib++;
            }
            bb.push(b[ib].id);
            m[b[ib].id]=1;
            ib++;
        }
    }
    while(!aa.empty())
    {
        cout<<aa.front()<<" ";
        aa.pop();
    }
    cout<<endl;
    while(!bb.empty())
    {
        cout<<bb.front()<<" ";
        bb.pop();
    }
}