码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ3251 树上三角形

时间:2014-10-30 15:11:36      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   os   ar   for   sp   

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

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

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

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

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

看来还是蛮快的。。。

 

bubuko.com,布布扣
 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

 

BZOJ3251 树上三角形

标签:style   blog   http   io   color   os   ar   for   sp   

原文地址:http://www.cnblogs.com/rausen/p/4062552.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!