1 条题解
-
0
区间更新改为区间每个点都改一次,属于是负优化了,能过就行
#include<bits/stdc++.h> #define ULL unsigned long long #define LL long long #define endl '\n' #define debug(a) cout<<#a<<"="<<a<<endl; #define all(v) v.begin(), v.end() #define PII pair<int,int> using namespace std; const int N = 1 *1e6 + 10,M = 5 * 1e3 + 10,inf = 0x3f3f3f3f; int n,m; int a[N]; struct node { int l,r; LL sum,maxx; }tr[N*4]; void pushup(int u) //从子节点更新父节点信息 { tr[u].sum = tr[u<<1].sum + tr[u<<1|1].sum; tr[u].maxx = max(tr[u<<1].maxx,tr[u<<1|1].maxx); } void build(int u,int l,int r) { if(l==r) tr[u] = {l,r,a[r],a[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 modify(int u,int l,int r) { if(tr[u].l==tr[u].r) //每个点都改 { tr[u].sum = sqrt(tr[u].sum); tr[u].maxx = sqrt(tr[u].maxx); } else { int mid = tr[u].l + tr[u].r >> 1; // 区间内最大值大于1就继续暴力开根号 if(l <= mid && tr[u<<1].maxx > 1) modify(u<<1,l,r); if(r > mid && tr[u<<1|1].maxx > 1) modify(u<<1|1,l,r); pushup(u); } } LL 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; LL res = 0; if(l <= mid) res = query(u<<1,l,r); if(r > mid) res += query(u<<1|1,l,r); return res; } void solve() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; build(1,1,n); cin>>m; while (m--) { int op,l,r; cin>>op>>l>>r; if(op==1) cout<<query(1,l,r)<<endl; else modify(1,l,r); } } int main() { ios::sync_with_stdio(0);cin.tie(nullptr),cout.tie(nullptr); int _=1; // cin>>_; while(_--) { solve(); } return 0; } /** * author: Nijika_jia * created: 2024.10.17 16:31:13 */
- 1
信息
- ID
- 2710
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 5
- 已通过
- 2
- 上传者