社区讨论
萌新求助
CF739BAlyona and a tree参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @loclvrbh
- 此快照首次捕获于
- 2023/10/30 15:56 2 年前
- 此快照最后确认于
- 2023/11/05 03:04 2 年前
RT,听说正解是树上差分,懒得进一步思考了,就较为暴力的写了一个离线区间用树状数组统计,结果 WA on test 5,不知道哪里写挂了。
CPP#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define clr(f, n) memset(f, 0, sizeof(int) * (n))
#define cpy(f, g, n) memcpy(f, g, sizeof(int) * (n))
#define rev(f, n) reverse(f, f + n)
#define pir pair<int, int>
#define mkp make_pair
#define fst it->first
#define sec it->second
#define int long long
#define up(i,x,y) for(int i=x,i##end=y;i<=i##end;++i)
#define down(i,x,y) for(int i=x,i##end=y;i>=i##end;--i)
#define graph(i,x) for(int i=head[x];i;i=nxt[i])
using namespace std;
int n, m, k;
int read()
{
int s = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
s = s * 10 + ch - '0';
ch = getchar();
}
return s * f;
}
inline void print(int *f, int len)
{
for (int i = 0; i < len; i++)
printf("%lld ", f[i]);
puts("");
}
const int maxn=4e5+10;
int head[maxn],to[maxn],nxt[maxn],tot,w[maxn];
void add(int a,int b,int c)
{
to[++tot]=b;
nxt[tot]=head[a];
head[a]=tot;
w[tot]=c;
}
int dis[maxn],p[maxn],bit[maxn];
int dfn[maxn],out[maxn],tim,a[maxn];
int lowbit(int x)
{
return x&(-x);
}
void upt(int x,int y)
{
for(;x<=n;x+=lowbit(x))bit[x]+=y;
}
int qry(int x)
{
int anss=0;
for(;x>0;x-=lowbit(x))anss+=bit[x];
return anss;
}
struct node
{
int l,r,id,x,ans;
}q[maxn];
void dfs(int x,int fa,int dist)
{
dis[x]=dist;
dfn[x]=++tim;
graph(i,x)
{
int v=to[i];
if(v==fa)continue;
dfs(v,x,dist+w[i]);
}
out[x]=tim;
q[x]=(node){dfn[x]+1,out[x],x,dis[x],0};
}
bool cmp(node a,node b)
{
return a.x<b.x;
}
int qaq[maxn];
struct qwq
{
int v,id;
}s[maxn];
/*
dis[i]表示1->i的距离
dist(u,v)<=av
dis[v]-dis[u]<=av
dis[v]-av<=dis[u]
*/
bool cmp2(qwq a,qwq b)
{
return a.v<b.v;
}
signed main()
{
n=read();
up(i,1,n)a[i]=read();
up(i,2,n)
{
int x=read(),y=read();
add(i,x,y),add(x,i,y);
}
dfs(1,0,0);
up(i,1,n)p[i]=dis[i]-a[i];
up(i,1,n)s[i]=(qwq){p[i],i};
sort(s+1,s+n+1,cmp2);
sort(q+1,q+n+1,cmp);
int nw=1;
up(i,1,n)
{
while(s[i].v>q[nw].x)
{
qaq[q[nw].id]=qry(q[nw].r)-qry(q[nw].l-1);
++nw;
}
upt(s[i].id,1);
}
while(nw<=n)
{
qaq[q[nw].id]=qry(q[nw].r)-qry(q[nw].l-1);
++nw;
}
up(i,1,n)printf("%lld ",qaq[i]);
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...