洛谷1099 树网的核

北慕城南 提交于 2019-11-28 16:23:47

O(\(n^3\))做法

#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(3)

#define go(i,a,b) for(int i=a;i<=b;++i)
#define com(i,a,b) for(int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define fin freopen("input.txt","r",stdin)
#define fout freopen("output.txt","w",stdout)
#define re register
#define int long long
typedef long long ll;

const int inf=0x3f3f3f3f;

inline void read(int &x){
    int f=1;char c=getchar();x=0;
    while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
    while(isdigit(c)){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
    x*=f;
}//读入优化

bool is_p(ll x){
    for(int i=2;(ll)i*i<=x;++i)
        if(x%i==0) return 0;
    return 1;
}

signed main(){
    //fin;
    ll n,k;
    cin>>n>>k;
    ++n,++k;
    int mx=k;
    int ans;
    if(k==n) ans=0;
    else if(2*k>n){
        for(re int i=2;i*i<=mx;++i){
            while(mx%i==0){
                mx/=i;
                if(n/i*i>k){
                    puts("2");
                    return 0;
                }
            }
        }
        ans=1;
    }
    else ans=2;
    if(is_p(k)) ans=max(ans,(ll)1);
    else ans=max(ans,(ll)2);
    cout<<ans;
    return 0;
}

O(\(n^2\))做法

#include<bits/stdc++.h>
using namespace std;

#define go(i,a,b) for(int i=a;i<=b;++i)
#define com(i,a,b) for(int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;

const int N=300+10,inf=0x3f3f3f3f;

int n,s,head[N],d[N],dis[N],f[N],ans=0,far[N],ans2=inf,cnt=0;
bool vis[N];
vector<int>lng,cp;
struct edge{
    int nxt,v,w;
}e[N*2];

void add(int u,int v,int w){
    e[cnt]=(edge){head[u],v,w};
    head[u]=cnt++;
}

void dfs(int u,int fa){
    for(int i=head[u];i+1;i=e[i].nxt){
        int v=e[i].v,w=e[i].w;
        if(v==fa) continue;
        d[v]=d[u]+w;
        dfs(v,u);
    }
} 
void dfs2(int u,int fa){
    f[u]=fa;
    for(int i=head[u];i+1;i=e[i].nxt){
        int v=e[i].v,w=e[i].w;
        if(v==fa) continue;
        dis[v]=dis[u]+w;
        dfs2(v,u);
    }
}

void dfs3(int u,int fake){
    vis[u]=1;
    ans=max(ans,fake);
    for(int i=head[u];i+1;i=e[i].nxt){
        int v=e[i].v,w=e[i].w;
        if(vis[v]) continue;
        dfs3(v,fake+w);
    }
}

int main(){
    //freopen("input.txt","r",stdin);
    mem(head,-1);
    cin>>n>>s;
    int x,y,w;
    go(i,1,n-1){
        cin>>x>>y>>w;
        add(x,y,w);
        add(y,x,w);
    }
    dfs(1,0);
    int Max=-1,id,id2;
    go(i,1,n) if(d[i]>Max){
        Max=d[i],id=i;
    }
    dfs2(id,0);
    Max=-1;
    go(i,1,n) if(dis[i]>Max){
        Max=dis[i],id2=i;
    }
    x=id2;
    while(x!=id){
        lng.push_back(x);
        x=f[x];
    }
    lng.push_back(id);
    int l=lng.size()-1;
    go(i,0,l){
        x=lng[i];
        go(j,i,l){
            y=lng[j];
            if(dis[x]-dis[y]<=s) far[x]=y;
            else break;
        }
    }
    go(i,0,l){
        mem(vis,0);
        x=lng[i],y=far[x];
        if(dis[x]-dis[y]>s) continue;
        cp.clear();
        while(x!=y) cp.push_back(x),x=f[x],vis[x]=1;
        cp.push_back(y),vis[y]=1;
        ans=0;
        for(int k=0;k<cp.size();++k)
        dfs3(cp[k],0);
        ans2=min(ans,ans2);
    }
    cout<<ans2;
    return 0;
}

\(O(n*log(sum))\)做法

#include<bits/stdc++.h>
using namespace std;

#define go(i,a,b) for(int i=a;i<=b;++i)
#define com(i,a,b) for(int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;

const int N=300+10,inf=0x3f3f3f3f;

int n,s,head[N],d[N],dis[N],f[N],ans=0,far[N],ans2=inf,cnt=0;
bool vis[N];
vector<int>lng,cp;
struct edge{
    int nxt,v,w;
}e[N*2];

void add(int u,int v,int w){
    e[cnt]=(edge){head[u],v,w};
    head[u]=cnt++;
}

void dfs(int u,int fa){
    for(int i=head[u];i+1;i=e[i].nxt){
        int v=e[i].v,w=e[i].w;
        if(v==fa) continue;
        d[v]=d[u]+w;
        dfs(v,u);
    }
} 
void dfs2(int u,int fa){
    f[u]=fa;
    for(int i=head[u];i+1;i=e[i].nxt){
        int v=e[i].v,w=e[i].w;
        if(v==fa) continue;
        dis[v]=dis[u]+w;
        dfs2(v,u);
    }
}

void dfs3(int u,int fake){
    vis[u]=1;
    ans=max(ans,fake);
    for(int i=head[u];i+1;i=e[i].nxt){
        int v=e[i].v,w=e[i].w;
        if(vis[v]) continue;
        dfs3(v,fake+w);
    }
}

bool pd(int x,int y,int Max){
    if(dis[x]<dis[y]) return 1;
    if(dis[x]-dis[y]>s) return 0;
    mem(vis,0);
    int a=x;
    while(x!=y) vis[x]=1,x=f[x];
    vis[y]=1;
    ans=0;
    x=a;
    while(x!=y){
        x=f[x];
        if(x!=y) dfs3(x,0);
    }
    return ans<=Max;
}

int main(){
    //freopen("input.txt","r",stdin);
    mem(head,-1);
    cin>>n>>s;
    int x,y,w;
    ll L=0,R=0;
    go(i,1,n-1){
        cin>>x>>y>>w;
        R+=w;
        add(x,y,w);
        add(y,x,w);
    }
    dfs(1,0);
    int Max=-1,id,id2;
    go(i,1,n) if(d[i]>Max){
        Max=d[i],id=i;
    }
    dfs2(id,0);
    Max=-1;
    go(i,1,n) if(dis[i]>Max){
        Max=dis[i],id2=i;
    }
    x=id2;
    while(x!=id){
        lng.push_back(x);
        x=f[x];
    }
    lng.push_back(id);
    int l=lng.size()-1;
    while(L<=R){
        ll mid=L+R>>1;
        int a,b;
        y=lng[0];
        go(i,0,l){
            x=lng[i];
            if(dis[y]-dis[x]<=mid) a=x;
            else break;
        }
        y=lng[l];
        com(i,l,0){
            x=lng[i];
            if(dis[x]-dis[y]<=mid) b=x;
        }
        if(pd(a,b,mid)) R=mid-1;
        else L=mid+1;
    }
    cout<<R+1;
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!