标签:
思路: 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 }
hihoCoder 挑战赛10 #1145 : 幻想乡的日常
标签:
原文地址:http://www.cnblogs.com/xcw0754/p/4437962.html