社区讨论
分块WA求条QWQ,P4145能过
SP2713GSS4 - Can you answer these queries IV参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m486jod2
- 此快照首次捕获于
- 2024/12/03 16:11 去年
- 此快照最后确认于
- 2025/11/04 13:25 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define L (in[r] - 1) * len + 1
#define R (in[l]) * len
inline int read(){
int x = 0, f = 1; char c = getchar();
while(c < '0' || c > '9'){ if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9'){ x = x * 10 + c - '0' ;c = getchar();}
return x * f;
}
const int N = 1e5 + 5;
int n, q;
int in[N], a[N], sum[N], lin[N], rin[N];
signed main()
{
while(cin >> n) {
int len = sqrt(n) + 1;
for(int i = 1; i <= n; i ++) sum[i] = 0;
for(int i = 1; i <= n; i ++) a[i] = read();
for(int i = 1; i <= n; i ++) in[i] = (len + i - 1) / len;
for(int i = 1; i <= in[n]; i ++) lin[i] = (i - 1) * len + 1, rin[i] = i * len;
int q = read();
rin[in[n]] = n;
for(int i = 1; i <= n; i ++) sum[in[i]] += a[i];
for(int i = 1; i <= q; i ++){
int op = read(), l = read(), r = read();
if(l > r) swap(l, r);
if(!op){
if(in[l] == in[r]){
for(int i = l; i <= r; i ++){
sum[in[i]] -= a[i];
a[i] = sqrt(a[i]);
sum[in[i]] += a[i];
}
continue;
}
for(int i = l; i <= R; i ++){
sum[in[i]] -= a[i];
a[i] = sqrt(a[i]);
sum[in[i]] += a[i];
}
for(int i = L; i <= r; i ++){
sum[in[i]] -= a[i];
a[i] = sqrt(a[i]);
sum[in[i]] += a[i];
}
for(int i = in[l] + 1; i < in[r]; i ++){
if(sum[i] == len) continue;
else{
for(int j = lin[i]; j <= rin[i]; j ++){
sum[in[j]] -= a[j];
a[j] = sqrt(a[j]);
sum[in[j]] += a[j];
}
}
}
}else{
long long ans = 0;
if(in[l] == in[r]){
for(int i = l; i <= r; i ++) ans += a[i];
printf("%lld\n", ans);
continue;
}
for(int i = l; i <= R; i ++) ans += a[i];
for(int i = L; i <= r; i ++) ans += a[i];
for(int i = in[l] + 1; i < in[r]; i ++) ans += sum[i];
printf("%lld\n", ans);
}
}
}
return 0;
}
多测清空了,l > r 也判断了qwq
回复
共 2 条回复,欢迎继续交流。
正在加载回复...