zoukankan      html  css  js  c++  java
  • BZOJ3251 树上三角形

    一看这题。。。难道要链剖乱搞什么的吗。。。不会啊汗。。。

    突然发现不构成三角形的条件其实非常苛刻,由斐波那契数列:

    1,1,2,3,5,8,13,21,34......

    可以知道其实小于int的大概就50项的样子。

    于是路径长度>50直接输出'Y',否则排序判断。。。

    看来还是蛮快的。。。

     1 /**************************************************************
     2     Problem: 3251
     3     User: rausen
     4     Language: C++
     5     Result: Accepted
     6     Time:268 ms
     7     Memory:5808 kb
     8 ****************************************************************/
     9  
    10 #include <cstdio>
    11 #include <algorithm>
    12  
    13 using namespace std;
    14 typedef long long ll;
    15 const int N = 100005;
    16 const int M = 200005;
    17 struct edges{
    18     int next, to;
    19 }e[M];
    20 struct tree_node{
    21     int v, dep, fa;
    22 }tr[N];
    23 int first[N], q[N];
    24 int n, m, tot;
    25  
    26 inline int read(){
    27     int x = 0, sgn = 1;
    28     char ch = getchar();
    29     while (ch < '0' || ch > '9'){
    30         if (ch == '-') sgn = -1;
    31         ch = getchar();
    32     }
    33     while (ch >= '0' && ch <= '9'){
    34         x = x * 10 + ch - '0';
    35         ch = getchar();
    36     }
    37     return sgn * x;
    38 }
    39  
    40 inline void add_edge(int x, int y){
    41     e[++tot].next = first[x];
    42     first[x] = tot;
    43     e[tot].to = y;
    44 }
    45  
    46 void add_Edges(int X, int Y){
    47     add_edge(X, Y);
    48     add_edge(Y, X);
    49 }
    50  
    51 void dfs(int p){
    52     int x, y;
    53     for (x = first[p]; x; x = e[x].next)
    54         if ((y = e[x].to) != tr[p].fa){
    55             tr[y].fa = p, tr[y].dep = tr[p].dep + 1;
    56             dfs(y);
    57         }
    58 }
    59  
    60 void query(int a, int b){
    61     int cnt = 0, i;
    62     while (cnt < 50 && a != b){
    63         if (tr[a].dep > tr[b].dep)
    64             q[++cnt] = tr[a].v, a = tr[a].fa;
    65         else q[++cnt] = tr[b].v, b = tr[b].fa;
    66     }
    67     q[++cnt] = tr[a].v;
    68     if (cnt >= 50){
    69         puts("Y");
    70         return;
    71     }
    72     sort(q + 1, q + cnt + 1);
    73     for(i = 1; i <= cnt - 2; ++i)
    74         if ((ll) q[i] + q[i + 1] > q[i + 2]){
    75             puts("Y");
    76             return;
    77         }
    78     puts("N");
    79 }
    80  
    81 int main(){
    82     n = read(), m = read();
    83     int i, T, X, Y;
    84     for (i = 1; i <= n; ++i)
    85         tr[i].v = read();
    86     for (i = 1; i < n; ++i){
    87         X = read(), Y = read();
    88         add_Edges(X, Y);
    89     }
    90     dfs(1);
    91     for (i = 1; i <= m; ++i){
    92         T = read(), X = read(), Y = read();
    93         if (T) tr[X].v = Y; else query(X, Y);
    94     }
    95     return 0;
    96 }
    View Code
    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    Swift学习——格式控制符和元组流程控制(二)
    boost::string 例题1
    钱币兑换问题
    我心目中的北京大学:从薛定格到王恩哥
    2.1-Java语言基础(keyword)
    【C语言天天练(十)】结构体
    JVM GC调优一则--增大Eden Space提高性能
    C++的一种业务分发方案(另类的工厂模式)
    Eclipse使用方法和技巧二十六:浅谈快捷键
    linux-shell脚本命令之grep
  • 原文地址:https://www.cnblogs.com/rausen/p/4062552.html
Copyright © 2011-2022 走看看