记录编号 478101 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [WC 2014] 紫荆花之恋 最终得分 100
用户昵称 GravatarLadyLex 是否通过 通过
代码语言 C++ 运行时间 12.979 s
提交时间 2017-12-08 17:37:51 内存使用 354.86 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define L 1<<20
#define MAXN 100005
#define P 1000000000
#define ll long long
char _buf[L],*S,*T,c; 
const int BufS=3000000,md=1000000000;
char buf[BufS],*inss=buf,*outs=buf,num[10];
inline void pl(register long long a){
    if(!a){*outs++='0',*outs++='\n';return;}
    register int tp=0;while(a)num[tp++]=a%10,a/=10;
    while(tp--)*outs++=num[tp]+'0';*outs++='\n';    
}
#define gc() (S==T&&(T=(S=_buf)+fread(_buf,1,L,stdin),S==T)?0:*S++)
int get()
{
    for(c=gc();c<'0'||c>'9';c=gc());
    int x=c^'0';
    for(c=gc();c>='0'&&c<='9';c=gc())x=x*10+(c^'0');
    return x;
}
struct node{int c[2],s,a;}t[MAXN*200];
bool b[MAXN],bb;
int rx[2],ry[2],lr[2],n,m,i,j,k,l,o,u,v,r[MAXN],f[MAXN],h[MAXN],ne[MAXN<<1],p[MAXN<<1],w[MAXN<<1],s[MAXN],s1[MAXN],in[MAXN],id[MAXN],r1[MAXN],r2[MAXN],d[MAXN],D[MAXN],R[100][MAXN],q[MAXN],pr[MAXN],he,ta,top;
ll ans;
void rot(int &R,bool x)
{
    int y=t[R].c[x];
    t[R].c[x]=t[y].c[!x],t[y].c[!x]=R,t[y].s=t[R].s,
    t[R].s=t[t[R].c[0]].s+t[t[R].c[1]].s+1,R=y;
}
void ins(int &R,int x)
{
    if(!R){R=++top,t[R].s=1,t[R].a=x;return;}
    bool b= x>=t[R].a;
    ins(t[R].c[b],x),t[R].s++;
    if(t[t[R].c[b]].s>t[R].s*.7)rot(R,b);
}
#define del(a) (a=0)
int ask(int R,int x)
{
    if(!R)return 0;
    if(t[R].a>=x)return t[t[R].c[1]].s+1+ask(t[R].c[0],x);
    return ask(t[R].c[1],x);;
}
int bfs(int X,int d1,int d2,int fa)
{
    int i,j,k;
    he=ta=0,D[q[ta++]=X]=d2,pr[X]=0;
    while(he!=ta)
    {
        for(j=h[i=q[he++]],s1[i]=b[i]=1,d[i]=d1+1;j;j=ne[j])if(p[j]!=pr[i]&&d[p[j]]>=d1)D[p[j]]=D[pr[q[ta++]=p[j]]=i]+w[j];
        if(d1)R[d1-1][i]=D[i];
    }
    for(i=ta-1;i>=0;i--)
    {
        s1[k=pr[q[i]]]+=s1[q[i]];
        if(s1[q[i]]<<1>ta)b[k]=0;
        if(s1[q[i]]<<1>=ta&&b[q[i]])break;
    }
    f[j=q[i]]=fa,s[j]=ta;
    if(d[j]=d1)
        in[j]=X,id[j]=d2;
    else in[j]=id[j]=0;
    return j;
}
void dfs(int X)
{
    int i,j,k,l;
    R[d[X]][X]=0,del(r1[X]),ins(r1[X],r[X]);
    for(i=h[X];i;i=ne[i])if(d[p[i]]>=d[X])
    {
        del(r2[j=bfs(p[i],d[X]+1,w[i],X)]);
        for(k=0;k<s[j];k++)
            l=q[k],ins(r1[X],r[l]-D[l]),ins(r2[j],r[l]-D[l]);
        dfs(j);
    }
}
inline void add(int u,int v,int x)
{
    p[++m]=v,ne[m]=h[u],w[m]=x,h[u]=m,
    p[++m]=u,ne[m]=h[v],w[m]=x,h[v]=m;
}
void work(int i)
{
    add(i,f[i],j),d[i]=d[f[i]]+1,s[i]=1,
    in[i]=i,id[i]=j,ins(r1[i],r[i]);
    for(k=0;k<d[i];k++)R[k][i]=R[k][f[i]]+j;
    for(k=d[f[i]],l=f[o=i];l;k--,o=l,l=f[l])
        u=R[k][i]-r[i],ans+=ask(r1[l],u)-ask(r2[o],u);
    for(k=d[f[i]],v=0,l=f[o=i];l;k--,o=l,l=f[l])
    {
        u=r[i]-R[k][i],ins(r1[l],u),ins(r2[o],u),++s[l];
        if(s[l]*0.88<s[o])v=l;
    }
    if(v)
    {
        if(d[v])u=bfs(in[v],d[v],id[v],f[v]);
        else u=bfs(1,0,0,0);
        r2[u]=r2[v],r2[v]=0,dfs(u);
    }
    pl(ans);
}
int main()
{
    freopen("flowera.in","r",stdin);
    freopen("flowera.out","w",stdout);
    get(),n=get(),get(),get();
    r[1]=get(),lr[0]=lr[1]=1,printf("0\n");
    ins(rx[0],r[1]),ins(rx[1],r[1]);
    ins(ry[0],r[1]),ins(ry[1],r[1]);
    for(i=2;i<=n;i++)
    {
        f[i]=get()^ans%P,j=get(),r[i]=get();
        if(f[i]!=lr[0]&&f[i]!=lr[1])break;
        add(i,f[i],j),D[i]=D[f[i]]+j,bb= f[i]==lr[1],lr[bb]=i;
        ans+=ask(rx[bb],D[i]-r[i])+ask(ry[!bb],D[i]-r[i]);
        if(D[i]<=r[1]+r[i])ans--;
        ins(rx[bb],D[i]+r[i]),ins(ry[bb],r[i]-D[i]);
        printf("%lld\n",ans);
    }
    if(i<=n)
    {
        for(k=1;k<=top;k++)t[k].c[0]=t[k].c[1]=0;
        top=0,memset(D,0,sizeof(D)),k=bfs(1,0,0,0),dfs(k);
        for(work(i++);i<=n;i++)
            f[i]=get()^ans%P,j=get(),r[i]=get(),work(i);
    }
    fwrite(buf,1,outs-buf,stdout);
    return 0;
}