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 ...
随机推荐
- .NET MAUI 安卓应用开发初体验
一..NET MAUI开发环境搭建&安卓SDK和安卓模拟器安装提示网络连接失败问题解决 引言 本节目标是帮助第一次搭建.NET MAUI开发环境,在下载安卓SDK和安卓模拟器过程中一直提示网络 ...
- 社论 22.10.14 区间在线去重k小
浅谈区间在线去重k小 关于讨论 https://www.luogu.com.cn/discuss/509205 本文将描述一种分块做法以及讨论中提出的各种 \(O(n \ \text{polylog} ...
- Linux创建定时删除日志任务
定时删除3天前的所有日志文件: 1.例:脚本对应的要删除的目录为/home/logs在home目录创建文件clearLogFiles.sh:cd /homevim clearLogFiles.sh写入 ...
- Linux常用软件的安装及Nginx的使用
主要内容: 软件安装方式 上传与下载工具 常用软件的安装--jdk.tomcat.mysql.redis 项目的部署 Nginx的安装 Nginx的功能 静态网站部署 虚拟主机配置及端口绑定 域名绑定 ...
- 【JVM调优】Day03:GC参数、OOM出现方式、调优实战
一.常用GC参数(20个左右即可) 1.各种垃圾回收器的参数 PS + PO 常用的只有几十个 CMS的比较多,不建议使用 G1的常用参数简单 ZGC只有三个参数 二.OOM出现的方式 1.写一个让内 ...
- 【十次方微服务后台开发】Day02:加密与JWT鉴权、微服务注册中心、配置中心、熔断器、网关、消息总线、部署与持续集成、容器管理与监控Rancher、influxDB、grafana
一.密码加密与微服务鉴权JWT 1.BCrypt密码加密 Spring Security 提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用B ...
- 常用内置模块os sys json
今日内容回顾 目录 今日内容回顾 os模块 sys模块 json模块 json模块实战 os模块 sys模块 json模块 os模块 os模块主要与代码运行的操作系统打交道 1.创建目录(文件夹) i ...
- Jenkins&&gitlab
DevOps 强调整个组织的合作以及交付和基础设施变更的自动化 gitlab下载: 下载地址: https://docs.gitlab.com/ee/install/requirements.html ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(37)-掌握Fiddler中Fiddler Script用法,你会有多牛逼-下篇
1.简介 Fiddler是一款强大的HTTP抓包工具,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有 ...
- java初级开发面试题
目录 1.java基础知识 Q1.equals和==的区别 Q2:集合的父类是什么 Q3:List.Hashmap.Set区别 Q4.java数据类型 Q5.javaIO流 Q6.jdk1.8新特性 ...