不知道改哪里
查看原帖
不知道改哪里
1011011
monkey333楼主2025/1/16 16:51

闲着没事用线段树(应该是)做的,连样例都不对,不知道咋改

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;
}
2025/1/16 16:51
加载中...