比赛 |
20160229 |
评测结果 |
MMMMMMMMMMMMMMMMMMMM |
题目名称 |
紫荆花之恋 |
最终得分 |
0 |
用户昵称 |
膜拜神犇张灵犀 |
运行时间 |
0.038 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2016-02-29 20:47:08 |
显示代码纯文本
#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;
inline char gc()
{
if(S==T)
{
T=(S=_buf)+fread(_buf,1,L,stdin);
if(S==T)return 0;
}
return *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,f;
}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;
t[R].f=rand();
return;
}
bool b=x>=t[R].a;
ins(t[R].c[b],x);
t[R].s++;
if(t[t[R].c[b]].f<t[R].f)rot(R,b);
}
inline void del(int &R)
{
R=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);
}
printf("%lld\n",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);
}}
return 0;
}