[jzoj]4216.【NOIP2015模拟9.12】平方和

Link

  https://jzoj.net/senior/#main/show/4216

Description

  给出一个N个整数构成的序列,有M次操作,每次操作有一下三种:

  ①Insert Y X,在序列的第Y个数之前插入一个数X;
  ②Add L R X,对序列中第L个数到第R个数,每个数都加上X;
  ③Query L R,询问序列中第L个数到第R个数的平方和。

Solution

  我不会告诉你这道题我打了10000+byte,并且改了2个月,50多个小时,删掉代码重打了5次。这道题用splay来弄是十分简单的一道裸体。但是我这种渣渣只能用可行的线段树。别人一次能打对,我仍要检查许多线段树的细节,并且打了N多个操作。可能是我代码风格不好吧。但为了方便检查也只好这样了。

30分

  显然,暴力去做,可以拿到拿烂的部分分。

50分
  在30分的基础上,数据增大, 但是没有Insert的操作,所以是线段树裸题。

100分

  大佬肯定是一眼切。这是道Splay练手题目,可以看看gmh大神的题解,异常详细。请允许我打个广告。http://blog.csdn.net/gmh77

  Splay以后我会推进并且更改这个博文。现在我只会线段树。

  对于前两个操作,显然就是线段树裸题,毋庸置疑的。

  但是,因为有了Insert操作,导致我们线段树的下标代表的数不一样。既然在线不可以,离线总是可以的。

  ①线段树1(前缀和)维护位置

  在原本序列的第i个数和i-1个数之间(包括i),插入了多少个数。

  最终用线段树1维护了出来之后,我们很容易的知道了原本序列的数他在最终序列的位置。这是值得你思考的地方

  ②线段树2维护最终序列

  我们知道了原本序列每一个数在最终序列对应的位置,那么理所当然地可以再种一棵线段树2来维护插入的数的最终位置。

  一开始把原序列的数,在最终序列对应位置,标记在线段树那个位置上,0表示当前位置不选,反之。这样一个前缀和就知道最终序列第i个位置之前(包括i)一共出现了多少个数。

  那么每次插入一个数,我们二分出一个i,满足i最小,设1~i前缀和为sum。则满足sum=插入在哪个位置之前-1。这个位置,便是你当前插入的数在最终序列的位置。愉快地记录下来。

  前缀和用线段树2维护。

  如果正着做必然会错。倒着做才是对的。这是你值得思考的。

  因为后放的,必然在左边。

  ③线段树3,4,5维护最终序列

  我们可以用正常线段树来做了,因为我们可以通过最终位置来确定其对应的线段树下标。

  但是平方和又是一个棘手的问题。

  分解一下。

  (a+b)²=a²+b²+2ab。

  显然,每次加一个数,b就是这个加的数。

  a²为原本的平方和,故用线段树3来维护他。

  2ab,其中如果有多个a,那么就是2b(a1+a2+a3.....+an),那么维护线段树4维护和即可。

时间: 2024-08-26 20:07:23

[jzoj]4216.【NOIP2015模拟9.12】平方和的相关文章

JZOJ4316【NOIP2015模拟11.5】Isfind 题解

JZOJ4316 [NOIP2015模拟11.5]Isfind 题解 Description Input Output Sample Input 4 3    acbc    abc    cba    cc Sample Output Y    N    Y Data Constraint 思路: 题意要看懂,首先声明一下"子串"和"子序列"的区别,S的"子串"意思是在S中选取任意i个(0 < i <= |S|)连续字符组成的字符串

Cisco PT模拟实验(12) 路由器静态路由的配置

