需要一个带有lazytag的线段树,维护一下区间和,和区间平方和。对于每一次加x的操作,假设原区间平方和是 ,对于加完x后的操作后, 原序列变为

拆开后合并同类项,我们可以根据最后一个式子来区间维护这个区间平方和。

ACcode

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
const int N = 1e6 + 250;
const int mod = 1e9 + 7;
int a[N];
int n, m;
struct node
{int l, r;int lz;int sum;int v;
} t[N * 4];
void pushup(int p)
{t[p].sum = (t[p << 1].sum % mod + t[p << 1 | 1].sum % mod) % mod;t[p].v = (t[p << 1].v % mod + t[p << 1 | 1].v % mod) % mod;
}void pushdown(int p)
{if (t[p].lz != 0){int tt = t[p].lz%mod;t[p << 1].lz = (t[p << 1].lz + t[p].lz) % mod;t[p << 1 | 1].lz = (t[p << 1 | 1].lz + t[p].lz) % mod;t[p << 1].v = (t[p << 1].v % mod + 2ll * tt % mod * t[p << 1].sum % mod + (t[p << 1].r - t[p << 1].l + 1ll) * tt % mod * tt % mod+mod) % mod;t[p << 1 | 1].v = (t[p << 1 | 1].v % mod + 2ll * tt % mod * t[p << 1 | 1].sum % mod + (t[p << 1 | 1].r - t[p << 1 | 1].l + 1) * tt % mod * tt % mod+mod) % mod;t[p << 1].sum = (t[p << 1].sum % mod + tt * (t[p << 1].r - t[p << 1].l + 1) % mod+mod) % mod;t[p << 1 | 1].sum = (t[p << 1 | 1].sum % mod + tt * (t[p << 1 | 1].r - t[p << 1 | 1].l + 1ll) % mod+mod) % mod;t[p].lz = 0;}
}void build(int p, int l, int r)
{t[p] = {l, r, 0, 0, 0};if (l == r){t[p].sum = a[l] % mod;t[p].v = a[l] * a[l] % mod;return;}int mid = l + r >> 1;build(p << 1, l, mid);build(p << 1 | 1, mid + 1, r);pushup(p);
}void modify(int p, int l, int r, int x)
{if (t[p].l >= l && t[p].r <= r){t[p].v = (t[p].v % mod + 2ll * x * t[p].sum % mod + (t[p].r - t[p].l + 1ll) * x % mod * x % mod) % mod;t[p].sum = (t[p].sum % mod + (t[p].r - t[p].l + 1ll) * x % mod) % mod;t[p].lz = (t[p].lz % mod + x % mod) % mod;return;}pushdown(p);if (t[p << 1].r >= l)modify(p << 1, l, r, x);if (t[p << 1 | 1].l <= r)modify(p << 1 | 1, l, r, x);pushup(p);
}
int query(int p, int l, int r)
{if (t[p].l >= l && t[p].r <= r){return t[p].v % mod;}pushdown(p);int res = 0;if (t[p << 1].r >= l)res = (res % mod + query(p << 1, l, r) % mod+mod) % mod;if (t[p << 1 | 1].l <= r)res = (res % mod + query(p << 1 | 1, l, r) % mod+mod) % mod;pushup(p);return res % mod;
}void solve()
{cin >> n >> m;for (int i = 1; i <= n; i++){cin >> a[i];a[i] % mod;}build(1, 1, n);while (m--){char op[10];cin >> op;if (op[0] == 'u'){int l, r, x;cin >> l >> r >> x;modify(1, l, r, x);}else{int l, r;cin >> l >> r;cout << (query(1, l, r)%mod+mod)%mod << endl;}}
}signed main(void)
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);solve();return 0;
}

