本文共 1960 字,大约阅读时间需要 6 分钟。
题目链接:
题意:
给定n长的序列
以下2个操作
0 x y 给[x,y]区间每一个数都 sqrt
1 x y 问[x, y] 区间和
#include#include #include #include #include #include #include #include using namespace std;#define ll long long#define N 100005#define L(x) tree[x].l#define R(x) tree[x].r#define Lson(x) (x<<1)#define Rson(x) (x<<1|1)#define Num(x) tree[x].num#define Sum(x) tree[x].suminline int Mid(int x, int y){return (x+y)>>1;}struct Subtree{ int l, r; ll num, sum;}tree[N<<2];ll a[N];void push_up(int id){ if(L(id) == R(id))return; Sum(id) = Sum(Lson(id)) + Sum(Rson(id)); if(Num(Lson(id)) <= 1 && Num(Rson(id)) <= 1) Num(id) = 1; else Num(id) = 2;}void build(int l, int r, int id){ L(id) = l; R(id) = r; if(l == r) { Num(id) = Sum(id) = a[l]; return ;} int mid = Mid(l, r); build(l, mid, Lson(id)); build(mid+1, r, Rson(id)); push_up(id);}void updata(int l, int r, int id){ if(L(id) == R(id)) { Sum(id) = Num(id) = (ll)sqrt((double)Sum(id)); return ; } if(l == L(id) && R(id) == r && Num(id) <= 1) return ; int mid = Mid(L(id), R(id)); if(mid < l) updata(l, r, Rson(id)); else if(r <= mid) updata(l, r, Lson(id)); else { updata(l, mid, Lson(id)); updata(mid+1, r, Rson(id)); } push_up(id);}ll query(int l, int r, int id){ if(l == L(id) && R(id) == r) return Sum(id); int mid = Mid(L(id), R(id)); if(mid < l) return query(l, r, Rson(id)); else if(r <= mid) return query(l, r, Lson(id)); else return query(l, mid, Lson(id)) + query(mid+1, r, Rson(id));}int n;void solve(){ int q, op, x, y; for(int i = 1; i <= n; i++)scanf("%lld", &a[i]); build(1, n, 1); scanf("%d",&q); while(q--){ scanf("%d %d %d", &op, &x, &y); if(x > y) swap(x, y); if(op == 0) updata(x, y, 1); else printf("%lld\n", query(x, y, 1)); }}int main(){ int Cas = 1; while(~scanf("%d", &n)){ printf("Case #%d:\n", Cas++); solve(); puts(""); } return 0;}