Cisco PT模拟实验(12) 路由器静态路由的配置 实验目的: 掌握静态路由的配置方法和应用 掌握路由选择表中的路由描述 熟悉路由选择和分组转发的原理及过程 实验背景: 某公司除总部外,另有一处分部,并且都有一个独立的局域网,为了使公司各部之间能相互通信,共享资源.每个出口利用一台路由器进行连接,两台路由器间公司申请了一条DDN专线(数字数据网)进行相连,要求做适当配置实现相互访问. 技术原理: 路由器属于网络层设备,能够根据IP数据报的首部信息,选择一条最佳路径(这一过程称为"路由选择&q

JZOJ.5264【NOIP2017模拟8.12】化学

Description Input Output Sample Input 3 10 1 2 10 Sample Output 5 Data Constraint Hint 搜索.考虑到m很大,我们不得不从n下手,但240无法满足要求,我们可以采取折半搜索. 先搜前20个记录所有220的方案情况,再搜索后面20个,把全部方案数分别记录到两个数组里,从小到大排个序,然后用指针维护统计答案就可以了. 因为要两个情况所耗费的体力值不大于m,所以我们可以固定第一个数组的指针i,第二个数组指针j从大到小找

jzoj5142 【NOI2017模拟6.12】看无可看

传送门:https://jzoj.net/senior/#main/show/5142 [题目大意] 给出n个数,a[1]...a[n],称作集合S,求 其中f[i] = 2f[i-1] + 3f[i-2],给出f[0],f[1].mod 99991 n<=100000 [题解] 暴力dp,用矩阵作为存储值,复杂度O(n^2) # include <ctype.h> # include <stdio.h> # include <assert.h> # includ

jzoj5141 【NOI2017模拟6.12】说无可说

传送门:https://jzoj.net/senior/#main/show/5141 [题目大意] 给出n个字符串,求有多少组字符串之间编辑距离为1~8. n<=200,∑|S| <= 10^6 [题解] 首先找编辑距离有一个n^2的dp,由于发现只找小于等于8的,所以搜旁边16个状态即可. 复杂度O(n^2|S| * 16) # include <vector> # include <stdio.h> # include <iostream> # inc

[jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)

题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 我们设$f(x)$表示最小循环节长度为x的合法序列数,那么有$ans=\sum_{d|gcd(n,m)}\frac{1}{d}f(d)$ 这是因为最小循环节为d的序列对应的环会被计算d次,比如 0101,最小循环节长度为 2(循环节为 01),其对应的环会被统计 2 次(序列 0101 与 1010)

模拟1----1/12

A: 答案-3249 求第一个阶乘位数>=10000的正整数 公式:位数=log10(1)+log10(2)+...+log10(n)+1 再取整 举个例子:log(123)=2.08991 取整+1=3: n!=1*2*3*.....*n;    lg(n!)=lg(2)+......lg(n); 1 int main() 2 { 3 double s=0; 4 for(int i=1;;i++){ 5 s+=log10(i); 6 if(int (s+1)>=10000){ 7 cout&

[总结+题解]NOIP2015模拟题2

// 此博文为迁移而来,写于2015年7月22日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w72i.html 1.总结 向总表示今天的题目简单些,恩我觉得我又单纯了.今天的分数略低啊,第三题的动规只有10分,第一题的暴力也TLE了一堆,最后就剩下个150分了. 2.题解 T1 坐船问题(TAG:结论题) 简直就是一道结论题啊!这道题不存在什么算法.最开始想到的是二分图匹配,但是过于繁琐,而且已经证出存在反例.首先

XJOI NOIP2015模拟赛Day1 T2 ctps bitset优化 或 排序+cdq分治+树状数组+平衡树

题意: 4维空间中有1个点集A,|A|=n,用(a,b,c,d)表示每个点. 共有m个询问,每次询问输入一个点(a,b,c,d),求最大的S,其中S={p|p∈A且ap<=a,bp<=b,cp<=c,dp<=d},输出|S| 输入格式: 第一行n 接下来n行有n个4维点对 第n+2行有一个数m 再接下来m行每行有一个四维点对,表示每个询问 输出格式: 对于每个询问输出一个数 **方法:**bitset优化 或 排序+cdq分治+树状数组+平衡树 解析: 神题,考场不会,暴力骗40,