码迷,mamicode.com
首页 > 其他好文 > 详细

BestCoder Round #69 (div.2)

时间:2016-01-03 00:39:15      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:

A.geometry

技术分享
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

int main(){
    //freopen("in.txt","r",stdin);
    int T;scanf("%d",&T);
    while(T--){
        int x,y;
        scanf("%d%d",&x,&y);
        cout<<abs(2*x*y)<<endl;
    }
    return 0;
}
View Code

B.tree

思路:可知距离每个点最近的点必然是它本身,距离唯一。所以只需要把所有相互之间距离为0的点通过并查集缩团就好。一开始想写dfs超时了,然后换了并查集,因为脑残原因WA了几发。

技术分享
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

int par[100100];
int cnt[100100];
int find(int x){
    return par[x]=(x==par[x]?x:find(par[x]));
}

int main(){
    //freopen("in.txt","r",stdin);
    int T;scanf("%d",&T);
    while(T--){
        int n;scanf("%d",&n);
        for(int i=0;i<=n;i++){
            par[i]=i;
            cnt[i]=1;
        }
        for(int i=0;i<n-1;i++){
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            if(!w){
                par[v]=find(u);
                cnt[par[v]]+=cnt[v];
            }
        }
        for(int i=1;i<=n;i++)
            cnt[i]=cnt[par[find(i)]];
        int ans=cnt[1];
        for(int i=2;i<=n;i++)
            ans^=cnt[i];
        printf("%d\n",ans);
    }
    return 0;
}
View Code

C.graph

思路:之前做个一个类似的,随机选择图上一点出发,等概率去往与他相邻的点,求k步之后他在每个点的概率。这个题的概率转移方程跟之前那题一直,只是因为点小于20个,所以变成矩阵的形式,然后再通过矩阵快速幂计算就好了。值得一提的是快速幂的模板有问题,导致WA。还有不知道数论的一个定理。谢谢bc群里的菊苣们。

技术分享

技术分享
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
typedef long long ll;

const ll MOD=1e9+7;
const int MAXN=60; //矩阵阶数
bool G[60][60];
int tot[60];
struct Matrix{
    ll m[MAXN][MAXN];
    Matrix()
    {
        memset(m,0,sizeof(m));
        for(int i=0;i<MAXN;i++)
            m[i][i]=1;
    }
    void clear(){
        memset(m,0,sizeof(m));
    }
    void show(){
        for(int i=0;i<MAXN;i++){
            for(int j=0;j<MAXN;j++)
                cout<<m[i][j]<<" ";
            cout<<endl;
        }
    }
};

Matrix mtMul(Matrix A,Matrix B)
{
    int i,j,k,tmp;
    Matrix C;
    C.clear();
    for(int i=0;i<MAXN;i++)
        for(int j=0;j<MAXN;j++)
            for(int k=0;k<MAXN;k++)
                C.m[i][j]=(C.m[i][j]%MOD+(A.m[i][k]%MOD)*(B.m[k][j]%MOD))%MOD;
    return C;
}
Matrix mtPow(Matrix A,int k)
{
    k--;
    Matrix ans=A;
    while(k){
        if(k&1) ans=mtMul(ans,A);
        A=mtMul(A,A);
        k>>=1;
    }
    return ans;
}

ll Quick_pow(ll x,int m){
    ll sum=1;
    while(m){
        if(m&1) sum=((sum%MOD)*(x%MOD))%MOD;
        x=((x%MOD)*(x%MOD))%MOD;
        m>>=1;
    }
    return sum;
}

int main(){
    //freopen("in.txt","r",stdin);
    int n,m;
    while(cin>>n>>m){
        int u,v;
        Matrix M;
        M.clear();
        memset(G,0,sizeof(G));
        memset(tot,0,sizeof(tot));
        while(m--){
            cin>>u>>v;
            tot[u-1]++;
            G[v-1][u-1]=true;
        }
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(G[i][j]){
                    M.m[i][j]=((M.m[i][j])%MOD+Quick_pow(tot[j],1e9+5)%MOD)%MOD;
                }
        int Q;
        cin>>Q;

        while(Q--){
            int u,k;
            cin>>u>>k;
            Matrix ans=mtPow(M,k);
            //ans.show();
            for(int i=0;i<n;i++)
                cout<<ans.m[i][u-1]<<" ";
            cout<<endl;
        }
    }
    return 0;
}
View Code

 

BestCoder Round #69 (div.2)

标签:

原文地址:http://www.cnblogs.com/onlyAzha/p/5095405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!