zoukankan      html  css  js  c++  java
  • BZOJ 3211: 花神游历各国( 线段树 )

    线段树...区间开方...明显是要处理到叶节点的

    之前在CF做过道区间取模...差不多, 只有开方, 那么每个数开方次数也是有限的(0,1时就会停止), 最大的数10^9开方10+次也就不会动了.那么我们线段树多记个max就可以少掉很多不必要的操作 

    --------------------------------------------------------------------------------------------

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iostream>
      
    #define rep(i, n) for(int i = 0; i < n; i++)
    #define M(l, r) (((l) + (r)) >> 1)
    #define clr(x, c) memset(x, c, sizeof(x))
      
    using namespace std;
     
    typedef long long ll;
     
    const int maxn = 100009;
     
    struct Node {
    Node *l, *r;
    int v, mx;
    ll sum;
    Node():mx(0) {
    l = r = NULL;
    }
    inline void update() {
    if(l) {
    mx = max(l->mx, r->mx);
    sum = l->sum + r->sum;
    } else
       sum = mx = v;
    }
    } pool[maxn << 1], *pt = pool, *root;
     
    int L, R, n, seq[maxn];
     
    void build(Node* t, int l, int r) {
    if(r > l) {
    int m = M(l, r);
    build(t->l = pt++, l, m);
    build(t->r = pt++, m + 1, r);
    } else
       t->v = seq[l];
    t->update();
    }
     
    void modify(Node* t, int l, int r) {
    if(t->mx <= 1) return;
    if(l == r)
    t->v = floor(sqrt(t->v));
    else {
    int m = M(l, r);
    if(L <= m) modify(t->l, l, m);
    if(m < R) modify(t->r, m + 1, r);
    }
    t->update();
    }
     
    ll query(Node* t, int l, int r) {
    if(L <= l && r <= R)
       return t->sum;
    int m = M(l, r);
    return (L <= m ? query(t->l, l, m) : 0 ) + (m < R ? query(t->r, m + 1, r) : 0);
     
    int main() {
    // freopen("test.in", "r", stdin);
    cin >> n;
    for(int i = 1; i <= n; i++) 
       scanf("%d", seq + i);
    build(root = pt++, 1, n);
    int m, op;
    cin >> m;
    while(m--) {
    scanf("%d%d%d", &op, &L, &R);
    if(op == 1)
    printf("%lld ", query(root, 1, n));
    else 
       modify(root, 1, n);
    }
    return 0;
    }

    -------------------------------------------------------------------------------------------- 

    3211: 花神游历各国

    Time Limit: 5 Sec  Memory Limit: 128 MB
    Submit: 1414  Solved: 546
    [Submit][Status][Discuss]

    Description

    Input

    Output

    每次x=1时,每行一个整数,表示这次旅行的开心度

    Sample Input

    4

    1 100 5 5

    5

    1 1 2

    2 1 2

    1 1 2

    2 2 3

    1 1 4

    Sample Output

    101

    11

    11

    HINT

    对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9


    Source

  • 相关阅读:
    【转】聚集索引和非聚集索引的区别
    【转】【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
    【转】数据库范式(1NF 2NF 3NF BCNF)详解一
    【转】数据库 无损连接分解
    如何防止被路由器限速如何更改电脑网卡的MAC地址
    BZOJ 1497 最大权闭合图
    POJ 1966 无向图点联通度 最小割
    POJ 1815 最小割
    POJ 2987 最大权闭合图
    POJ 2391 floyd+二分+最大流
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4660935.html
Copyright © 2011-2022 走看看