• 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
  • 相关阅读:
    OpenFire源码学习之十九:在openfire中使用redis插件(上)
    OpenFire源码学习之十八:IOS离线推送
    OpenFire源码学习之十七:HTTP Service插件
    OpenFire源码学习之十六:wildfire
    OpenFire源码学习之十五:插件开发
    OpenFire源码学习之十四:插件管理
    OpenFire源码学习之十三:消息处理
    数据挖掘入门
    iOS小技巧
    图片加载完成之前对图片高度侦测
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/7642540.html
Copyright © 2020-2023  润新知