낙 곡 P3605 [USACO17JAN] Promotion Counting 승진 자 계수 - 트 리 배열, 가중치 선분 트 리
#include
#include
#include
using namespace std;
const int maxn = 1e5+10;
int n,m,b[maxn],head[maxn],cur=1,ans[maxn],t[maxn];
struct EDGE {
int to,next;
} edge[maxn];
void add(int u,int v) {
edge[cur].to=v;
edge[cur].next=head[u];
head[u]=cur++;
}
struct COW {
int v,id;
} a[maxn];
bool cmp(COW x,COW y) {
return x.v>y.v;
};
int lowbit(int x) {
return x&-x;
}
void update(int x,int v) {
for(; x0; i=edge[i].next)
dfs(edge[i].to);
ans[x]+=query(b[x]-1);
}
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++)scanf("%d",&a[i].v),a[i].id=i; //
sort(a+1,a+1+n,cmp);
for(int i=1; i<=n; i++)b[a[i].id]=i;
for(int i=2; i<=n; i++) {
int f;
scanf("%d",&f);
add(f,i);
}
dfs(1);
for(int i=1; i<=n; i++)printf("%d
",ans[i]);
}
인터넷 에서 당신 이 선분 트 리 로 쓴 것 을 보 았 는데, 사실은 가중치 선분 트 리 입 니 다.가중치 선분 의 템 플 릿 에 따라 다시 한 번 썼 다.나무 모양 으로 배열 할 수 있 으 면 쓰 세 요.
가중치 선분 트 리 의 구축 과 유사 한 트 리 배열 은 데 이 터 를 이산 화 한 후에 데이터 i 가 나 타 났 는 지, 나 타 났 는 지, i 의 위치 표지 에 1.
#include
#include
#include
using namespace std;
const int maxn = 1e5+10;
struct Node {
int l,r,tot;
} tree[maxn*3];
int n,m,b[maxn],head[maxn],cur=1,ans[maxn];
struct EDGE {
int to,next;
} edge[maxn];
void add(int u,int v) {
edge[cur].to=v;
edge[cur].next=head[u];
head[u]=cur++;
}
struct COW {
int v,id;
} a[maxn];
bool cmp(COW x,COW y) {
return x.v>1;
build(l,mid,o<<1);
build(mid+1,r,o<<1|1);
}
void push_up(int o) {
tree[o].tot=tree[o<<1].tot+tree[o<<1|1].tot;
}
void update(int o,int x) {
if(tree[o].l==x && tree[o].l==tree[o].r) {
tree[o].tot++;
return ;
}
int mid=(tree[o].l+tree[o].r)>>1;
if(x<=mid) update(o<<1,x);
if(x>mid) update(o<<1|1,x);
push_up(o);
}
int query(int o,int l,int r) { // >=l , l-1
if(tree[o].l>r || tree[o].r>1;
if(r<=mid) return query(o<<1,l,r);
if(l>mid) return query(o<<1|1,l,r);
return query(o<<1,l,mid)+query(o<<1|1,mid+1,r);
}
void dfs(int x) {
update(1,b[x]);
ans[x]-=query(1,b[x]+1,n) ;
for(int i=head[x]; i>0; i=edge[i].next)
dfs(edge[i].to);
ans[x]+=query(1,b[x]+1,n);
}
int main() {
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
scanf("%d",&n);
for(int i=1; i<=n; i++)scanf("%d",&a[i].v),a[i].id=i;
sort(a+1,a+1+n,cmp);
for(int i=1; i<=n; i++)b[a[i].id]=i;
build(1,n,1);
for(int i=2; i<=n; i++) {
int f;
scanf("%d",&f);
add(f,i);
}
dfs(1);
for(int i=1; i<=n; i++)printf("%d
",ans[i]);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.