NOIP2013Day1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35531039/article/details/84404450

T1 转圈游戏

初看以为是啥神仙数学题。
直到我发现他是day1t1才确定这真的是快速幂。
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
inline ll _() {
	ll x=0,f=1; char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())
		if(ch=='-')f=-f;
	for(;ch>='0'&&ch<='9';ch=getchar())
		x=x*10+ch-'0';
	return x*f;
}
#define _ _()
ll n,m,k,x;
inline ll power(ll a,ll b) { 
    ll res=1;
    while(b) {
        if(b&1) res=res*a%n;
        b>>=1; a=a*a%n;
    }
    return res;
}
int main() {
    n=_; m=_; k=_; x=_;
    printf("%lld\n",(x+m*power(10,k)%n)%n);
}

T2

T3 货车运输

跑出最大生成树,然后上Kruskal重构树|倍增。
当时写的是倍增
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
inline ll _() {
    ll x=0,f=1; char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar())
        if(ch=='-')f=-f;
    for(;ch>='0'&&ch<='9';ch=getchar())
        x=x*10+ch-'0';
    return x*f;
}
#define _ _()
const int N=5e4+5;
int n,m; 
struct edge {
    int u,v,w;
    bool operator < (const edge b) const {
        return w>b.w;
    } 
}b[N];
struct Edge { int to,nxt,w; }e[N<<1];
int cnt,head[N];
inline void insert(int u,int v,int w) {
    e[cnt]=(Edge) {v,head[u],w};
    head[u]=cnt++;
}
inline void ins(int u,int v,int w) {
    insert(u,v,w); insert(v,u,w);
}
int pre[N],siz[N],dep[N],f[N][20],mn[N][20],ans;
inline int find(int x) { return pre[x]==x?x:pre[x]=find(pre[x]); }
inline void dfs(int x,int fa) {
    dep[x]=dep[fa]+1;
    for(int i=1;i<20;i++)
        f[x][i]=f[f[x][i-1]][i-1],mn[x][i]=min(mn[x][i-1],mn[f[x][i-1]][i-1]);
    for(int i=head[x];~i;i=e[i].nxt)
        if(e[i].to!=fa) {
            mn[e[i].to][0]=e[i].w; f[e[i].to][0]=x;
            dfs(e[i].to,x);
        }
}
inline int lca(int x,int y) {
    ans=2e9;
    if(dep[x]<dep[y]) swap(x,y);
    for(int i=19;~i;i--) {
        if(dep[f[x][i]]>=dep[y]) {
            ans=min(ans,mn[x][i]);
            x=f[x][i];
        }
        if(x==y) return x;
    }
    for(int i=19;~i;i--)
        if(f[x][i]!=f[y][i])
            ans=min(ans,min(mn[x][i],mn[y][i])),x=f[x][i],y=f[y][i];
    ans=min(ans,min(mn[x][0],mn[y][0]));
    return f[x][0];
}
int main() {
    n=_; m=_;
    memset(head,-1,sizeof(head));
    for(int i=1;i<=n;i++)
        for(int j=0;j<20;j++)
            mn[i][j]=2e9;
    for(int i=1;i<=n;i++)
        pre[i]=i,siz[i]=1;
    for(int i=1;i<=m;i++)
        b[i].u=_,b[i].v=_,b[i].w=_;
    sort(b+1,b+m+1);
    for(int i=1;i<=m;i++) {
        int x=find(b[i].u),y=find(b[i].v);
        if(x!=y) { 
            ins(b[i].u,b[i].v,b[i].w);
            if(siz[x]<siz[y]) swap(x,y);
            siz[x]+=siz[y];
            pre[y]=x;
        }
    }
    for(int i=1;i<=n;i++)
        if(pre[i]==i) dfs(i,0);
    int q=_;
    while(q--) {
        int x=_,y=_;
        if(find(x)!=find(y)) { puts("-1"); continue; }//lca(x,y);
        lca(x,y);
        printf("%d\n",ans);
    }
} 

猜你喜欢

转载自blog.csdn.net/qq_35531039/article/details/84404450