J - 鎕鎕鎕 HihoCoder - 1838

鎕鎕有 2n + 1 张卡片,每张卡片上都有两个数字,第 i 张卡片上的两个数字分别是 Ai 与 Bi。

现在鎕鎕要从所有卡片中选出恰好 n + 1 张卡片,然后计算他选出的所有卡片中 Ai 的和与 Bi 的和。他的目的是要使他选出的卡片的Ai 的和与 Bi 的和,都要分别大于剩下 n 张没选的卡片的 Ai 的和与 Bi 的和。

鎕鎕最近沉迷于玩 Switch,所以他希望你能帮他解决这个问题。

Input

输入第一行是一个整数 n,意义如以上所示。

接下来有 2n + 1 行,每行为两个正整数,第 i 行的两个正整数分别代表 Ai 和 Bi。

数据保证 1 ≤ n ≤ 100000,1 ≤ Ai, Bi ≤ 109。

Output

如果无法选出 n + 1 张卡片满足鎕鎕的要求,输出一个数 -1。否则输出 n + 1 行,每行有一个正整数,表示选出的卡片编号(从 1 开始)。如果有多解,输出任意一组解均可。

Sample Input

2
4 2
9 4
5 3
7 5
8 1

Sample Output

3
4
2

 

先将ai排序,从小到大,在每2个之间选择 bi大的,所以b一定满足,每2个为一组,第一组的a一定比第二组的a小,倒数第二组的a一定比最后一个a小,所以未选的和一定比总共的a小,故好像可能一定绝对必须差不多满足;

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 3*100005;
int inde[N];
struct p
{
    int a,b;
    int pos;
}t[N];
bool cmp(p x,p y)
{
    return x.a<y.a;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=2*n+1;i++)
    {
        cin>>t[i].a>>t[i].b;
        t[i].pos=i;
    }
    sort(t+1,t+1+2*n+1,cmp);
    int in=1;
    for(int i=1;i<=2*n;i+=2)
    {
        if(t[i].b<t[i+1].b)
            inde[in++]=t[i+1].pos;
        else
            inde[in++]=t[i].pos;
    }
    inde[in++]=t[2*n+1].pos;
    for(int i=1;i<in;i++)
        cout<<inde[i]<<endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值