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

 

思路: 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代码

 

你可能感兴趣的:(code)