百度之星总结篇

2016"百度之星" - 初赛(Astar Round2A)

这是一场失败的百度之星,卡服务器,开场半小时,题目还没打开,然后接着就是卡矩阵快速幂,1个小时以后看出这题是矩阵快速幂,一个半小时A掉,然后第二题用优先队列维护一个拓扑序列,最后也没有调出来,直接1题滚粗。

1001:http://acm.hdu.edu.cn/showproblem.php?pid=5690

分析:看出来以后就是一个裸的矩阵快速幂f(n)=f(n-1)*10+x,开始被10^10的数据范围迷惑了

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 
15 typedef long long ll;
16 typedef vector<ll> vec;
17 typedef vector<vec> mat;
18 
19 ll x,m,c,mod;
20 
21 mat mul(mat &A,mat &B)
22 {
23     mat C(A.size(),vec(B[0].size()));
24     for(int i=0;i<A.size();i++){
25         for(int k=0;k<B.size();k++){
26             for(int j=0;j<B[0].size();j++){
27                 C[i][j]=(C[i][j]+A[i][k]*B[k][j])%mod;
28             }
29         }
30     }
31     return C;
32 }
33 
34 mat pow(mat A,ll n)
35 {
36     mat B(A.size(),vec(A.size()));
37     for(int i=0;i<A.size();i++){
38         B[i][i]=1;
39     }
40     while(n>0){
41         if(n&1) B=mul(B,A);
42         A=mul(A,A);
43         n>>=1;
44     }
45     return B;
46 }
47 
48 int main()
49 {    
50     int t;
51     cin>>t;
52     for(int cas=1;cas<=t;cas++)
53     {
54         cin>>x>>m>>mod>>c;
55         mat A(2,vec(2));
56         A[0][0]=10;A[0][1]=0;
57         A[1][0]=1;A[1][1]=1;
58         A=pow(A,m-1);
59         //cout<<A[1][0]<<endl;
60         mat B(2,vec(2));
61         B[0][0]=x;B[0][1]=x;
62         B[1][0]=0;B[1][1]=0;
63         A=mul(B,A);
64         printf("Case #%d:\n",cas);
65         if(A[0][0]==c)
66         printf("Yes\n");
67         else  printf("No\n");
68     }
69     return 0;
70 }
View Code

1006:http://acm.hdu.edu.cn/showproblem.php?pid=5695

分析:这题其实是拓扑排序,将入度为0的优先入队,然后对与有特殊要求的用一个优先队列进行维护,每次将入度-1,这样就可以得到最大的。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 const int maxn=100010;
15 const int INF=1<<30;
16 int vis[maxn];
17 int t,n,m;
18 int main()
19 {
20     cin>>t;
21     while(t--)
22     {
23         cin>>n>>m;
24         memset(vis,0,sizeof(vis));
25         vector<int> g[maxn];
26         for(int i=0;i<m;i++){
27             int a,b;
28             scanf("%d%d",&a,&b);
29             vis[b]++;
30             g[a].push_back(b);
31         }
32         priority_queue<int> que;
33         for(int i=1;i<=n;i++)
34             if(!vis[i])
35                 que.push(i);
36         long long ans=0;
37         int minx=INF;
38         while(!que.empty()){
39             int p=que.top();
40             que.pop();
41             minx=min(p,minx);
42             ans+=minx;
43             for(int i=0;i<g[p].size();i++){
44                 vis[g[p][i]]--;
45                 if(!vis[g[p][i]])
46                     que.push(g[p][i]);
47             }
48         }
49         cout<<ans<<endl;
50     }
51     return 0;
52 }
View Code

 

posted @ 2016-05-23 11:12  wolf940509  阅读(222)  评论(0编辑  收藏  举报