Codeforces Round #196 (Div. 2)

再次 回升,rating涨了150+,这次到了1670,发挥不稳定啊。什么时候来次DIV1啊。。。

感觉这次题,还是挺适合我做的,没有坑爹的题意,基本都挺短的,样例+提示,基本很快就可以得到题意。

第一题水题。。7分钟1Y。

第二题题意跑偏了一点点。。20分钟交了次,发现理解错题意了,又折腾了20分钟,2Y。

第三题推公式,高中数学递推式F(n) + 1是一个等比数列,认真检查+实现,花了我很多时间。

第四题在剩下半小时,理解了题意,写了个暴力,还写错了,第二组没过。

今天又看了看,最近老是做,关于树上的题。给一些时间,还是可以做出来的。

用一个标记数组,标记此点到m个点里 最长的距离。先搞出m个点里的最长路,那么最长路里的点,就是到两端点距离的最大值,然后爆搜一遍。就可以出结果。

第四题代码:

  1 #include <iostream>

  2 #include <cstring>

  3 #include <cstdio>

  4 #include <queue>

  5 #include <map>

  6 #include <algorithm>

  7 #include <cstdlib>

  8 using namespace std;

  9 #define M 1000000009

 10 #define LL __int64

 11 #define INF 1000000

 12 struct node

 13 {

 14     int u,v,next;

 15 } edge[200001];

 16 int first[100001];

 17 int p[100001];

 18 int in[100001];

 19 int flag[100001];

 20 int dis[100001];

 21 int pre[100001];

 22 int num[100001];

 23 int t,n;

 24 void CL()

 25 {

 26     t = 0;

 27     memset(first,-1,sizeof(first));

 28 }

 29 void add(int u,int v)

 30 {

 31     edge[t].u = u;

 32     edge[t].v = v;

 33     edge[t].next = first[u];

 34     first[u] = t ++;

 35 }

 36 int bfs(int x)

 37 {

 38     int i,u,v;

 39     for(i = 1; i <= n; i ++)

 40     {

 41         dis[i] = INF;

 42     }

 43     queue<int> que;

 44     que.push(x);

 45     dis[x] = 0;

 46     while(!que.empty())

 47     {

 48         u = que.front();

 49         que.pop();

 50         for(i = first[u]; i != -1; i = edge[i].next)

 51         {

 52             v = edge[i].v;

 53             if(dis[v] > dis[u] + 1)

 54             {

 55                 dis[v] = dis[u] + 1;

 56                 pre[v] = u;

 57                 que.push(v);

 58             }

 59         }

 60     }

 61     int maxz = 0,id;

 62     for(i = 1; i <= n; i ++)

 63     {

 64         if(flag[i])

 65         {

 66             if(maxz < dis[i])

 67             {

 68                 maxz = dis[i];

 69                 id = i;

 70             }

 71         }

 72     }

 73     return id;

 74 }

 75 void dfs(int x)

 76 {

 77     int i,v;

 78     for(i = first[x]; i != -1; i = edge[i].next)

 79     {

 80         v = edge[i].v;

 81         if(!in[v])

 82         {

 83             in[v] = 1;

 84             num[v] = num[x] + 1;

 85             dfs(v);

 86         }

 87     }

 88 }

 89 int main()

 90 {

 91     int u,v,i,m,d,a,b,ans,te,tmax;

 92     scanf("%d%d%d",&n,&m,&d);

 93     CL();

 94     for(i = 1; i <= m; i ++)

 95     {

 96         scanf("%d",&p[i]);

 97         flag[p[i]] = 1;

 98     }

 99     for(i = 1; i < n; i ++)

100     {

101         scanf("%d%d",&u,&v);

102         add(u,v);

103         add(v,u);

104     }

105     if(m > 1)

106     {

107         b = bfs(a = bfs(p[1]));

108         tmax = dis[b];

109         te = 0;

110         while(1)

111         {

112             num[b] = max(te,tmax - te);

113             in[b] = 1;

114             if(a == b) break;

115             te ++;

116             b = pre[b];

117         }

118     }

119     else

120     {

121         in[p[1]] = 1;

122     }

123     for(i = 1; i <= n; i ++)

124     {

125         if(in[i])

126         {

127             dfs(i);

128         }

129     }

130     ans = 0;

131     for(i = 1; i <= n; i ++)

132     {

133         if(num[i] <= d)

134             ans ++;

135     }

136     printf("%d\n",ans);

137     return 0;

138 }

 第5题,就是爆搜啊。。开始没什么思路,看了一下题解,看别人代码也看不懂,木看懂,英语硬伤啊。。就看到一个懂n!复杂度。。

算是n!给点提示,排完序后,当前的p[x]可以合并到前面去。然后就是各种注意素数,神马的。。。看着数据可耻的过了。

 1 #include <cstring>

 2 #include <cstdio>

 3 #include <algorithm>

 4 using namespace std;

 5 #define LL __int64

 6 LL p[10],o[10];

 7 int flag[10];

 8 bool cmp(LL a,LL b)

 9 {

10     return a > b;

11 }

12 int ans,n;

13 void dfs(int x,int sum)

14 {

15     LL i,temp,num;

16     if(sum > ans) return ;

17     if(x > n)

18     {

19         num = 0;

20         for(i = 1;i <= n;i ++)

21         {

22             if(p[i] == o[i])

23             num ++;

24         }

25         if(num > 1) sum ++;

26         ans = min(ans,sum);

27         return ;

28     }

29     for(i = 1;i < x;i ++)

30     {

31         if(p[i]%p[x] == 0)

32         {

33             p[i] = p[i]/p[x];

34             if(flag[x])

35             dfs(x+1,sum+1);

36             else

37             dfs(x+1,sum);

38             p[i] = p[i]*p[x];

39         }

40     }

41     temp = p[x];

42     num = 0;

43     for(i = 2;i*i <= temp;i ++)

44     {

45         while(temp%i == 0)

46         {

47             temp = temp/i;

48             num ++;

49         }

50     }

51     if(temp != 1) num ++;

52     if(temp != p[x]) num ++;

53     dfs(x+1,sum+num);

54 }

55 int main()

56 {

57     LL i,j,num,temp;

58     scanf("%d",&n);

59     for(i = 1;i <= n;i ++)

60     scanf("%I64d",&p[i]);

61     sort(p+1,p+n+1,cmp);

62     for(i = 1;i <= n;i ++)

63     o[i] = p[i];

64     num = 0;

65     temp = p[1];

66     ans = 1000000;

67     for(i = 2;i*i <= temp;i ++)

68     {

69         while(temp%i == 0)

70         {

71             temp = temp/i;

72             num ++;

73         }

74     }

75     if(temp != 1) num ++;

76     if(temp != p[1]) num ++;

77     for(i = 1;i <= n;i ++)

78     {

79         for(j = 2;j*j <= p[i];j ++)

80         {

81             if(p[i]%j == 0)

82             {

83                 flag[i] = 1;

84                 break;

85             }

86         }

87     }

88     dfs(2,num);

89     printf("%d\n",ans);

90     return 0;

91 }

 

你可能感兴趣的:(codeforces)