社区讨论
代码求调 感觉没啥问题
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 条回复,欢迎继续交流。
正在加载回复...