HDU-4037-线段树-区间开根号

区间开根号是不具备整体性的,即和开根号不一定等于开根号的和。但是由于由于在longlong范围内的数开根号7次就会变成一所以我们单点更新也是可以的,剪枝就是如果一个区间的和等于区间的大小就不用再继续向下更新了,实现也简单;
ps:再注意几个坑,每组样例结束要多输出一个空行,and l,r的大小不确定
ac:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double pi = acos(-1);
namespace {
  template <typename T> inline void read(T &x) {
    x = 0; T f = 1;char s = getchar();
    for(; !isdigit(s); s = getchar()) if(s == '-') f = -1;
    for(;  isdigit(s); s = getchar()) x = (x << 3) + (x << 1) + (s ^ 48);
    x *= f;
  }
}
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define _for(n,m,i) for (int i = (n); i < (m); i++)
#define _rep(n,m,i) for (int i = (n); i <= (m); i++)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define lowbit(x) x & (-x)
#define pii pair<int,int>
#define fi first
#define se second
const int N = 1e5+5;
LL T[N<<2];
void push_up(int rt) { 
  T[rt] = T[rt<<1] + T[rt<<1|1];
} 
void build(int rt, int l, int r) {
  if(l == r) { 
    read(T[rt]);
    return ;
  } 
  int mid = l + r >> 1;
  build(lson);build(rson);
  push_up(rt);
} 
void updata(int rt, int l, int r, int L, int R) { 
  if(L <= l && R >= r && T[rt] == r-l+1) return ;
  if(l == r) {
    T[rt] = sqrt(T[rt]);
    return ;
  }
  int mid = l + r >> 1;
  if(L <= mid) updata(lson, L, R);
  if(R >  mid) updata(rson, L, R);
  push_up(rt);
} 
LL qry(int rt, int l, int r, int L, int R) {
  if(L <= l && r <= R) {
    return T[rt];
  }
  int mid = l + r >> 1;
  LL ret = 0;
  if(L <= mid) ret += qry(lson, L, R);
  if(R >  mid) ret += qry(rson, L, R);
  return ret;
}
int main() { 
  int n,m,l,r,op;
  for(int id = 1; cin >> n; id++) {
    printf("Case #%d:\n", id);
    build(1,1,n);
    read(m);
    while(m--) {
      read(op);read(l);read(r);
      if(l > r) swap(l, r);
      if(op) printf("%lld\n", qry(1,1,n,l,r));
      else updata(1,1,n,l,r);
    }
    printf("\n");
  }
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值