JZOJ 4216.平方和
\(\text{Problem}\)
维护一个序列
支持插入一个数,区间加,询问区间平方和
\(\text{Solution}\)
平衡树很模板的题了
考场打 \(fhq-treap\) 毫无悬念过了
读入有负数,快读注意!
打完之后发现有模数?
狂改代码,无脑乱加模,代码直接丑了
\(\text{Code}\)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;
const int N = 1e5, P = 7459;
int n, m, rt;
struct node{
int ls, rs, rnd, sz, val, s1, s2, tg;
}tr[N * 2 + 5];
void read(int &x)
{
x = 0; int f = 1; char ch = getchar();
while (!isdigit(ch)) f = (ch == '-' ? -1 : f), ch = getchar();
while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
x *= f;
}
void update(int p)
{
tr[p].sz = tr[tr[p].ls].sz + tr[tr[p].rs].sz + 1;
tr[p].s1 = (tr[tr[p].ls].s1 + tr[tr[p].rs].s1 + tr[p].val) % P;
tr[p].s2 = (tr[tr[p].ls].s2 + tr[tr[p].rs].s2 + tr[p].val * tr[p].val % P) % P;
}
int new_node(int v)
{
static int tot = 0;
tr[++tot] = node{0, 0, rand(), 1, v, v, v * v % P, 0};
return tot;
}
void pushdown(int p)
{
if (!p || !tr[p].tg) return;
long long v = tr[p].tg;
if (tr[p].ls)
{
tr[tr[p].ls].s2 += v * v % P * tr[tr[p].ls].sz % P + v * 2 * tr[tr[p].ls].s1 % P;
tr[tr[p].ls].s1 += v * tr[tr[p].ls].sz % P, tr[tr[p].ls].tg += v, tr[tr[p].ls].val += v;
tr[tr[p].ls].s2 %= P, tr[tr[p].ls].s1 %= P, tr[tr[p].ls].tg %= P, tr[tr[p].ls].val %= P;
}
if (tr[p].rs)
{
tr[tr[p].rs].s2 += v * v % P * tr[tr[p].rs].sz % P + v * 2 * tr[tr[p].rs].s1 % P;
tr[tr[p].rs].s1 += v * tr[tr[p].rs].sz % P, tr[tr[p].rs].tg += v, tr[tr[p].rs].val += v;
tr[tr[p].rs].s2 %= P, tr[tr[p].rs].s1 %= P, tr[tr[p].rs].tg %= P, tr[tr[p].rs].val %= P;
}
tr[p].tg = 0;
}
void split(int p, int k, int &x, int &y)
{
if (!p) x = y = 0;
else{
pushdown(p);
if (k <= tr[tr[p].ls].sz) y = p, split(tr[p].ls, k, x, tr[p].ls);
else x = p, split(tr[p].rs, k - tr[tr[p].ls].sz - 1, tr[p].rs, y);
update(p);
}
}
int merge(int x, int y)
{
if (!x || !y) return x | y;
pushdown(x), pushdown(y);
if (tr[x].rnd < tr[y].rnd)
{
tr[x].rs = merge(tr[x].rs, y);
update(x); return x;
}
else{
tr[y].ls = merge(x, tr[y].ls);
update(y); return y;
}
}
inline void insert(int x, int y)
{
int a, b;
x = (x + P) % P, split(rt, y - 1, a, b);
rt = merge(merge(a, new_node(x)), b);
}
void add(int l, int r, long long x)
{
int a, b, c, d;
x = (x + P) % P, split(rt, r, a, b), split(a, l - 1, c, d);
tr[d].s2 += x * x % P * tr[d].sz % P + x * 2 * tr[d].s1 % P;
tr[d].s1 += x * tr[d].sz % P, tr[d].tg += x, tr[d].val += x;
tr[d].s2 %= P, tr[d].s1 %= P, tr[d].tg %= P, tr[d].val %= P;
rt = merge(merge(c, d), b);
}
int query(int l, int r)
{
int a, b, c, d;
split(rt, r, a, b), split(a, l - 1, c, d);
int res = tr[d].s2;
rt = merge(merge(c, d), b);
return res;
}
int main()
{
srand(time(0)), read(n);
char op[10]; int l, r, x;
for(int i = 1; i <= n; i++) read(x), insert(x, i);
read(m);
for(int i = 1; i <= m; i++)
{
scanf("%s", op), read(l), read(r);
if (op[0] == 'I') insert(r, l);
else if (op[0] == 'A') read(x), add(l, r, x);
else printf("%d\n", query(l, r));
}
}
JZOJ 4216.平方和的更多相关文章
- [jzoj]4216.【NOIP2015模拟9.12】平方和
Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...
- hdu 2007 - 平方和与立方和
题目大意: 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和. 解答: 坑你没商量!要考虑输入数a,b的大小.如果a>b,需要交换a,b的值. 1: #include<s ...
- HDOJ2007平方和与立方和
平方和与立方和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- Java小例子——穷举质数,求平方和,求质因子。
求平方和 public static void main(String[] args) throws IOException { int n; String s; BufferedReader buf ...
- [OpenJudge] 平方和
平方和 总时间限制: 3000ms 内存限制: 65536kB 描述 给出n(1<=n<=500000)个数字,下标从1开始 执行m(1<=m<=500000)次操作,操作可分 ...
- 练习2 F题 - 平方和与立方和
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 给定一 ...
- 平方和与立方和 AC 杭电
平方和与立方和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 基于visual Studio2013解决C语言竞赛题之1032平方和
题目 解决代码及点评 /* 编程序将一个正整数写成其它两个正整数的平方和,若不能成立时输出"NO".例如 5 = 1^2 + 2^2 , 25 ...
- hdu 4507 数位dp(求和,求平方和)
http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...
- (hdu 简单题 128道)平方和与立方和(求一个区间的立方和和平方和)
题目: 平方和与立方和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
随机推荐
- Python异步爬虫(aiohttp版)
异步协程不太了解的话可以去看我上篇博客:https://www.cnblogs.com/Red-Sun/p/16934843.html PS:本博客是个人笔记分享,不需要扫码加群或必须关注什么的(如果 ...
- http转成https工具类
工具类代码如下: 点击查看代码 package com.astronaut.auction.modules.oss.utils; import org.apache.commons.collectio ...
- week_5
Andrew Ng机器学习笔记---by Orangestar Week_5 重点:反向传播算法,backpropagation 1. Cost Function神经元的代价函数 回顾定义:(上节回顾 ...
- [OpenCV实战]10 使用Hu矩进行形状匹配
目录 1 什么是图像矩? 2 如何计算图像矩 2.1 质心获取 2.2 中心矩 2.3 Hu矩 3 基于Hu矩实现形状匹配 3.1 Hu矩的计算 3.2 基于matchShapes函数计算两个图形之间 ...
- S2-048 CVE-2017-9791 远程命令执行
漏洞名称 S2-048 CVE-2017-9791 远程命令执行 利用条件 Struts 2.3.x 开启Struts 1 plugin and Struts 1 action插件 漏洞原理 漏洞产生 ...
- Java线程诊断
1.诊断CPU占用过高 [root@master ~]# nohup java -jar JvmProject.jar & // 有问题的java程序 [1] 1627 [root@maste ...
- Gvim基础操作(正则表达式)-02
Gvim正则表达式 正则表达式在linux中使用非常广泛.主要是进行一些替换,在编写脚本的时候都会使用到.gvim.perl.sed.tcl中都会使用到. Gvim正则表达式的使用 搜索命令 /正则表 ...
- 洛谷P6599 「EZEC-2」异或【题解】
题目大意 有\(T\)组数据,每组数据给定两个\(l,n\in\mathbb{N*}\),构造一个长为\(l\),每个元素不超过\(n\)的数组 令他为\(a\),要使 \[\sum_{i=1}^l\ ...
- 疯狂吐槽 MAUI 以及 MAUI 入坑知识点
目录 窗口 窗口管理 如何限制一次只能打开一个程序 MAUI 程序安装模式 为 MAUI Blazor 设置语言 坑 ① 坑 ② 坑 ③ 配置 MAUI 项目使用管理员权限启动 问题背景 定制编译过程 ...
- 解析url地址hashhref