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
",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
",ans);
90     return 0;
91 }
原文地址:https://www.cnblogs.com/naix-x/p/3264474.html