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: ",cas); 65 if(A[0][0]==c) 66 printf("Yes "); 67 else printf("No "); 68 } 69 return 0; 70 }
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 }