不妨考虑已知一个区间[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 + ;
typedef long long LL;
typedef pair<int, int> PII;
vector<int> V(maxn, );
const int MOD = (1e9 + ) + 0.5;
hash_map <int, int> H;
PII tree[maxn*];
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)>>;
if(k <= mid) Insert(o<<, l, mid);
else Insert((o<<)+, mid+, r);
tree[o] = Add(tree[o<<], tree[(o<<)+]);
}
PII Query(int o, int l, int r){
if(tree[o].fi == ) return mp(, );
if(L <= l && r <= R){
return tree[o];
}
int mid = (l+r)>>;
return Add((L <= mid ? Query(o*, l, mid) : mp(, )),
(R > mid ? Query(o*+, mid+, r) : mp(, )));
}
int a[maxn], A, B, C;
int n; void I_AM_ANGRY(){
for(int i = ; i <= n; i++){
a[i] = ((LL)a[i-]*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[] = a[];
} int main()
{
cin>>n>>a[]>>A>>B>>C;
I_AM_ANGRY();
sort(V.begin(), V.end());
int tot = ;
for(auto x : V) if(!H[x]) H[x] = ++tot;
LL dp = a[], ans = dp;
int N = n; n = tot;
v = {, a[]}; k = H[a[]];
Insert(, , n);
for(int i = ; i <= N; i++){
int t = H[a[i]];
L = t; R = n;
PII x = Query(, , n);
dp = (dp + x.se + (LL)(tree[].fi - x.fi+i)*a[i])%MOD;
v = {i, a[i]}; k = t;
Insert(, , n);
ans += dp;
}
cout<<(ans%MOD + MOD)%MOD<<endl;
return ;
}

51nod 1680区间求和 (dp+树状数组/线段树)的更多相关文章

  1. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  2. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  3. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  4. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. HDU 5293 Train chain Problem - 树链剖分(树状数组) + 线段树+ 树型dp

    传送门 题目大意: 一颗n个点的树,给出m条链,第i条链的权值是\(w_i\),可以选择若干条不相交的链,求最大权值和. 题目分析: 树型dp: dp[u][0]表示不经过u节点,其子树的最优值,dp ...

  7. hdu 1166 敌兵布阵——(区间和)树状数组/线段树

    pid=1166">here:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Input 第一行一个整数T.表示有T组数据. 每组数据第一 ...

  8. 区间操作---树状数组&&线段树

    涉及区间操作的一些套路必须要会呀 区间加减为了偷懒能不写线段树so我选择树状数组!! 但是区间乘除,最大值我想了想还是用线段树分块吧. 树状数组: 这里用网上的一张图: 这里灰色数组是原本的数组(a[ ...

  9. 第十四个目标(dp + 树状数组 + 线段树)

    Problem 2236 第十四个目标 Accept: 17    Submit: 35 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

随机推荐

  1. 利用JQUERY实现多个AJAX请求等待

    利用JQUERY实现多个AJAX请求等待 li {list-style-type:decimal;}.wiz-editor-body ol.wiz-list-level2 > li {list- ...

  2. 转:Spring Boot应用中的异常处理

    引自:https://www.cnblogs.com/yangfanexp/p/7616570.html 楼主前几天写了一篇“Java子线程中的异常处理(通用)”文章,介绍了在多线程环境下3种通用的异 ...

  3. mysql创建表时反引号的作用

    试用navicat工具查看现网mysql建表语句时,发现表名和字段名都是反引号引起来的 CREATE TABLE `tab_notice_title_tv` ( `i_id` ) NOT NULL A ...

  4. 【ISIS(中间系统到中间系统)路由链路状态信息协议初识】

    ISIS单区域的基本配置 一:根据项目需求,考虑到组网的规模和条件,部署ISIS单区域的拓扑图如下: 二:配置 1:首先对RTA进行配置,在系统视图创建ISIS进程:进入ISIS配置视图,指定IS的级 ...

  5. php面向对象基础知识整理之类中的属性和方法的使用

    <?php /** * class Index * 类包含什么 * 1.创建类 * 2.类的属性和类中方法 * 3.类中访问修饰符 * 4.类的封装.继承.多态 */ // 创建类,创建的类名是 ...

  6. python中的字符串(str)操作

    字符串是python中数据类型.一般就单引号(‘’)或双引号(“”)引起来的内容就是字符串. 例如:下面两个都是定义字符串 str1 = "hello world" str2 = ...

  7. JavaSE基础复习---1---2018/9/27

    2018/9/27 JavaSE学习笔记-1 目录: Java的起源 Java语言概述 1.Java的起源 现代编程语言的发展,大致可以理解为,机器码语言---汇编语言---C语言---C++语言-- ...

  8. JSOI2018 R1 & 九省联考2018 滚粗记

    在NOIP与PKUWC相继滚粗后,rp守恒定律似乎终于开始起作用了…… (尽管Day2依然滚粗?) Day1: 本着前40min不写代码的准则,先把三道题大致过了一遍,似乎都比较喜闻乐见? T1:对抗 ...

  9. MongoDB从环境搭建到代码编程(Window 环境)

    本人开发环境: window Server 2008 , 64位系统 服务端 MongoDB下载地址:http://www.mongodb.org/downloads  (本人己下好的在百度网盘 : ...

  10. 20145202马超 2006-2007-2 《Java程序设计》第3周学习总结

    20145202马超 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 函数的重载:在同一个类中,允许存在一个以上的同名函数,只要他们的参数数目不同就可以.与返 ...