51nod 1680区间求和 (dp+树状数组/线段树)
不妨考虑已知一个区间[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+树状数组/线段树)相关推荐
- D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)
English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...
- 差分+树状数组 线段树【P2357】 守墓人
题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...
- HDU 1556 前缀和 树状数组 线段树
解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数 对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...
- jzoj3854-分组【树状数组,线段树】
正题 题目链接:https://jzoj.net/senior/#contest/show/2990/2 题目大意 一个小队满足要求 队长的地位最高 所有队员和队长的年龄差不超过kkk 给出nnn个人 ...
- POJ2182 HDU2711 Lost Cows【树状数组+线段树】
Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17113 Accepted: 10664 Descripti ...
- P2357 守墓人(树状数组/线段树)
题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然..... 因为....守墓人 ...
- NKOJ 2182 (HEOI 2012) 采花(树状数组/线段树)
P2182[河北OI 2012 DAY1]采花 问题描述 萧芸斓是Z 国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳 了n 朵花,花有c ...
- 甜甜圈(树状数组)(线段树)
文章目录 1. 树状数组维护 2.线段树维护 题目描述 艾洛喜欢吃甜食,他有n个甜甜圈,现在叠成了两叠(如下图所示),第一叠有 n1n1n1个,第二叠有 n2n2n2个 (n1+n2=n)(n1+n2 ...
- 模板三连击:树状数组+线段树+主席树
没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...
最新文章
- Python collections 模块 namedtuple、Counter、defaultdict
- c# 非阻塞算法_c#创建非阻塞tcp通信
- POJ 3461 还是两种方法
- nhibernate入门系列: 使用Criteria载入对象
- SAP C4C - the entity BO node XXXX is unknown
- 使用Speedment和Spring创建REST API
- 教你写Bug,常见的 OOM 异常分析
- Paxos Made Simple
- java byte 图片浏览器直接显示_在imge控件中直接显示图片(图片是byte[]格式)
- Nginx反向代理相关事宜
- A Hierarchical Reinforced Sequence Operation Method for Unsupervised Text Style Transfer
- 如何批量修改AD用户的Email属性
- 用最简单的方式理解和使用ActivityMQ(基础入门)
- 决定人生的三种成本:机会成本,沉没成本,边际成本
- 计算机cpu任务管理器,任务管理器里CPU使用率过高问题
- echarts 全国各省市3D图
- java 中Shallow Heap与Retained Heap的区别
- 生物信息电脑运行环境搭建-Python R Linux
- WSL2 通过 USBIP 连接USB串口设备 JetsonUSB备份刷机
- 股市的起源发展和意义
热门文章
- 计算机是如何工作的,Java多线程编程
- PTA-基础编程题目集-函数题 ……
- 虚拟网站禁用php,虚拟主机php程序fsockopen函数被禁用
- matlab bdir 排序,Matlab 2020b介绍及下载安装步骤
- java ecc signature_如何用python验证android/java的ECC签名
- mysql数据库用doc命令_MySQl数据库常用的DOS命令
- CentOS7下ab压力测试Nginx和Tomcat
- 宅在家里写数据库中函数应用
- hihoCoder-1097-最小生成树一·Prim算法 (最小生成树)
- python记录(4)- lxml模块创建xml文件