TLE,卑微求调
查看原帖
TLE,卑微求调
1381901
Starpop楼主2024/12/24 21:45

TLE #2 #6 #8 #9 #10

#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int INF=0x3f3f3f3f;
const int N=401100;

inline long long read()
{
	long long f=1,x=0; char ch=getchar();
	while(!isdigit(ch)) { if(ch=='-') f=-1; ch=getchar(); }
	while(isdigit(ch))  { x=x*10+ch-'0';    ch=getchar(); }
	return f*x;
}

#define mid (l+r>>1)
#define iL T[i].ls
#define iR T[i].rs
struct tree
{
    int ls,rs;
    int val;
}T[N<<6];
struct edge
{
    int next,to;
    long long dis;
}e[N<<1];
int root[N],cnt;
int head[N],tot;
int n,top,ans[N];
long long tmp;
long long depL[N],depR[N];
long long NUM[N<<1];

void add_edge(int from,int to,long long dis)
{
    e[tot].next=head[from];
    e[tot].to=to;
    e[tot].dis=dis;
    head[from]=tot++;
}

void pushup(int i)
{ T[i].val=T[iL].val+T[iR].val; }

void updata(int &i,int l,int r,int p,int num)
{
    if(!i) i=++cnt;
    if(l==r) return (void)(T[i].val+=num);
    if(p<=mid) updata(iL,l,mid,p,num);
    if(p>mid)  updata(iR,mid+1,r,p,num);
    pushup(i);
}

int query(int i,int l,int r,int L,int R)
{
    if(!i) return 0;
    if(L<=l&&r<=R) return T[i].val;
    int sum=0;
    sum+=query(iL,l,mid,L,R);
    sum+=query(iR,mid+1,r,L,R);
    return sum;
}

void Merge(int &i,int j,int l,int r)
{
    if(!i||!j) return (void)(i+=j);
    if(l==r)   return (void)(T[i].val+=T[j].val);
    Merge(T[i].ls,T[j].ls,l,mid);
    Merge(T[i].rs,T[j].rs,mid+1,r);
    pushup(i);
}

void GetDeep(int u,int dep)
{
    //root[u]=u;
    NUM[++top]=(depL[u]=dep);
    NUM[++top]=(depR[u]=dep+tmp);
    for(int i=head[u];~i;i=e[i].next)
     GetDeep(e[i].to,dep+e[i].dis);
}

void dfs(int u)
{
    if(!u) return ;
    updata(root[u],0,top,depL[u],1);
    for(int i=head[u],v;~i;i=e[i].next)
    {
        dfs(v=e[i].to);
        Merge(root[u],root[v],0,top);
    }
    ans[u]=query(root[u],0,top,depL[u],depR[u]);
}

signed main()
{
    	memset(head,-1,sizeof(head));
    n=read(); tmp=read();
    for(int i=2;i<=n;i++)
    {
        int fa=read(),w=read();
        add_edge(fa,i,w);
    }
    GetDeep(1,0);
    sort(NUM+1,NUM+top+1);
    top=unique(NUM+1,NUM+top+1)-NUM-1;
    for(int i=1;i<=n;i++)
    {
        depL[i]=lower_bound(NUM+1,NUM+top+1,depL[i])-NUM;
        depR[i]=lower_bound(NUM+1,NUM+top+1,depR[i])-NUM;
    }
    dfs(1);
    for(int i=1;i<=n;i++)
     printf("%d\n",ans[i]);
	return 0;
}

2024/12/24 21:45
加载中...