【BZOJ3745】Norma [分治]
Norma
Time Limit: 20 Sec Memory Limit: 64 MB
[Submit][Status][Discuss]
Description

Input
第1行,一个整数N;
第2~n+1行,每行一个整数表示序列a。
Output
输出答案对10^9取模后的结果。
Sample Input
2
4
1
4
Sample Output
HINT
N <= 500000
1 <= a_i <= 10^8
Solution
\begin {align}
&基本思路,考虑分治,统计对于左端点在[L,mid],右端点在[mid+1,R]的区间贡献:\\
\\
&枚举在[L, mid]中的点i,[mid+1,R]中的点a、b,\\
&保证min[i,mid]≤min[mid+1,a]\\
&并且max[i,mid]≥max[mid+1,b] \\
&然后[mid+1,R]就被分成了三部分:[mid+1,a],[a+1,b],[b+1,R],(假设a<b),\\
\\
&我们考虑分别对三个部分计算贡献:(max=max[i,mid], min=min[i,mid])\\
&①.[mid+1,a]:Ans=max*min*\sum_{j=mid+1}^{a}(j-i+1) \\
&②.[a+1,b]:Ans=max*\sum_{j=a+1}^{b}(min[a+1,j]*(j-i+1)) \\
&③.[b+1,R]:Ans=\sum_{j=b+1}^{R}( max[b+1,j]*min[b+1,j]*(j-i+1)) \\
\\
&这时候,显然①可求了。我们继续推导(把(j-i+1)拆开),显然有:\\
&②=max*\sum_{j=a+1}^{b}min[a+1,j]*j-max*\sum_{j=a+1}^{b}min[a+1,j]*(i-1)\\
&③=\sum_{j=b+1}^{R}max[b+1,j]*min[b+1,j]*j-\sum_{j=b+1}^{R}max[b+1,j]*min[b+1,j]*(i-1)\\
\\
&显然此时②中的\sum_{j=a+1}^{b}min[a+1,j]*j、\sum_{j=a+1}^{b}min[a+1,j]是可以O(len)预处理的,\\
&③中的\sum_{j=b+1}^{R}max[b+1,j]*min[b+1,j]*j、\sum_{j=b+1}^{R}max[b+1,j]*min[b+1,j]也可以O(len)预处理。\\
\\
&显然,若b<a类似。所以我们分治一下即可。\\
\\
&\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:——BearChild
\end {align}
BZOJ3745.md

