闲着没事用线段树(应该是)做的,连样例都不对,不知道咋改
CODE:
#include <bits/stdc++.h>
using namespace std;
int SIZE;
int n;
struct Tree{
bool visited;
int l,r;
int sum;
}T[200];
int build_tree(int idx){
if(idx >= pow(2,SIZE + 1)) return 0;//如果越界
if(T[idx].visited)//如果当前节点是叶子节点
return T[idx].sum;
T[idx].sum = build_tree(idx * 2 + 1) + build_tree(idx * 2);//修改区间和
T[idx].l = T[idx * 2 + 1].l;//修改左右区间
T[idx].r = max(T[idx * 2 + 1].r,T[idx * 2].r);
T[idx].visited = 1;//表明已被访问过
return T[idx].sum;
}
int qjh(int id,int idx){
if(id == pow(2,SIZE)) return 0;
if(T[idx].l >= T[id].r or idx >= pow(2,SIZE + 1)) return 0;
if(T[idx].r == T[idx].l)
//if(T[id].sum > T[idx].sum) cout << idx << ' ';
return T[id].sum > T[idx].sum;
return qjh(id,idx * 2) + qjh(id,idx * 2 + 1);
}
int main(){
cin >> n;
SIZE = ceil(double(log(n)/log(2)));//树的深度
int id = pow(2,SIZE);//叶子节点的最小下标
for(int i = 0 ; i < n ; i ++){
cin >> T[id + i].sum;
T[id + i].l = T[id + i].r = i + 1;//初始化左右区间
T[id + i].visited = 1;//叶子节点
}
int u = build_tree(1);//开始建树
for(int i = 0 ; i < n ; i ++)
cout << qjh(id + i,1) << ' ';
return 0;
}