mmp

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define int long long
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
    char ch;x=0;bool fl=false;
    while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
    for(x=numb;isdigit(ch=getchar());x=x*10+numb);
    (fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');}
template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}

namespace Miracle{
const int N=2e5+5;
int n;
struct node{
    int nxt,to;
    ll val;
}e[2*N];
int hd[N],cnt;
void add(int x,int y,ll z){
    e[++cnt].nxt=hd[x];
    e[cnt].to=y;
    e[cnt].val=z;
    hd[x]=cnt;
}
ll f[N],g[N],pr[N],bc[N];
ll tmp[N],pa[N],ba[N];
ll om[N],im[N];
ll ms[N],bb[N];
ll ans=0;
int sta[N],top;
ll b[N][5];
int dep[N];
ll vf[N];
void dfs1(int x,int fa){//f pr bc im ans
    int st=top;
    dep[x]=dep[fa]+1;
    for(reg i=hd[x];i;i=e[i].nxt){
        int y=e[i].to;
        if(y==fa) continue;
        vf[y]=e[i].val;
        sta[++top]=y;
        dfs1(y,x);
        
        bb[x]=max(bb[x],ms[x]);
        ms[x]=max(ms[x],im[y]);
        pr[y]=f[x];
        pa[y]=tmp[x];
        ans=max(ans,f[x]+f[y]+e[i].val);
        im[x]=max(im[x],im[y]);
        im[x]=max(im[x],f[x]+f[y]+e[i].val);
        tmp[x]=max(tmp[x],f[x]+f[y]+e[i].val);
        f[x]=max(f[x],f[y]+e[i].val);
    }
    ll mx=0,ma=0,mb=0;
    while(top!=st){
        int y=sta[top--];
        bc[y]=mx;
        ba[y]=ma;
        bb[y]=max(bb[y],mb);
        ma=max(ma,mx+f[y]+vf[y]);
        mx=max(mx,f[y]+vf[y]);
        mb=max(mb,im[y]);
    }
}
void dfs2(int x,int fa){//g om 
    g[x]=max(g[fa],max(pr[x],bc[x]))+vf[x];
    om[x]=max(max(max(pr[x]+bc[x],pr[x]+g[fa]),bc[x]+g[fa]),om[fa]);
    om[x]=max(om[x],max(pa[x],ba[x]));
    om[x]=max(om[x],bb[x]);
    for(reg i=hd[x];i;i=e[i].nxt){
        int y=e[i].to;
        if(y==fa) continue;
        dfs2(y,x);
    }
}
int main(){
    rd(n);
    int x,y;ll z;
    for(reg i=1;i<n;++i){
        rd(x);rd(y);rd(z);
        b[i][0]=x;b[i][1]=y;
        b[i][2]=z;
        add(x,y,z);add(y,x,z);
    }
    
    dfs1(1,0);
    dfs2(1,0);
    cnt=0;
    ll lp=0;
    for(reg i=1;i<n;++i){
        if(dep[b[i][0]]<dep[b[i][1]]) swap(b[i][0],b[i][1]);
        x=b[i][0],y=b[i][1];
        ll con=f[x]+g[x];
        lp=max(lp,con);
        
//        cout<<" con "<<x<<" and "<<y<<" : "<<f[x]+g[y]+b[i][2]<<endl;
        if(max(om[x],im[x])<con&&con==ans){
//            cout<<x<<" and "<<y<<endl;
            ++cnt;
        }
    }
//    cout<<" lp "<<lp<<endl;
//    prt(dep,1,n);
//    prt(f,1,n);
//    prt(g,1,n);
//    cout<<endl;
//    prt(pr,1,n);
//    prt(bc,1,n);
//    cout<<endl;
//    prt(im,1,n);
//    prt(om,1,n);
//    cout<<endl;
    cout<<ans<<endl<<cnt;
    return 0;
}

}
signed main(){
    Miracle::main();
    return 0;
}

/*
   Author: *Miracle*
   Date: 2019/4/12 20:26:26
*/
View Code
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define random(a,b) ((a)+rand()%((b)-(a)+1))
using namespace std;
typedef long long ll;
const int N=1000000;
const ll mod=1;
const int mo=998244353;
int a[N];
int b[N];
ll big(){
    ll ret=0;
    for(reg i=1;i<=10;++i){
        ret=((ret*10)+rand())%mod;
    }
    return ret;
}
struct po{
    int x,y;
    po(){}
    po(int xx,int yy){
        x=xx;y=yy;
    }
}qs[N];
int fu(){
    return rand()%2?1:-1;
}
void Tree(int n,int typ){
    for(reg i=2;i<=n;++i){
        int to=random(1,i-1);
        printf("%d %d ",to,i);
        if(typ==1) printf("%d",big()+1);
        puts("");
    }
}
int l,r;
int main(){
    freopen("data.in","w",stdout);
    srand((unsigned)time(0));
    int n=random(1,10);
    cout<<n<<endl;
    Tree(n,1);
    
    return 0;
}
View Code
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
vector<int> a[200001],b[200001];
int last[200001],u,v,next[200001];
long long dis[200001],mmm[200001],op;
bool vv[200001];
void dfs1(int o,long long p,int q)
{
    if(p>op){op=p;u=o;}
    for(int i=0;i<a[o].size();i++)
        if((!vv[a[o][i]])&&(a[o][i]!=q))
        {
            vv[a[o][i]]=true;
            dfs1(a[o][i],p+b[o][i],o);
        }
}
void dfs2(int o,long long p,int q)
{
    last[o]=q;
    dis[o]=p;
    if(p>op){op=p;v=o;}
    for(int i=0;i<a[o].size();i++)
        if((!vv[a[o][i]])&&(a[o][i]!=q))
        {
            vv[a[o][i]]=true;
            dfs2(a[o][i],p+b[o][i],o);
        }
}
int main()
{
    freopen("data.in","r",stdin);
    freopen("std.out","w",stdout);
    int n;
    cin>>n;
    for(int i=1;i<n;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        a[x].push_back(y);
        b[x].push_back(z);
        a[y].push_back(x);
        b[y].push_back(z);
    }
    memset(vv,0,sizeof(vv));op=0;
    dfs1(1,0,0);
    memset(vv,0,sizeof(vv));op=0;
    dfs2(u,0,0);
    int distance=dis[v];
    cout<<dis[v]<<endl;
    memset(vv,0,sizeof(vv));
    for(int i=v;i!=0;i=last[i]) vv[i]=true;
    for(int i=v;i!=0;i=last[i])
    {
        op=0;
        dfs1(i,0,0);
        mmm[i]=op;
    }
    int j=v;
    for(int i=last[v];i!=0;i=last[i]) next[i]=j,j=i;
    int ans=0;
    int i;
    for(i=j;i!=0;i=next[i])
        if(dis[v]-dis[i]==mmm[i]) break;
    for(;i!=0;i=last[i])
    {
        if(dis[i]==mmm[i]) break;
        ans++;
    }
    cout<<ans<<endl;
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/Miracevin/p/10699059.html
mmp
Map
kmp
MLP
今日推荐