Code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long s64; const int ONE = ;
const int MOD = 1e9;
const int INF = ; int get()
{
int res = , Q = ; char c;
while( (c = getchar()) < || c > )
if(c == '-') Q = -;
if(Q) res = c - ;
while( (c = getchar()) >= && c <= )
res = res * + c - ;
return res * Q;
} int n;
int val[ONE];
int Ans; void Modit(int &a)
{
if(a < ) a += MOD;
if(a >= MOD) a -= MOD;
} struct power
{
int Min, MinI;
int Max, MaxI;
int MinMax, MinMaxI; friend power operator -(power a, power b)
{
power c;
Modit(c.Min = a.Min - b.Min),
Modit(c.MinI = a.MinI - b.MinI),
Modit(c.Max = a.Max - b.Max),
Modit(c.MaxI = a.MaxI - b.MaxI),
Modit(c.MinMax = a.MinMax - b.MinMax),
Modit(c.MinMaxI = a.MinMaxI - b.MinMaxI);
return c;
}
}A[ONE]; int Sum(int a, int b)
{
return (s64)(a + b) * (b - a + ) / % MOD;
} void Solve(int L, int R)
{
if(L == R)
{
Modit(Ans += (s64)val[L] * val[R] % MOD * );
return;
} int mid = L + R >> ; int minn = INF, maxx = -INF;
A[mid] = (power){, , , , , }; for(int j = mid + ; j <= R; j++)
{
minn = min(minn, val[j]), maxx = max(maxx, val[j]),
Modit(A[j].Min = A[j - ].Min + minn),
Modit(A[j].MinI = A[j - ].MinI + (s64)minn * j % MOD),
Modit(A[j].Max = A[j - ].Max + maxx),
Modit(A[j].MaxI = A[j - ].MaxI + (s64)maxx * j % MOD),
Modit(A[j].MinMax = A[j - ].MinMax + (s64)minn * maxx % MOD),
Modit(A[j].MinMaxI = A[j - ].MinMaxI + (s64)minn * maxx % MOD * j % MOD);
} minn = INF, maxx = -INF;
int a = mid, b = mid;
power del; for(int i = mid; i >= L; i--)
{
minn = min(minn, val[i]), maxx = max(maxx, val[i]);
while(minn <= val[a + ] && a + <= R) a++;
while(maxx >= val[b + ] && b + <= R) b++;
if(a <= b)
{
Modit(Ans += (s64)maxx * minn % MOD * Sum(mid + - i + , a - i + ) % MOD);
del = A[b] - A[a];
Modit(Ans += (s64)maxx * del.MinI % MOD - (s64)maxx * del.Min % MOD * (i - ) % MOD);
del = A[R] - A[b];
Modit(Ans += (s64)del.MinMaxI - (s64)del.MinMax * (i - ) % MOD);
}
else
{
Modit(Ans += (s64)maxx * minn % MOD * Sum(mid + - i + , b - i + ) % MOD);
del = A[a] - A[b];
Modit(Ans += (s64)minn * del.MaxI % MOD - (s64)minn * del.Max % MOD * (i - ) % MOD);
del = A[R] - A[a];
Modit(Ans += (s64)del.MinMaxI - (s64)del.MinMax * (i - ) % MOD);
}
} Solve(L, mid), Solve(mid + , R); } int main()
{
n = get();
for(int i = ; i <= n; i++)
val[i] = get();
Solve(, n);
printf("%d", Ans);
}
【BZOJ3745】Norma [分治]的更多相关文章
- [BZOJ3745][COCI2015]Norma[分治]
题意 题目链接 分析 考虑分治,记当前分治区间为 \(l,r\) . 枚举左端点,然后发现右端点无非三种情况: 极大极小值都在左边; 有一个在左边; 极大极小值都在右边; 考虑递推 \(l\) 的同时 ...
- bzoj3745: [Coci2015]Norma 分治,单调队列
链接 bzoj 思路 首先\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{k=i}^{j}max(a_k)\)可以用单调队列求解.参见 ...
- BZOJ3745 / SP22343 NORMA2 - Norma 分治,CDQ分治
要命的题目. 写法:分类讨论进行计算. 枚举过每一个\(mid\)的所有区间.对于左端点\(i∈[l, mid - 1]\),向左推并计算\([l,mid]\)范围内的最大\(/\)最小值. 然后右端 ...
- 『Norma 分治』
Norma Description Input Format 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output Format 输出答案对10^9取模后的结果. Sample ...
- 【CF526F】Pudding Monsters cdq分治
[CF526F]Pudding Monsters 题意:给你一个排列$p_i$,问你有对少个区间的值域段是连续的. $n\le 3\times 10^5$ 题解:bzoj3745 Norma 的弱化版 ...
- PKUSC2018训练日程(4.18~5.30)
(总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...
- 【BZOJ3745】Norma(CDQ分治)
[BZOJ3745]Norma(CDQ分治) 题面 BZOJ 洛谷 题解 这种问题直接做不好做,显然需要一定的优化.考虑\(CDQ\)分治. 现在唯一需要考虑的就是跨越当前中间节点的所有区间如何计算答 ...
- 【BZOJ3745】[Coci2015]Norma cdq分治
[BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...
- BZOJ3745 COCI2015Norma(分治)
完全想不到地,考虑分治. 对区间[l,r],将左端点x由mid不断左移,右边记录最右的p满足max[mid+1,p]<=max[x,mid],q满足min[mid+1,q]>=min[x, ...
随机推荐
- HTML5+规范:Webview的使用详解
一.知识点 Webview模块管理应用窗口界面,实现多窗口的逻辑控制管理操作.通过plus.webview可获取应用界面管理对象. 1.方法 1.1.all: 获取所有Webview窗口 Array[ ...
- 《剑指offer》--- 两个链表的第一个公共结点
本文算法使用python3实现 1. 问题 输入两个链表,找出它们的第一个公共结点. 时间限制:1s:空间限制:32768K 2 思路描述 使用两个指针 $ p1,p2 $ 分别指向两个链 ...
- IP ,路由
ifconfig 命令 ip信息 enp0s3: flags=4163<UP(已经启用),BROADCAST(支持广播),RUNNING,MULTICAST(支持多播)> ...
- 3dContactPointAnnotationTool开发日志(三三)
添加背景图片后发现Runtime Transform Gizmo无法选中物体了: 于是改了一下EditorObjectSelection.cs中的WereAnyUIElementsHovere ...
- javascript 常用知识点
1:浏览器是有缓存的,开发中可以通过快捷键绕过缓存 对于Windows驱动的系统:Ctrl + F5 对于Mac驱动的系统:Command + Shift + R. 2:精度问题 (符点和大数字可能会 ...
- IIS部署时failed to execute url 解决方法
web.config中增加如下节点: <system.webServer> <validation validateIntegratedModeConfiguration=&quo ...
- HDU4747——2013 ACM/ICPC Asia Regional Hangzhou Online
啦啦啦. 这是杭州网赛的一个题目,当时没做出来,当然这个想法确实比较难想到. 题目质量很高,这个题目也很特别,以前都没做过类似的题目.让我又一次体验了线段树的强大力量. 题目的意思是给你n个数a1-a ...
- AFNetworking你最最最起码要知道的基本使用~
AFNetworking是一个在iOS开发中,使用非常多的一个开源库 适用于iOS以及Mac OS X, 它构建于在(Apple iOS开发文档)NSURLConnection, NSOperatio ...
- 后缀树的线性在线构建-Ukkonen算法
Ukkonen算法是一个非常直观的算法,其思想精妙之处在于不断加字符的过程中,用字符串上的一段区间来表示一条边,并且自动扩展,在需要的时候把边分裂.使用这个算法的好处在于它非常好写,代码很短,并且它是 ...
- 转:机器学习 规则化和模型选择(Regularization and model selection)
规则化和模型选择(Regularization and model selection) 转:http://www.cnblogs.com/jerrylead/archive/2011/03/27/1 ...