BZOJ2529: [Poi2011]Sticks

2529: [Poi2011]Sticks

Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge
Submit: 257  Solved: 133
[Submit][Status][Discuss]

Description

Little Johnny was given a birthday present by his grandparents. This present is a box of sticks of various lengths and colours. Johnny wonders if there are three sticks in the set he has been given that would form a triangle with different-coloured sides. Let us note that Johnny is interested in non-degenerate triangles only, i.e., those with positive area.

给出若干木棍,每根木棍有特定的颜色和长度。问能否找到三条颜色不同的木棍构成一个三角形。
(注意这里所说的三角形面积要严格大于0)

第一行给出一个整数k(3<=k<=50),表示颜色的种数。这k种颜色被标号为1至k。
接下来k行,第i+1描述颜色为i的木棍的信息。
首先一个整数Ni(1<=Ni<=10^6)表示颜色为i的木棍的数量。
接下来Ni个整数,表示这Ni根木棍各自的长度。
所有木棍的长度<=10^9。总木棍数量<=10^6。

你的程序应该仅输出一行
如果有解,输出6个整数,分别表示第一条边的颜色,第一条边的长度,第二条边的颜色,第二条边的长度,第三条边的颜色,第三条边的长度,这六个整数以空格分割。
如果有多组解,随便输出一组即可。
如果无解,输出 NIE

Input

In the first line of the standard input an integer k(3<=k<=50)is given, which is the number of different colours of sticks. The colours themselves are numbered from 1 to k.
The following klines contain descriptions of the sticks of particular colours. The line no. i+1holds integers that describe the sticks of colour , separated by single spaces. The first of these numbers, Ni(1<=Ni<=10^6) denotes the number of sticks of colour . It is followed, in the same line, by Niintegers denoting the lengths of the sticks of colour . All lengths are positive and do not exceed10^9. Furthermore, the total number of all sticks does not exceed 10^6.0020
In tests worth at least 30% of the points the following holds in addition: the total number of the sticks does not exceed 250.

Output

Your program should print (on the first and only line of the standard output) either:
·        six integers, separated by single spaces, that describe the construction of a triangle with different-coloured sides as follows: the colour and the length of the first stick, the colour and the length of the second stick, and the colour and the length of the third stick,
·        or the word NIE (Polish for no) if no such triple of sticks exists.
If there are multiple triples of different-coloured sticks that give rise to a triangle, your program may pick one such triple arbitrarily.

Sample Input

4
1 42
2 6 9
3 8 4 8
1 12

Sample Output

3 8 4 12 2 9

HINT

Source

 
【题解】
先按照长度排序
从前到后扫描。维护最长的三个颜色不同的木棍即可
证明也比较显然
对于a,b,c
我们证一下如果a,b,c不合题意,那么以c为最大边的其他可能也不会满足题意
分各种情况讨论
发现是对的(唔)
很麻烦,不写了
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm> 
 6 #define max(a, b) ((a) > (b) ? (a) : (b)) 
 7 #define min(a, b) ((a) < (b) ? (a) : (b))
 8 
 9 inline void read(int &x)
10 {
11     x = 0;char ch = getchar(), c = ch;
12     while(ch < '0' || ch > '9')c = ch, ch = getchar();
13     while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
14     if(c == '-')x = -x;
15 }
16 
17 const int MAXN = 1000000 + 10;
18 
19 int k, n;
20 
21 struct Node
22 {
23     int num,color;
24 }node[MAXN];
25 
26 bool cmp(Node a, Node b)
27 {
28     return a.num < b.num;
29 } 
30 
31 int main()
32 {
33     read(k);
34     if(k < 3)
35     {
36         printf("NIE");
37         return 0;
38     }
39     for(register int i = 1;i <= k;++ i)
40     {
41         int tmp;read(tmp);
42         for(register int j = 1;j <= tmp;++ j)
43         {
44             node[++n].color = i;
45             read(node[n].num);
46         }
47     }
48     std::sort(node + 1, node + 1 + n, cmp);
49     int p1 = n - 1;
50     while(node[p1].color == node[n].color)-- p1;
51     int p2 = p1 - 1;
52     while(node[p2].color == node[p1].color || node[p2].color == node[n].color)-- p2;
53     if(node[p1].num + node[p2].num > node[n].num)
54     {
55         printf("%d %d %d %d %d %d", node[n].color,node[n].num,node[p1].color,node[p1].num,node[p2].color,node[p2].num);
56         return 0;
57     }
58     for(register int i = n - 1;i >= 1;-- i)
59     {
60         while(node[p1].color == node[i].color)-- p1;
61         p2 = min(p1 - 1, p2);
62         while(node[p2].color == node[p1].color || node[p2].color == node[i].color)-- p2;
63         if(p2 < 0 || p1 < 0)break;
64         if(node[p1].num + node[p2].num > node[i].num)
65         {
66             printf("%d %d %d %d %d %d", node[i].color,node[i].num,node[p1].color,node[p1].num,node[p2].color,node[p2].num);
67             return 0;
68         }
69     }
70     printf("NIE");
71     return 0;
72 } 
BZOJ2529
原文地址:https://www.cnblogs.com/huibixiaoxing/p/7642540.html