首页 > 技术文章 > C - Oranges and Apples CodeForces - 23C

caijiaming 2020-04-04 16:12 原文

题目链接:http://codeforces.com/problemset/problem/23/C

In 2N - 1 boxes there are apples and oranges. Your task is to choose N boxes so, that they will contain not less than half of all the apples and not less than half of all the oranges.

Input

The first input line contains one number T — amount of tests. The description of each test starts with a natural number N — amount of boxes. Each of the following 2N - 1 lines contains numbers ai and oi — amount of apples and oranges in the i-th box (0 ≤ ai, oi ≤ 109). The sum of N in all the tests in the input doesn't exceed 105. All the input numbers are integer.

Output

For each test output two lines. In the first line output YES, if it's possible to choose N boxes, or NO otherwise. If the answer is positive output in the second line N numbers — indexes of the chosen boxes. Boxes are numbered from 1 in the input order. Otherwise leave the second line empty. Separate the numbers with one space.

Examples

Input
2
2
10 15
5 7
20 18
1
0 0
Output
YES
1 3
YES
1
题意:
输入一个n (n <= 1e5), 表示接下来有 2*n-1 个盒子, 每个盒子有 a 个橘子和 b 个苹果, 现在要求你从 2*n-1 个盒子中选出 n 个盒子
使这 n 个盒子里的橘子的总数不小于橘子总数的一半, 苹果的总数不小于苹果总数的一半
思路:按照苹果数从小到大排序 ,每两个选择一个盒子,比如有七个盒子,排序好之后
12中选一个 34中选一个 56选一个,再加上最后一个,这样苹果数一定大于等于一半,那么我们怎么保证橙子也超过一半呢,可以这样,每两个中选中橙子多的那个盒子
这样就满足橙子数大于等于一半了
看代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<cmath>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
#define sc1(a) scanf("%lld",&a)
#define pf1(a) printf("%lld\n",a)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const LL INF=1e18;
const ull base=2333;
const int maxn=1e5+55;
const int maxm=1e4+50;
const int maxv=1e6+5;
const int maxk=1e8+5;
const int mod=1e9+7;
struct Node
{
    LL a,b,id;
    Node(){}
    Node(LL a1,LL b1,LL id1)
    {
        a=a1;b=b1;id=id1;
    }
    bool operator < (const Node x) const
    {
        return a<x.a;
    }
}box[maxn*2];
int main()
{
    LL T;cin>>T;
    LL N;
    while(T--)
    {
        cin>>N;
        for(LL i=1;i<=2*N-1;i++)
        {
            sc1(box[i].a);sc1(box[i].b);
            box[i].id=i;
        }
        sort(box+1,box+1+2*N-1);
        printf("YES\n");
        for(LL i=1;i+1<=2*N-1;i+=2)
        {
            if(box[i].b<box[i+1].b)
            {
                printf("%lld ",box[i+1].id);
            }
            else printf("%lld ",box[i].id);
        }
        printf("%lld\n",box[2*N-1].id);
    }
    return 0;
}
/**

*/

 

推荐阅读