bzoj1023(仙人掌直径,圆方树)

 

一般仙人掌问题,都要分情况,树上一种处理方式,环上另一种处理方式。

 

/**************************************************************
    Problem: 1023
    User: zhhx
    Language: C++
    Result: Accepted
    Time:744 ms
    Memory:13204 kb
****************************************************************/
 
#include
#include
#include
#include
#include
#include
#include
#define fi first
#define se second
#define MK(a,b) make_pair((a),(b))
#define pii pair
using namespace std;
const int N=100005;
 
int n,m;
 
vector E1[N],E2[N],disE[N];
void add(int u,int v) {E1[u].push_back(v);}
void addedge(int u,int v,int d){E2[u].push_back(v);disE[u].push_back(d);}
 
 
int dfn[N],cnt,fa[N],dis[N],from[N],len[N],num;
bool b[N];
 
void dfs1(int u)
{
    dfn[u]=++cnt;
     
    int v,sz=E1[u].size();
     
    for (int i=0;ia.fi) a.se=a.fi,a.fi=tmp;
    else if (tmp>a.se) a.se=tmp;
}
int q[N],head,tail,disq[N];
 
void dfs2(int u)
{
    int sz=E2[u].size(),v;
    for (int i=0;i=0;i--)
        {
            v=E2[u][i];
            while (head<=tail&&dis[v]-dis[q[head]]>len[anc]/2) {mx=max(mx,f[q[head]].fi+len[anc]+dis[q[head]]);head++;}
            ans=max(ans,mx+f[v].fi-dis[v]);if (head<=tail) ans=max(ans,disq[head]+dis[v]+f[v].fi);
            while (head<=tail&&disq[tail]


 

你可能感兴趣的:(仙人掌)