爆栈&MLE?求各位大爷帮助

P3038 [USACO11DEC] Grass Planting G

Vermouth_1412 @ 2018-10-17 12:22:38

RT,除4个点AC外其余点都MLE,感觉像是爆栈了(虽然洛谷好像是无限栈),调了一上午还是不太清楚问题在哪里,求各位大爷帮助。

代码:(代码中的printf("OK_dfs1\n");在测试点2中输出不出来,感觉应该是build函数挂了,不明觉厉,晕)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define lson rec<<1,l,mid
#define rson rec<<1|1,mid+1,r
using namespace std;
const int mx=100000;
int n,m,cnt,x,y;
int num[mx+5],dep[mx+5],zu[mx+5],siz[mx+5],pos[mx+5],poi[mx+5],top[mx+5],son[mx+5],sm[(mx<<2)+5],ad[(mx<<2)+5];
struct node{
    int y,next;
};
node road[(mx<<1)+5];
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
    return x*f;
}
inline void rech()
{
    char ch=getchar();while(ch!='P'&&ch!='Q') ch=getchar();
    if(ch=='P') cnt=1;
    else cnt=2;
} 
void add(int u,int v)
{
    road[++cnt].y=v;road[cnt].next=num[u];num[u]=cnt;
}
//int js=0;
void build(int u)
{
    dep[u]=dep[zu[u]]+1;siz[u]=1;int v;//printf("u=%d  js=%d\n",u,++js);
    for(register int i=num[u];i;i=road[i].next){
        v=road[i].y;
        if(v!=zu[u]){
            zu[v]=u;build(v);siz[u]+=siz[v];if(siz[v]>siz[son[u]]) son[u]=v;//printf("v=%d\n",v);
        }
    }
}
void dfs(int u)
{
    pos[u]=++cnt;poi[cnt]=u;int v;
    if(son[u]) top[son[u]]=top[u],dfs(son[u]);
    for(int i=num[u];i;i=road[i].next){
        v=road[i].y;
        if(v!=son[u]&&v!=zu[u]) top[v]=v,dfs(v);
    }
}
inline void pushdown(int rec,int l,int r)
{
    if(ad[rec]){
        int mid=(l+r)>>1;
        ad[rec<<1]+=ad[rec];ad[rec<<1|1]+=ad[rec];
        sm[rec<<1]+=(mid-l+1)*ad[rec];sm[rec<<1|1]+=(r-mid)*ad[rec];ad[rec]=0;
    }
}
void modify(int rec,int l,int r)
{
    if(x<=l&&y>=r){
        sm[rec]+=(r-l+1);++ad[rec];return;
    }
    int mid=(l+r)>>1;pushdown(rec,l,r);
    if(x<=mid) modify(lson);
    if(y>mid) modify(rson);
    sm[rec]=sm[rec<<1]+sm[rec<<1|1];
}
inline void amodify(int a,int b)
{
    while(top[a]!=top[b]){
        if(dep[top[a]]<dep[top[b]]) swap(a,b);
        x=pos[top[a]];y=pos[a];if(top[a]==b) --x;
        modify(1,1,n);a=zu[top[a]];
    }
    if(a==b) return;
    if(dep[a]>dep[b]) swap(a,b);
    x=pos[a]+1,y=pos[b];modify(1,1,n);
}
int query(int rec,int l,int r)
{
    if(x<=l&&y>=r) return sm[rec];
    int mid=(l+r)>>1;
    if(x>mid) return query(rson);
    if(y<=mid) return query(lson);
    return query(lson)+query(rson);
}
inline int aquery(int a,int b)
{
    int res=0;
    while(top[a]!=top[b]){
        if(dep[top[a]]<dep[top[b]]) swap(a,b);
        x=pos[top[a]];y=pos[a];if(top[a]==b) --x;
        res+=query(1,1,n);a=zu[top[a]];
    }
    if(a==b) return res;
    if(dep[a]>dep[b]) swap(a,b);
    x=pos[a]+1,y=dep[b];return res+query(1,1,n);
}
int main()
{
    //freopen("P3038.in","r",stdin);
    n=read();m=read();int u,v;
    for(register int i=1;i<n;++i){u=read();v=read();add(u,v);add(v,u);}//printf("ok_build\n");
    zu[1]=1;build(1);printf("OK_dfs1\n");top[1]=1;cnt=0;dfs(1);
    for(int i=1;i<=m;++i){
        rech();u=read();v=read();
        if(cnt==1) amodify(u,v);
        else printf("%d\n",aquery(u,v));
    }
    return 0;
}

by Vermouth_1412 @ 2018-10-17 12:22:55

qwq


by Vermouth_1412 @ 2018-10-17 12:38:56

emmm是我的Dev-c++爆栈了。可是还是有问题


by Euler_Pursuer @ 2018-10-17 12:46:14

这题炒鸡难写,只能远观大佬并且膜了%%%。


by Vermouth_1412 @ 2018-10-17 12:55:05

过了,总之感觉自己写树剖总是有锅,唉,被自己菜死


|