K - Krystalova‘s Trivial Problem (lazytag线段树)相关推荐

  1. 2022 ICPC Gran Premio de Mexico 2da Fecha Final standings - K. Krystalova‘s Trivial Problem

    K. Krystalova's Trivial Problem time limit per test1 second memory limit per test256 megabytes input ...

  2. 切题 (problem)(线段树+最大流最小割)

    切题 problem description solution code description 在一个神秘的 JOSLFN 上,wzy 和 lqs2015 常年占据着切题榜的 rk1 和 rk2.现 ...

  3. CF903G-Yet Another Maxflow Problem【线段树,最大流】

    正题 题目链接:https://www.luogu.com.cn/problem/CF903G 题目大意 有nnn个AAA点,nnn个BBB点,第Ai→Ai+1A_i\rightarrow A_{i+ ...

  4. 【XSY2720】区间第k小 整体二分 可持久化线段树

    题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...

  5. 【BZOJ3110】【codevs1616】K大数查询,权值线段树套普通线段树

    Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门1 传送门2 思路: 之前没怎么接触过权值线段树(非主席树),这次就当学习了一下吧.一开始还把题意理解错了,我的 ...

  6. 吉首大学校赛 K 白山茶与红玫瑰 (线段树区间操作)

    链接:https://ac.nowcoder.com/acm/contest/925/K 来源:牛客网 题目描述 公元2019年6月22日,白山茶王国与红玫瑰王国展开大战,在世外仙境--天空花园处,双 ...

  7. 【HDU - 5475】An easy problem(线段树,思维)

    题干: One day, a useless calculator was being built by Kuros. Let's assume that number X is showed on ...

  8. B - Bin Packing Problem (线段树+multiset)

    第一个算法用线段树来进行快速查询第一个可以装下item的bin 第二个算法用multiset的二分快速找到能装下item的最小的bin(也就是lower_bound()) 线段树可以对无序的序列实现快 ...

  9. 第K小数-可持续优化结构线段树-主席树

    给定长度为N的整数序列A,下标为 1∼N1∼N. 现在要执行M次操作,其中第i次操作为给出三个整数li,ri,kili,ri,ki,求A[lili],A[lili+1],-,A[ri]ri中第kiki ...

最新文章

  1. Ali RocketMQ与Kafka对照
  2. 【Manning新书】可解释人工智能: 构建可解释机器学习系统
  3. ajax is failed怎么办,我在AJAX中遇到了问题
  4. Linux-Ubuntu Server 16.04安装JDK以及配置JDK环境变量
  5. (原创)VS2017 C# 运行 Javasrcipt RSA 加密用户名登录 Java开发的服务器
  6. 备份恢复:如何让xtrabackup恢复速度提升20倍?
  7. python做简单温度转华氏_python温度转换华氏温度实现代码
  8. 电子通讯录(文件保存版)
  9. 使用esp32 作为蓝牙鼠标和键盘以及坑
  10. Python 已知三角形三边求三角形面积
  11. 随笔(面试相关)(杂)
  12. Tomcat8安装后tomcat8w.exe点击出现“指定的服务未安装”解决方案
  13. 树莓派初体验usb摄像头
  14. 网站流量UV是什么意思?什么是流量UV?
  15. 我的世界整合包内自带服务器,我的世界服务器整合包怎么用
  16. 总结下自己的入门学黑之路
  17. Lip Reading Sentences in the Wild(2017)
  18. 精妙SQL语句(转载)
  19. 高等数学_第一类第二类曲线积分(基本)
  20. echarts默认不显示部分折线,鼠标移动点击显示

热门文章

  1. sql实现手机号正则验证
  2. P2V、V2V迁移总结
  3. wave读取wav文件_什么是WAV和WAVE文件(以及如何打开它们)?
  4. html怎么获取最近几天天气预报,获取全国各地 近7天天气预报 示例源码
  5. @Conditional注解详解
  6. mysql 查询字段加密 - 对手机号、身份证号 查询结果 用****加密代替
  7. UVM入门与进阶学习笔记4——UVM仿真的开始与结束
  8. 旅游心得Traveling Experience
  9. coverage 测试代码覆盖率
  10. 斑马问题答案C语言,斑马题库网