ZCMU—1494

来源:互联网 发布:英菲克网络机顶盒 编辑:程序博客网 时间:2024/06/06 13:07

1494: Problem F

Time Limit: 3 Sec  Memory Limit: 128 MB
[Submit][Status][Web Board]

Description

Zjvcc 的一年一度运动会开始了,Chieh 当然是做裁判了(像我这么厉害的人是吧~~~),

跑步比赛进入最后总决赛的阶段了,但是必须选择一部分人进总选赛,半决赛一共分为2场,每一场有n个人,所以一共有2n个人,现在要选择n个人进入决赛,这里有个特殊的规则纯在:

如果每场选择前k个人,(0<=2*k<=n,这是必然的是吧 :) everybody)则名额被拿走了2*k个,当然0<=2*k<=n,还剩下n-2*k,现在从最后的人中成绩最好的人进入决赛。

现在一共来了2*n个人,k还不知道,Chieh想知道谁可能有机会进决赛,谁必须提前。

Input

T 输入组数

n 每场的人数  1<=n<=10^5

n行包含 a b 表示人的跑步成绩(毫秒) 1<=a,b<=10^9,时间在半决赛递增,全部时间不同

Output

2行,表示每一场,1表示当前场当前的人可能进入总决赛,0则不能。

Sample Input

2
2
1 2
3 4
3
1 2
3 4
5 6

Sample Output

10
10
110
100

【分析】

题意就是问谁有可能进决赛,谁一定不可能进决赛,弄懂题目就好做了...而且给你时间的时候连排序都排好了...
能进决赛的情况有两种,一种是k=n,那么两组中前一半人都可以进入决赛,另外一个情况是时间排在前n位的人能进决赛...所以条件就是i<n/2 || a[i](b[i])<res    res为2n个人中排第n+1位的时间,因为题目说明了不会有重复。。所以连判重都省了..不过感觉判重也影响不了什么~
【代码】
#include <stdio.h>#include <algorithm>using namespace std;int f[210000];int a[101000];int b[101000];int main(){int pp;scanf("%d",&pp);while (pp--){int n;scanf("%d",&n);for (int i=0;i<n;i++) scanf("%d%d",&a[i],&b[i]),f[2*i]=a[i],f[2*i+1]=b[i];sort(f,f+2*n);int res=f[n];for (int i=0;i<n;i++)if (i<n/2|| a[i]<res)printf("1");else printf("0");printf("\n");for (int i=0;i<n;i++)if (i<n/2|| b[i]<res)printf("1");else printf("0");printf("\n");}return 0;} 


0 0
原创粉丝点击