再次 回升,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 }