题目传送门

sol:可以用线段树来维护,线段树的节点除了标配的$l$和$r$同时记录该区间$link$的个数记为$cnt$,该区间$link$点的和记为$sum$,该区间题目中所谓的能量记为$dis$。然后$cnt$和$sum$就直接两个儿子相加就好,$dis$还要另外加上$segTree[rs].sum * segTree[ls].cnt - segTree[ls].sum * segTree[rs].cnt$这部分。

  • 线段树

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    typedef pair<int, int> PII;
    const int MAXN = 1e5 + ;
    const int MOD = 1e9 + ;
    struct Node {
    int l, r;
    int cnt;
    int sum, dis;
    } segTree[ * MAXN];
    void push_up(int i) {
    int ls = i << , rs = i << | ;
    segTree[i].cnt = segTree[ls].cnt + segTree[rs].cnt;
    segTree[i].sum = (segTree[ls].sum + segTree[rs].sum) % MOD;
    segTree[i].dis = (1LL * segTree[rs].sum * segTree[ls].cnt - 1LL * segTree[ls].sum * segTree[rs].cnt) % MOD;
    segTree[i].dis = (1LL * MOD + segTree[i].dis + segTree[ls].dis + segTree[rs].dis) % MOD;
    }
    void build(int i, int l, int r) {
    segTree[i].l = l;
    segTree[i].r = r;
    if (l == r) {
    int k = getchar() ^ '';
    segTree[i].cnt = k;
    segTree[i].sum = k * l;
    return;
    }
    int mid = l + r >> ;
    build(i << , l, mid);
    build(i << | , mid + , r);
    push_up(i);
    }
    void update(int i, int k, int data) {
    if (segTree[i].l == segTree[i].r) {
    segTree[i].cnt = data;
    segTree[i].sum = data * segTree[i].l;
    return;
    }
    int mid = segTree[i].l + segTree[i].r >> ;
    if (k <= mid) update(i << , k, data);
    else update(i << | , k, data);
    push_up(i);
    }
    int main() {
    int n; scanf("%d%*c", &n);
    build(, , n);
    printf("%d\n", segTree[].dis);
    int q; scanf("%d", &q);
    while (q--) {
    int op, k;
    scanf("%d%d", &op, &k);
    if (op == ) update(, k, );
    else update(, k, );
    printf("%d\n", segTree[].dis);
    }
    return ;
    }

    这个线段树如果要查询某个区间的dis其实不大好写,但是题目中所有的查询都是针对整棵树,也就是segTree[1]。所以省掉了询问函数。

牛客-牛牛的Link Power II的更多相关文章

  1. 2020牛客寒假算法基础集训营3 - G. 牛牛的Link Power II(线段树)

    题目链接:牛牛的Link Power II 题意:给你一个只含$0$和$1$的串,定义串的$Link$值为串中两个的$1$之间的距离的和,$(u,v)$和$(v,u)$被看认为是同一对,有$m$次操作 ...

  2. 2020牛客寒假算法基础集训营3 G.牛牛的Link Power II (树状数组维护前缀和)

    https://ac.nowcoder.com/acm/contest/3004/G 发现每个“1”对于它本身位置产生的影响贡献为0,对前面的“1”有产生贡献,对后面的"1"也产生 ...

  3. 牛客挑战赛 39 牛牛与序列 隔板法 容斥 dp

    LINK:牛牛与序列 (牛客div1的E题怎么这么水... 还没D难. 定义一个序列合法 当且仅当存在一个位置i满足 $a_i>a_,a_j<a_$且对于所有的位置i,$1 \leq a_ ...

  4. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  5. 牛客训练21674——牛牛与LCM

    Problem 链接:https://ac.nowcoder.com/acm/problem/21674 来源:牛客网 牛牛最近在学习初等数论,他的数学老师给他出了一道题,他觉得太简单了, 懒得做,于 ...

  6. 牛牛与后缀表达式_via牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28537/B 来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 262144K,其他语 ...

  7. 牛客多校第九场 && ZOJ3774 The power of Fibonacci(二次剩余定理+斐波那契数列通项/循环节)题解

    题意1.1: 求\(\sum_{i=1}^n Fib^m\mod 1e9+9\),\(n\in[1, 1e9], m\in[1, 1e4]\) 思路1.1 我们首先需要知道斐波那契数列的通项是:\(F ...

  8. 牛客 小a与星际探索 bfs

    链接:https://ac.nowcoder.com/acm/contest/317/C?&headNav=acm来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ ...

  9. 牛客练习赛38 D 出题人的手环

    链接 [https://ac.nowcoder.com/acm/contest/358/D] 题意 链接:https://ac.nowcoder.com/acm/contest/358/D 来源:牛客 ...

随机推荐

  1. 快速幂的类似问题(51Nod 1008 N的阶乘 mod P)

    下面我们来看一个容易让人蒙圈的问题:N的阶乘 mod P. 51Nod 1008 N的阶乘 mod P 看到这个可能有的人会想起快速幂,快速幂是N的M次方 mod P,这里可能你就要说你不会做了,其实 ...

  2. Spring Boot作为Spring Cloud基础设施

    spring cloud包含的核心特性: Distributed/versioned configuration(分布式配置) Service registration and discovery(服 ...

  3. scala通过尾递归解析提取字段信息

    一.背景 获取数据中以“|”作为字段间的分隔符,但个别字段中数据也是以“|”作为分隔符.因此,在字段提取时需要保护数据完整性. 二.实现 1.数据以“|”分隔,可以采用递归方式迭代解析.通过尾递归方式 ...

  4. 18 11 27 高级的服务器连接 epoll

    ---恢复内容开始--- 之前的  http 服务器  都是采用 轮询的方式(就像 厨师挨个问谁饿了好做饭 一样  ) 而  epoll 用着高级的 方式  事件通知 (直接问谁饿了) 同时还和  计 ...

  5. django的model字段在保存的时候做预处理怎么办?

    django的model字段在保存的时候做预处理怎么办? 比如这个model: class Book(Model): publish_date = DateField() 但是在保存时,用户输入数据是 ...

  6. MySQL数据库索引常见问题

    笔者看过很多数据库相关方面的面试题,但大多数答案都不太准确,因此决定在自己blog进行一个总结. Q1:数据库有哪些索引?优缺点是什么? 1.B树索引:大多数数据库采用的索引(innoDB采用的是b+ ...

  7. Java学习十七

    学习内容: 1.Java字符串类 1.在utf-8编码下,每个汉字占三个字节 2.字符串和byte数组之间的相互转换 将字符串转换为byte数组 byte[] arrs = str.getBytes( ...

  8. tensorflow 读取训练集文件 from Hadoop

    1.代码配置 filename_queue = tf.train.string_input_producer([ "hdfs://namenode:8020/path/to/file1.cs ...

  9. String 字符串拼接

    字符串拼接有两个方法 第一中 var sad = "happy" var variable = "you"+sad +"" variable ...

  10. 开始新建AEM站点-周末教程

    Getting Started Developing AEM Sites - WKND Tutorial 开始新建AEM站点-周末教程 The goal for this multi-part tut ...