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
过了,总之感觉自己写树剖总是有锅,唉,被自己菜死