社区讨论

代码求调 感觉没啥问题

P4145上帝造题的七分钟 2 / 花神游历各国参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo8xn6za
此快照首次捕获于
2023/10/28 02:14
2 年前
此快照最后确认于
2023/10/28 02:14
2 年前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
const int maxn=1e5+5;
using namespace std;
int n,m;
long long a[maxn],t[maxn<<2];
bool tag[maxn<<2];
void pushup(int x){
	t[x]=t[x<<1]+t[x<<1|1];
	if(tag[x<<1]&&tag[x<<1|1])
		tag[x]=1;
}
void build(int l,int r,int x){
	if(l==r){
		t[x]=a[l];
		if(a[l]==1||a[l]==0)
			tag[x]=1;
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,x<<1);
	build(mid+1,r,x<<1|1);
	pushup(x);
}

void update(int ql,int qr,int l,int r,int x){
	//if(ql>r||qr<l)return;
	if(l==r&&ql<=l&&r<=qr){
		t[x]=sqrt(t[x]);
		if(t[x]<=1)
			tag[x]=1;
		return;
	}	
	int mid=(l+r)>>1;
	if(!tag[x<<1]&&ql<=mid)
		update(ql,qr,l,mid,x<<1);
	if(!tag[x<<1|1]&&qr>=mid+1)
		update(ql,qr,mid+1,r,x<<1|1);
	pushup(x);	
}

long long q(int ql,int qr,int l,int r,int x){	
	if(ql>r||qr<r)return 0;
	if(ql<=l&&r<=qr){
		return t[x];
	}
	long long sum=0;
	int mid=(l+r)>>1;
	if(ql<=mid)
		sum+=q(ql,qr,l,mid,x<<1);
	if(qr>=mid+1)
		sum+=q(ql,qr,mid+1,r,x<<1|1);
	return sum;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);	
	scanf("%d",&m);
	build(1,n,1);
	while(m--){
		int op,l,r;
		scanf("%d%d%d",&op,&l,&r);
		if(op==0)update(min(l,r),max(l,r),1,n,1);
		if(op==1)printf("%lld\n",q(min(l,r),max(l,r),1,n,1));
	}
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...