分治的一道题
来源:互联网 发布:知乎宇宙高维 编辑:程序博客网 时间:2024/05/20 07:51
数据范围 n <= 5e5
分治:
/************************************************************************* > Author: wzw-cnyali > Created Time: 2017/9/11 18:44:56 ************************************************************************/#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;#define REP(i, a, b) for(register int i = (a), i##_end_ = (b); i <= i##_end_; ++ i)#define DREP(i, a, b) for(register int i = (a), i##_end_ = (b); i >= i##_end_; -- i)#define EREP(i, a) for(register int i = (be[a]); i != -1; i = nxt[i])#define mem(a, b) memset((a), b, sizeof(a))template<typename T> inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }template<typename T> inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }char buff[1 << 25], *buf = buff;template <class T>T read(T sum = 0, T fg = 0){while(*buf < '0' || *buf > '9') { fg |= *buf == '-'; buf++; }while(*buf >= '0' && *buf <= '9') { sum = sum * 10 + *buf - '0'; buf++; }return fg ? -sum : sum;}const LL INF = 1e14;const int Size = 500010;const LL mod = 1e9 + 7;int n;LL a[Size];LL mx, mn, ans;LL smax[Size], smin[Size], sum[Size];void solve(int L, int R){if(L == R){(ans += (a[L] * a[L]) % mod) %= mod;return;}LL mid = L + R >> 1;solve(L, mid); solve(mid + 1, R);mx = -INF, mn = INF;REP(i, mid + 1, R){chkmax(mx, a[i]); chkmin(mn, a[i]);smax[i] = (smax[i - 1] + mx) % mod;smin[i] = (smin[i - 1] + mn) % mod;sum[i] = (sum[i - 1] + (mx * mn) % mod) % mod;}mx = -INF, mn = INF;LL rmx = mid + 1, rmn = mid + 1;DREP(i, mid, L){chkmax(mx, a[i]); chkmin(mn, a[i]);for(; rmx <= R && a[rmx] <= mx; ++rmx);for(; rmn <= R && a[rmn] >= mn; ++rmn);LL r1 = min(rmx, rmn), r2 = max(rmx, rmn);(ans += ((mx * mn) % mod * (r1 - mid - 1)) % mod) %= mod;(ans += (sum[R] - sum[r2 - 1] + mod) % mod) %= mod;if(rmx <= rmn) (ans += (mn * (smax[r2 - 1] - smax[r1 - 1])) % mod) %= mod;else (ans += (mx * (smin[r2 - 1] - smin[r1 - 1])) % mod) %= mod;}}int main(){#ifndef ONLINE_JUDGEfreopen("input.in", "r", stdin);freopen("output.out", "w", stdout);#endiffread(buff, 1, 1 << 25, stdin);n = read<int>();REP(i, 1, n) a[i] = read<int>();solve(1, n);printf("%lld\n", (ans + mod) % mod);return 0;}
阅读全文
0 0
- 分治的一道题
- 一道分治题
- 一道奇怪的分治问题
- HDU 3924 Extend-Tree 【一道不错的分治题目】
- 【2015-2】day11 一道点分治的问题
- 一道C的题
- microsoft的一道题
- 指针的一道题
- 解谷歌的一道题
- 一道有趣的题
- 有意思的一道题
- 一道题引发的。。。。。
- JS的一道题
- 视图的一道题
- 面试的一道题
- 一道简单的题
- 华为的一道题
- 基础的一道题
- Mac安装Homebrew和常用brew命令
- 51 nod 1292 字符串中的最大值 V2(后缀数组)
- linux最强大的文件搜索命令--find命令
- poj 1027(开心消消乐 模拟 + 搜索)
- 数据库分页查询
- 分治的一道题
- 最大堆实现堆排序
- 9-13 (图论之手练模板篇,存边小技巧)
- JavaScript初级脚本算法
- Java集合类: Set、List、Map、Queue使用场景梳理
- rm: remove regular file `t1.sh'?
- js计数器问题探究
- 实现u-boot对yaffs/yaffs2文件系统下载的支持
- Google MapReduce 中文版