不妨考虑已知一个区间[l,r]的k=1、k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间)

那么如果加入一个新的数字a[i](i = r+1)

则新区间[l, i]的答案为ans + (c+1)*a[i] + s ,c为[l,r]中小于等于a[i]的数的个数,s为大于它的树的和

接下来考虑一个区间组,区间组i表示的是以i为结尾的所有区间

另dp[i]表示[1,i], [2,i] .... [i-1, i],[i, i]这些区间的答案和

那么dp[i+1] = dp[i] + ∑(j*a[j])(if a[j] >= a[i]) + ∑k*a[i](if a[k] < a[i]) + i*a[i]

这样的话,最后只需要把dp[1~n]加起来就构成了答案

上面的值可以使用树状数组或者线段树维护

这里还使用了hashmap来进行离散化

(线段树日常卡常数,优化很久才过)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <ext/hash_map>
#define pb push_back
#define fi first
#define se second
#define mp make_pair
using namespace std;
using namespace __gnu_cxx;
const int maxn = 1e6 + 100;
typedef long long LL;
typedef pair<int, int> PII;
vector<int> V(maxn, 0);
const int MOD = (1e9 + 7) + 0.5;
hash_map <int, int> H;
PII tree[maxn*4];
PII v;
int k, L, R;
inline PII Add(PII a, PII b){return {(a.fi + b.fi)%MOD, (a.se + b.se)%MOD};
}
void Insert(int o, int l, int r){if(l == r){tree[o] = Add(tree[o], {v.fi, (LL)v.fi*v.se%MOD});return;}int mid = (l+r)>>1;if(k <= mid) Insert(o<<1, l, mid);else Insert((o<<1)+1, mid+1, r);tree[o] = Add(tree[o<<1], tree[(o<<1)+1]);
}
PII Query(int o, int l, int r){if(tree[o].fi == 0) return mp(0, 0);if(L <= l && r <= R){return tree[o];}int mid = (l+r)>>1;return Add((L <= mid ? Query(o*2, l, mid) : mp(0, 0)),(R > mid ? Query(o*2+1, mid+1, r) : mp(0, 0)));
}
int a[maxn], A, B, C;
int n;void I_AM_ANGRY(){for(int i = 2; i <= n; i++){a[i] = ((LL)a[i-1]*A + B)%C;V[i] = a[i];}/*for(int i = 2; i <= n; i += 2){a[i] = ((LL)a[i-1]*A + B)%C;a[i+1] = ((LL)a[i]*A + B)%C;V[i] = a[i];V[i+1] = a[i+1];}*//*for(int i = 2; i <= n; i += 4){a[i] = ((LL)a[i-1]*A + B)%C;a[i+1] = ((LL)a[i]*A + B)%C;a[i+2] = ((LL)a[i+1]*A + B)%C;a[i+3] = ((LL)a[i+2]*A + B)%C;V[i] = a[i];V[i+1] = a[i+1];V[i+2] = a[i+2];V[i+3] = a[i+3];}*/V[1] = a[1];
}int main()
{cin>>n>>a[1]>>A>>B>>C;I_AM_ANGRY();sort(V.begin(), V.end());int tot = 0;for(auto x : V) if(!H[x]) H[x] = ++tot;LL dp = a[1], ans = dp;int N = n; n = tot;v = {1, a[1]}; k = H[a[1]];Insert(1, 1, n);for(int i = 2; i <= N; i++){int t = H[a[i]];L = t; R = n;PII x = Query(1, 1, n);dp = (dp + x.se + (LL)(tree[1].fi - x.fi+i)*a[i])%MOD;v = {i, a[i]}; k = t;Insert(1, 1, n);ans += dp;}cout<<(ans%MOD + MOD)%MOD<<endl;return 0;
}

转载于:https://www.cnblogs.com/Saurus/p/6868376.html

51nod 1680区间求和 (dp+树状数组/线段树)相关推荐

  1. D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)

    English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...

  2. 差分+树状数组 线段树【P2357】 守墓人

    题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...

  3. HDU 1556 前缀和 树状数组 线段树

    解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数  对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...

  4. jzoj3854-分组【树状数组,线段树】

    正题 题目链接:https://jzoj.net/senior/#contest/show/2990/2 题目大意 一个小队满足要求 队长的地位最高 所有队员和队长的年龄差不超过kkk 给出nnn个人 ...

  5. POJ2182 HDU2711 Lost Cows【树状数组+线段树】

    Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17113 Accepted: 10664 Descripti ...

  6. P2357 守墓人(树状数组/线段树)

    题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然..... 因为....守墓人 ...

  7. NKOJ 2182 (HEOI 2012) 采花(树状数组/线段树)

    P2182[河北OI 2012 DAY1]采花 问题描述 萧芸斓是Z 国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳 了n 朵花,花有c ...

  8. 甜甜圈(树状数组)(线段树)

    文章目录 1. 树状数组维护 2.线段树维护 题目描述 艾洛喜欢吃甜食,他有n个甜甜圈,现在叠成了两叠(如下图所示),第一叠有 n1n1n1个,第二叠有 n2n2n2个 (n1+n2=n)(n1+n2 ...

  9. 模板三连击:树状数组+线段树+主席树

    没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...

最新文章

  1. Python collections 模块 namedtuple、Counter、defaultdict
  2. c# 非阻塞算法_c#创建非阻塞tcp通信
  3. POJ 3461 还是两种方法
  4. nhibernate入门系列: 使用Criteria载入对象
  5. SAP C4C - the entity BO node XXXX is unknown
  6. 使用Speedment和Spring创建REST API
  7. 教你写Bug,常见的 OOM 异常分析
  8. Paxos Made Simple
  9. java byte 图片浏览器直接显示_在imge控件中直接显示图片(图片是byte[]格式)
  10. Nginx反向代理相关事宜
  11. A Hierarchical Reinforced Sequence Operation Method for Unsupervised Text Style Transfer
  12. 如何批量修改AD用户的Email属性
  13. 用最简单的方式理解和使用ActivityMQ(基础入门)
  14. 决定人生的三种成本:机会成本,沉没成本,边际成本
  15. 计算机cpu任务管理器,任务管理器里CPU使用率过高问题
  16. echarts 全国各省市3D图
  17. java 中Shallow Heap与Retained Heap的区别
  18. 生物信息电脑运行环境搭建-Python R Linux
  19. WSL2 通过 USBIP 连接USB串口设备 JetsonUSB备份刷机
  20. 股市的起源发展和意义

热门文章

  1. 计算机是如何工作的,Java多线程编程
  2. PTA-基础编程题目集-函数题 ……
  3. 虚拟网站禁用php,虚拟主机php程序fsockopen函数被禁用
  4. matlab bdir 排序,Matlab 2020b介绍及下载安装步骤
  5. java ecc signature_如何用python验证android/java的ECC签名
  6. mysql数据库用doc命令_MySQl数据库常用的DOS命令
  7. CentOS7下ab压力测试Nginx和Tomcat
  8. 宅在家里写数据库中函数应用
  9. hihoCoder-1097-最小生成树一·Prim算法 (最小生成树)
  10. python记录(4)- lxml模块创建xml文件