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

hihoCoder 挑战赛10 #1145 : 幻想乡的日常

时间:2015-04-18 20:27:43      阅读:342      评论:0      收藏:0      [点我收藏+]

标签:

 

思路: TLE了,其他思路还没想出来。假设居所是一棵树,对于给定的一个区间[l, r] ,其中有r-l+1个节点,那么最大可能出现的队伍数就是r-l+1。而数有n-1条边,如果一条边(x,y)满足l<=x<=r 且 l<=y<=r ,那么这条边就在区间[l, r]内,而这两个节点就必须是同一个队伍的,那么最大可能出现的队伍数就是r-l+1-1了。也就是说,对于n-1条边,如果有n条边存在于区间[l, r]内,那么这一天的队伍数量就是r-l+1-n。  复杂度:对于每个区间,只需要检测最多n-1条边在不在区间内,有q个区间,则复杂度O(q*n)。反过来也可以检测区间,对于区间内每个节点,检测与该点相连的另外的点有几个是在区间内的,每发现一个,队伍数就减少一个。

 

技术分享
 1 #include <iostream>
 2 #include <vector>
 3 #include <cmath>
 4 #include <set>
 5 #include <stdio.h>
 6 #include <deque>
 7 #include <algorithm>
 8 
 9 using namespace std;
10 const int N=100005;
11 int tee[N];
12 int n, q;
13 
14 
15 int team(int l, int r)
16 {
17 
18     int cnt=r-l+1-(n-r);
19     for(int i=r; i>1; i--)
20     {
21         if( tee[n]>=l && tee[n]<=r && n>=l && n<=r )
22             cnt--;
23     }
24     return cnt;
25 }
26 
27 int main()
28 {
29 
30     //freopen("input.txt", "r", stdin);
31     int node1,node2;
32 
33     scanf("%d%d", &n, &q);
34     for(int i=0; i<n-1; i++)        //接收输入
35     {
36         scanf("%d%d", &node1, &node2);
37         tee[node2]=node1;       //节点node2的父亲是node1
38     }
39 
40     int l,r;
41     for(int i=0; i<q; i++)          //每输入一个例子就进行计算并输出
42     {
43         scanf("%d%d", &l, &r);
44         if(l==r)
45             cout<<"1"<<endl;
46         else
47             cout<<team( l, r)<<endl;
48     }
49 
50     return 0;
51 }
TLE代码

 

hihoCoder 挑战赛10 #1145 : 幻想乡的日常

标签:

原文地址:http://www.cnblogs.com/xcw0754/p/4437962.html

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