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

  4
  2
  4
  1
  4

Sample Output

  109

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 [分治]的更多相关文章

  1. [BZOJ3745][COCI2015]Norma[分治]

    题意 题目链接 分析 考虑分治,记当前分治区间为 \(l,r\) . 枚举左端点,然后发现右端点无非三种情况: 极大极小值都在左边; 有一个在左边; 极大极小值都在右边; 考虑递推 \(l\) 的同时 ...

  2. bzoj3745: [Coci2015]Norma 分治,单调队列

    链接 bzoj 思路 首先\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{k=i}^{j}max(a_k)\)可以用单调队列求解.参见 ...

  3. BZOJ3745 / SP22343 NORMA2 - Norma 分治,CDQ分治

    要命的题目. 写法:分类讨论进行计算. 枚举过每一个\(mid\)的所有区间.对于左端点\(i∈[l, mid - 1]\),向左推并计算\([l,mid]\)范围内的最大\(/\)最小值. 然后右端 ...

  4. 『Norma 分治』

    Norma Description Input Format 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output Format 输出答案对10^9取模后的结果. Sample ...

  5. 【CF526F】Pudding Monsters cdq分治

    [CF526F]Pudding Monsters 题意:给你一个排列$p_i$,问你有对少个区间的值域段是连续的. $n\le 3\times 10^5$ 题解:bzoj3745 Norma 的弱化版 ...

  6. 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 ...

  7. 【BZOJ3745】Norma(CDQ分治)

    [BZOJ3745]Norma(CDQ分治) 题面 BZOJ 洛谷 题解 这种问题直接做不好做,显然需要一定的优化.考虑\(CDQ\)分治. 现在唯一需要考虑的就是跨越当前中间节点的所有区间如何计算答 ...

  8. 【BZOJ3745】[Coci2015]Norma cdq分治

    [BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...

  9. BZOJ3745 COCI2015Norma(分治)

    完全想不到地,考虑分治. 对区间[l,r],将左端点x由mid不断左移,右边记录最右的p满足max[mid+1,p]<=max[x,mid],q满足min[mid+1,q]>=min[x, ...

随机推荐

  1. [并查集] How Many Tables

    题目描述 Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants ...

  2. 【leetcode】300.Longest Increasing Subsequence

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  3. Halcon 学习笔记3 仿射变换

    像素的减少 开运算(较少) 腐蚀(去除更多) 对灰度图像的开运算或腐蚀 相当于将灰度图像变暗 像素增加 闭运算(较少) 膨胀(较多) 对灰度图像的闭运算或膨胀 相当于将灰度图像变亮 仿射变换 另外一种 ...

  4. [Git/Github] ubuntu 14.0 下github 配置

    转载自:http://www.faceye.net/search/77573.html 一:创建Repositories1:首先在github下创建一个帐号.这个不用多说,然后创建一个Reposito ...

  5. 第77天:jQuery事件绑定触发

    一.元素操作 1. 高度和宽度 $(“div”).height(); // 高度 $(“div”).width(); // 宽度 .height()方法和.css(“height”)的区别: 返回值不 ...

  6. Codeforces 618D Hamiltonian Spanning Tree(树的最小路径覆盖)

    题意:给出一张完全图,所有的边的边权都是 y,现在给出图的一个生成树,将生成树上的边的边权改为 x,求一条距离最短的哈密顿路径. 先考虑x>=y的情况,那么应该尽量不走生成树上的边,如果生成树上 ...

  7. KMP算法模板(pascal)

    洛谷P3375: program rrr(input,output); var i,j,lena,lenb:longint; a,b:ansistring; next:..]of longint; b ...

  8. 两个list比较相等元素

    1.实现方式 public class list { public static void main(String[] args) { List<String> list1 = new A ...

  9. P1107 [BJWC2008]雷涛的小猫

    题目描述 雷涛同学非常的有爱心,在他的宿舍里,养着一只因为受伤被救助的小猫(当然,这样的行为是违反学生宿舍管理条例的).在他的照顾下,小猫很快恢复了健康,并且愈发的活泼可爱了. 可是有一天,雷涛下课回 ...

  10. oracle获取clob调优

    引用Oracle.DataAccess.dll,,在oracle 安装目录下的D:\oracle\product\10.2.0\db_1\ODP.NET\bin\1.x\Oracle.DataAcce ...