不妨考虑已知一个区间[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. Mysql基础1-基础语法-字段类型

    主要: 基础 字段类型 基础 基本概念 1) 数据库分类 层次数据库,网状数据库,关系数据库 常见:SQL Server, Oracle,infomix,sybase,ibmDB2,Mysql 2)数 ...

  2. python应用:爬虫实例(静态网页)

    爬取起点中文网某本小说实例: # -*-coding:utf8-*- import requests import urllib import urllib2 from bs4 import Beau ...

  3. java元注解(注解在注解上的注解)

    //ElementType.TYPE 给类.接口.枚举上使用 @Target(ElementType.TYPE)//给注解进行注解,表示该注解可以用在什么地方 //@Retention(Retenti ...

  4. go学习笔记-结构体

    结构体 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 定义 格式 type struct_variable_type struct { member definition; member ...

  5. 牛客网暑期ACM多校训练营(第四场) F

    参考:http://www.cnblogs.com/Jadon97/p/9383027.html #include <iostream> #include <cstdio> # ...

  6. docker学习(一) 安装

    一.什么是docker 参见https://baike.baidu.com/item/Docker/13344470?fr=aladdin 个人的理解是,通俗来说,就是相当于一个方便携带且个体独立的虚 ...

  7. struts2官方 中文教程 系列十二:控制标签

    介绍 struts2有一些控制语句的标签,本教程中我们将讨论如何使用 if 和iterator 标签.更多的控制标签可以参见 tags reference. 到此我们新建一个struts2 web 项 ...

  8. LeetCode:7. Reverse Integer(Easy)

    题目要求:将给出的整数进行逆序输出 注意:整数的最大范围-2147483648-2147483647,当翻转后的数超出范围后返回0 思路:对给出的整数除以10,取余和取整:然后对取整部分继续取余和取整 ...

  9. SharePoint2013修复报错

         今天项目组的Sharepoint2013不小心被卸载了,本想着直接修复,谁知道在修复的时候一直报错,说找不到什么文件.报的就是类似于这样的错误: Product: ######### -- ...

  10. 零基础学习Vim编辑器

    **********************************************************************0.这篇教程的简介:Vim是Linux/Unix下的经典编辑 ...