线段树样例不过求调急!!!悬2关!!!
查看原帖
线段树样例不过求调急!!!悬2关!!!
587615
zqh123b楼主2024/8/3 12:19
#include<bits/stdc++.h>
using namespace std;
//define!
#define psba push_back
#define vet vector<int>
#define ll long long
#define con const int
#define conll const long long
#define conti continue
#define bre break
#define vetpa vector<pair<int,int> >
#define fir first
#define sec second
#define intpair pair<int,int>
#define llpair pair<ll,ll>
//update:2024/8/2
con N=1e6+10,M=N<<2;
int n,m,a[N];
struct node{
	int l,r;
	ll val;
	ll mx;
}tree[M];
void exchange(int root){
	tree[root].val=tree[root*2].val+tree[root*2+1].val;
	tree[root].mx=max(tree[root*2].mx,tree[root*2+1].mx);
}
void build(int root,int l,int r){
	tree[root].l=l;
	tree[root].r=r;
	if(l==r){
		tree[root].val=1ll*a[l];
		tree[root].mx=1ll*a[l];
		return;
	}
	int mid=l+(r-l)/2;
	build(root*2,l,mid);
	build(root*2+1,mid+1,r);
	exchange(root);
}
void add(int root,int l,int r,int ql,int qr){
	if(l==r&&ql<=l&&r<=qr){
		tree[root].val=sqrt(tree[root].val);
		tree[root].mx=sqrt(tree[root].val);
		return;
	}
	int mid=l+(r-l)/2;
	if(mid<ql&&tree[root*2+1].mx>1){
		add(root*2+1,mid+1,r,ql,qr);
	}else if(mid>=qr&&tree[root*2].mx>1){
		add(root*2,l,mid,ql,qr);
	}else if(tree[root*2].mx>1&&tree[root*2+1].mx>1){
		add(root*2,l,mid,ql,mid);
		add(root*2+1,mid+1,r,mid+1,qr);
	}
	exchange(root);
}
ll query(int root,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr){
		return tree[root].val;
	}
	int mid=l+(r-l)/2;
	if(mid<ql){
		return query(root*2+1,mid+1,r,ql,qr);
	}else if(mid>=qr){
		return query(root*2,l,mid,ql,qr);
	}else{
		ll ans1=query(root*2,l,mid,ql,mid);
		ll ans2=query(root*2+1,mid+1,r,mid+1,qr);
		return ans1+ans2;
	}
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	cin>>m;
	while(m--){
		int point;
		cin>>point;
		if(point==0){
			int x,y;
			cin>>x>>y;
			if(x>y)swap(x,y);
			add(1,1,n,x,y);
		}else{
			int x,y;
			cin>>x>>y;
			if(x>y)swap(x,y);
			cout<<query(1,1,n,x,y)<<endl;
		}
	}
// 	fclose(stdin);
//	fclose(stdout);
	return 0;
}

3小时之内给2关,调出即给1关。急!!! 调出后请@楼主,以@楼主的时间为准!

2024/8/3 12:19
加载中...