线段树写法10分求调
查看原帖
线段树写法10分求调
1111300
ayszYW楼主2024/3/22 14:06
#include<bits/stdc++.h>
using namespace std;
int arr[101000],n,ans=0;
int bi=1;


struct Cy{
	int l,r,minn,ld,lazy;
}t[100100*4+1];

void fuckbuild(int a,int b,int k){
	t[k].l=a,t[k].r=b;
	if(t[k].l==t[k].r){
		t[k].minn=arr[bi];
		bi++;
		return;
	}
	int m=(a+b)/2;
	fuckbuild(a,m,2*k);
	fuckbuild(m+1,b,2*k+1);
	t[k].minn=min(t[2*k].minn,t[2*k+1].minn);
}


void fuckdevide(int k){
	if(t[k].l==t[k].r){
		ans+=t[k].minn-t[k].lazy;
		return;
	}
	t[2*k].lazy+=t[k].minn;
	t[2*k+1].lazy+=t[k].minn;
	ans+=t[k].minn-t[k].lazy;
	fuckdevide(2*k);
	fuckdevide(2*k+1); 
	
}



int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>arr[i];
	}
	fuckbuild(1,n,1);
	//for(int i=1;i<=n*4;i++)cout<<t[i].minn<<" ";
	//cout<<endl;
	fuckdevide(1);
	cout<<ans;
	
	
	
	
}
2024/3/22 14:06
加载中...