社区讨论
RE求调
SP2713GSS4 - Can you answer these queries IV参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lop7hra1
- 此快照首次捕获于
- 2023/11/08 11:34 2 年前
- 此快照最后确认于
- 2023/11/08 15:22 2 年前
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100010;
int n,m;
int w[N];
struct SegTree
{
int l,r;//[l,r]
long long sum,maxn;
}tr[N << 2];
//快读
inline void read(int& x)
{
x=0;int f = 1;char c = getchar();
while(!isdigit(c)){if(c == '-')f = -1;c = getchar();}
while(isdigit(c)){x = (x<<1)+(x<<3)+(c^48);c = getchar();}
x*=f;
}
//向上更新回根
void pushup(int u)
{
tr[u].sum = tr[u<<1].sum+tr[u<<1|1].sum;
tr[u].maxn = max(tr[u<<1].maxn,tr[u<<1|1].maxn);
}
//递归建树tr[u]存储[l,r]
void build(int u,int l,int r)
{
if(l == r) tr[u] = {l,r,w[r],w[r]};
else
{
tr[u] = {l,r};
int mid = (l+r)>>1;
//左子树
build(u<<1,l,mid);
//右子树
build(u<<1|1,mid+1,r);
//递归建树区间和要上传到根
pushup(u);
}
}
// void change(int u,int l,int r)
// {
// if(l == r)
// {
// tr[l].sum = sqrt(tr[l].sum);
// return ;
// }
// else
// {
// int mid = (l+r)>>1;
// change(u,l,mid);
// change(u,mid+1,r);
// pushup(u);
// }
// }
//区间修改
void modify(int u,int l,int r)
{
//在当前区间内部
if(tr[u].l == tr[u].r)
{
tr[u].sum = floor(sqrt(tr[u].sum));
tr[u].maxn = floor(sqrt(tr[u].maxn));
}
else
{
int mid = (tr[u].l+tr[u].r)>>1;
//当前区间在左半区间
if(l<=mid && tr[u<<1].maxn>1) modify(u<<1,l,r);
//当前区间在右半区间
if(r>mid && tr[u<<1|1].maxn>1) modify(u<<1|1,l,r);
//向上更新
pushup(u);
}
}
//区间查询
long long query(int u,int l,int r)
{
//就是当前区间
if(tr[u].l>=l && tr[u].r<=r) return tr[u].sum;
int mid = (tr[u].l+tr[u].r) >> 1;
long long sum = 0;
//当前区间在左半区间
if(l<=mid) sum += query(u<<1,l,r);
//当前区间在右半区间
if(r>mid) sum+=query(u<<1|1,l,r);
return sum;
}
signed main()
{
int _case = 0;
while(~scanf("%lld",&n))
{
printf("Case #%lld\n",++_case);
memset(w,0,sizeof(w));
memset(tr,0,sizeof(tr));
read(n);
for(int i=1;i<=n;i++) read(w[i]);
read(m);
build(1,1,n);
int op,l,r;
while(m--)
{
read(op);read(l);read(r);
if(l>r) swap(l,r);
if(op == 0) modify(1,l,r);
else if(op == 1) printf("%lld\n",query(1,l,r));
}
}
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...