bzoj 3745 [Coci2015]Norma——序列分治
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3745
如果分治,就能在本层仅算过 mid 的区间了。
可以从中间到左边地遍历左边,给右边两个指针,表示第一个更新左边造成的最小值/最大值的位置。
两个位置共同的左边可以公式算长度,用左边的最值算;两个位置共同的右边可以预处理,处理出 算上长度(相对mid的)的最值乘积求和 与 不算长度的最值乘积求和(都是前缀),把前者加到答案里,后者乘上左边到mid的长度加到答案里即可;两个位置夹着的位置判断一下可以用左边的最大值还是最小值,所以要预处理右边最大值/最小值的算长度/不算长度前缀和,然后和公共右边一样的处理方法即可。
取模的地方要注意!可能加了一个东西,就不能再+mod、upd( ),而要直接upd( )。
注意把 l-1 位置的各种值赋成0。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=5e5+,mod=1e9;
int n,a[N],ans,s0[N],s1[N],s2[N];//s:可加入ans,相对长度
int ml0[N],ml1[N],ml2[N];//ml:单纯乘积相加
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
void upd(int &x){x-=(x>=mod?mod:);}
ll calc(int a){return (ll)a*(a+)>>1ll;}
int dis(int x,int y){return y-x+;}
void solve(int l,int r)
{
if(l==r)
{
s2[l]=ml2[l]=(ll)a[l]*a[l]%mod;
s1[l]=ml1[l]=s0[l]=ml0[l]=a[l];
s2[l-]=s1[l-]=s0[l-]=ml2[l-]=ml1[l-]=ml0[l-]=;//
ans+=s2[l]; upd(ans);
return;
}
int mid=l+r>>;
solve(l,mid); solve(mid+,r); int lo=a[mid],hi=a[mid],p0=mid+,p1=mid+;
for(int i=mid,cd=;i>=l;i--,cd++)
{
hi=max(hi,a[i]); lo=min(lo,a[i]);
while(a[p0]<=hi&&p0<=r) p0++;
while(a[p1]>=lo&&p1<=r) p1++;
int tl=min(p0,p1)-,tr=max(p0,p1);
// printf("l=%d r=%d hi=%d lo=%d p0=%d p1=%d\n",l,r,hi,lo,p0,p1); int d=dis(mid+,tl);
ans=(ans+( (ll)cd*d+calc(d) )%mod*lo%mod*hi)%mod;
// printf("ans=%d ",ans); ans=(ans+s2[r]-s2[tr-])%mod+mod; upd(ans);
ans=ans+(ll)(ml2[r]-ml2[tr-])*cd%mod;//cd not dis(i,tr-1)
if(ans<) ans+=mod; else upd(ans);//if
// printf("ans=%d ",ans); if(p1<p0)//最小值已更新
{
ans=ans+(ll)hi*(s1[tr-]-s1[tl])%mod;
if(ans<)ans+=mod; else upd(ans);
ans=(ans+(ll)(ml1[tr-]-ml1[tl])*cd%mod*hi%mod);//cd
if(ans<) ans+=mod; else upd(ans);//if
}
if(p0<p1)//最大值已更新
{
// printf("tl=%d tr=%d dis(i,tl)=%d s0[%d]-s0[%d]=%d lo=%d mml=%d\n",
// tl,tr,dis(i,tl),tr-1,tl,s0[tr-1]-s0[tl],lo,ml0[tr-1]-ml0[tl]);
ans=ans+(ll)lo*(s0[tr-]-s0[tl])%mod;
if(ans<)ans+=mod; else upd(ans);
ans=(ans+(ll)(ml0[tr-]-ml0[tl])*cd%mod*lo%mod);
if(ans<) ans+=mod; else upd(ans);//if
}
} hi=lo=a[l];
s2[l]=ml2[l]=(ll)hi*lo%mod; s1[l]=ml1[l]=lo; s0[l]=ml0[l]=hi;
for(int i=l+,d=;i<=r;i++,d++)
{
hi=max(hi,a[i]); lo=min(lo,a[i]);
s2[i]=s2[i-]+(ll)d*hi%mod*lo%mod; upd(s2[i]);
s1[i]=s1[i-]+(ll)d*lo%mod; upd(s1[i]);
s0[i]=s0[i-]+(ll)d*hi%mod; upd(s0[i]); ml2[i]=ml2[i-]+(ll)hi*lo%mod; upd(ml2[i]);
ml1[i]=ml1[i-]+lo; upd(ml1[i]);
ml0[i]=ml0[i-]+hi; upd(ml0[i]);
}
s2[l-]=s1[l-]=s0[l-]=ml2[l-]=ml1[l-]=ml0[l-]=;//
}
int main()
{
n=rdn();
for(int i=;i<=n;i++)a[i]=rdn();
solve(,n);
printf("%d\n",ans);
return ;
}
bzoj 3745 [Coci2015]Norma——序列分治的更多相关文章
- BZOJ 3745: [Coci2015]Norma(分治)
题意 给定一个正整数序列 \(a_1, a_2, \cdots, a_n\) ,求 \[ \sum_{i=1}^{n} \sum_{j=i}^{n} (j - i + 1) \min(a_i,a_{i ...
- bzoj 3745: [Coci2015]Norma【分治】
参考:https://blog.csdn.net/lych_cys/article/details/51203960 真的不擅长这种-- 分治,对于一个(l,r),先递归求出(l,mid),(mid+ ...
- 【刷题】BZOJ 3745 [Coci2015]Norma
Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. Sample Input 4 2 4 1 4 Sam ...
- bzoj 3745: [Coci2015]Norma
Description Solution 考虑分治: 我们要统计跨越 \(mid\) 的区间的贡献 分最大值和最小值所在位置进行讨论: 设左边枚举到了 \(i\),左边 \([i,mid]\) 的最大 ...
- 【BZOJ3745】[Coci2015]Norma cdq分治
[BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- [CF888E] Maximum Subsequence 序列分治
早期作品,不喜轻喷. LG传送门 序列分治板子题. 切这道题用了好长时间,所以想发篇题解作为纪念 . 首先,我们认真观察题目数据(面向数据做题是个好习惯),发现题目的\(n\)竟然只有\(35\),我 ...
- 算法复习——序列分治(ssoj光荣的梦想)
题目: 题目描述 Prince对他在这片大陆上维护的秩序感到满意,于是决定启程离开艾泽拉斯.在他动身之前,Prince决定赋予King_Bette最强大的能量以守护世界.保卫这里的平衡与和谐.在那个时 ...
- [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...
随机推荐
- 深入理解Java中的HashMap的实现原理
HashMap继承自抽象类AbstractMap,抽象类AbstractMap实现了Map接口.关系图例如以下所看到的: Java中的Map<key, value>接口同意我们将一个对象作 ...
- 1、CRM2011编程实战——清空指定页签以下的全部选项,并对页签以下的指定控件进行操作
需求:当页面载入时,"呼叫编号"保持不变,"任务号"自己主动更新."接报时间"和"发生日期"自己主动设置为当天日期和时间 ...
- Odoo HRMS应用简介
Odoo HRMS包含行政管理的大部分功能,包含 部门组织架构 员工清册 岗位规划以及招聘管理 用工合同 考勤管理 休假和加班 费用报销 员工考核 绩效.激励.培训成绩 薪资清册 个角色 角色 ...
- HDOJ1160 Fat Mouse's Speed
FatMouse's Speed pid=1160">http://acm.hdu.edu.cn/showproblem.php?pid=1160 最长递增子序列问题的一个变体.实际上 ...
- 兔子--html,js,php,ASP,ASP.NET,JSP的关系
html是超文本链接语言.是静态的.显示在client.仅仅用HTML做出来的网页是静态网页.没不论什么交互功能. JS是一种基于对象和事件驱动的脚本语言,执行在client.是一种比較简单的编程语言 ...
- python(39)- 网络编程socket练习
基于tcp的套接字实现远程执行命令的操作 #服务端 import socket import subprocess phone=socket.socket(socket.AF_INET,socket. ...
- libraries_v140_x64_py35_1.0.1.tar.bz2 libraries_v120_x64_py27_1.1.0.tar 下载链接以及百度云下载链接
下载链接 wget -c https://github.com/willyd/caffe-builder/releases/download/v1.0.1/libraries_v140_x64_p ...
- Asp.net core 初探
写这篇博客的主要目的是加深自己的印象. 后续每天都会写一些自己的学习心得. Ubuntu :16.04 桌面版 .net core : dotnet-dev-1.0.0-preview2-003121 ...
- properties配置文件读取
1.配置文件test.properties: test_123=admin 注:value 可用单引号,双引号,不用引号修饰 2.工具类PropertiesUtil: package com..... ...
- 目标检测之hough forest---霍夫森林(Hough Forest)目标检测算法
Hough Forest目标检测一种比较时兴的目标检测算法,Juergen Gall在2009的CVPR上提出. Hough Forest听上去像hough变换+Random Forest的结合体, ...