如果有人帮我做出这题的话,题主就女装!

P4114 Qtree1

铁锤 @ 2019-08-11 13:56:39

RT

MLE 4+RE 6

#include<bits/stdc++.h>

using namespace std;

inline int read(){
    int ans=0;
    char last=' ',ch=getchar();
    while(ch<'0'||ch>'9') last=ch,ch=getchar();
    while(ch>='0'&&ch<'9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar();
    if(last=='-') ans=-ans;
    return ans;
}

const int mxm=200005;
const int mxn=100005;
int n;
int ecnt,cnt;
int head[mxn],dep[mxn],top[mxn];
int son[mxn],size[mxn],fat[mxn];
int dfn[mxn],tr[mxm<<2],sum[mxn];
struct Node{
    int u,v,w;
}e[mxm];

struct edge{
    int to,nxt;
}ed[mxm];

void add(int from,int to){
    ++ecnt;
    ed[ecnt].to=to;
    ed[ecnt].nxt=head[from];
    head[from]=ecnt;
}

void dfs1(int u,int fa){
    dep[u]=dep[fa]+1;
    size[u]=1;
    fat[u]=fa;
    int v,sum=0;
    for(int i=head[u];i;i=ed[i].nxt){
        v=ed[i].to;
        if(v!=fa){
            dfs1(v,u);
            size[u]+=size[v];
            if(size[v]>sum) sum=size[v],son[u]=v;
        }
    }
}

void dfs2(int u,int fa){
    dfn[u]=++cnt;
    if(son[fa]==u) top[u]=top[fa];
    else top[u]=u;
    if(son[u]) dfs2(son[u],u);
    for(int i=head[u],v;i;i=ed[i].nxt){
        v=ed[i].to;
        if(v!=fa&&v!=son[u])
            dfs2(v,u);
    }
}

void build(int k,int l,int r){
    if(l==r) {
        tr[k]=sum[l];
        return;
    }
    int mid=l+r>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    tr[k]=max(tr[k<<1],tr[k<<1|1]);
}

void change(int k,int l,int r,int p,int c){
    if(l==r){
        tr[k]=c;
        return;
    }
    int mid=l+r>>1;
    if(mid>=p) change(k<<1,l,mid,p,c);
    else change(k<<1|1,mid+1,r,p,c);
    tr[k]=max(tr[k<<1],tr[k<<1|1]);
}

int query(int k,int l,int r,int x,int y){
    if(x>y) return 0;
    if(l>=x&&r<=y)
        return tr[k];
    int mid=l+r>>1;
    int ans=0;
    if(x<=mid) ans=max(ans,query(k<<1,l,mid,x,y));
    if(y>mid) ans=max(ans,query(k<<1|1,mid+1,r,x,y));
    return ans;
//have question!!   
}

int getans(int a,int b){
    int ret=0;
    while(top[a]!=top[b]){
        int ta=top[a];
        int tb=top[b];
        if(dep[ta]<dep[tb]) ret=max(ret,query(1,1,n,dfn[tb],dfn[b])),b=fat[tb];
        else ret=max(ret,query(1,1,n,dfn[ta],dfn[a])),a=fat[ta];
    }
    if(dep[a]<dep[b]) swap(a,b);
    ret=max(ret,query(1,1,n,dfn[b]+1,dfn[a]));
    return ret;
}

int main(){

    n=read();
    int u,v,w;
    for(int i=1;i<n;i++){
        u=read();v=read();w=read();
        e[i].u=u;e[i].v=v;e[i].w=w;
        add(u,v);add(v,u);
    }
    dfs1(1,0);
    dfs2(1,0);
    sum[1]=0;
    for(int i=1;i<n;i++){
        if(dep[e[i].u]>dep[e[i].v]) sum[dfn[e[i].u]]=e[i].w;
        else sum[dfn[e[i].v]]=e[i].w;
    }
    build(1,1,n);
    char s[20];
    int i,it,a,b;
    while(1){
        scanf("%s",s);
        if(s[0]=='D') break;
        if(s[0]=='C'){
            i=read();
            it=read();
            if(dep[e[i].u]>dep[e[i].v])
                change(1,1,n,dfn[e[i].u],it);
            else
                change(1,1,n,dfn[e[i].v],it);
        }
        if(s[0]=='Q'){
            a=read();
            b=read();
            printf("%d\n",getans(a,b));
        }
    }
    return 0;
}

by 一个大帅哥 @ 2019-08-11 14:02:42

本人不是大佬看不懂


by Lstdo @ 2019-08-11 14:04:37

@铁锤 询问要特判一个点


by wudiss8 @ 2019-08-11 14:06:22

@铁锤 年少不知号重要


by wudiss8 @ 2019-08-11 14:06:39

@铁锤 好像要开LONG LONG 的


by 铁锤 @ 2019-08-11 14:06:44

@Lstdo 哦,大佬,应该怎么改


by Lstdo @ 2019-08-11 14:08:05

@铁锤 getans的时候

if (a==b) return 0;

by 铁锤 @ 2019-08-11 14:08:28

@Lstdo 行


by 铁锤 @ 2019-08-11 14:08:47

可是mle和re是怎么回事啊


by Lstdo @ 2019-08-11 14:09:52

@铁锤 不对你判了的 当我没说(逃


by optimize_3 @ 2019-08-11 14:14:04

@chen_zhe


| 下一页