EZOJ #77
分析
一个比较神奇的思路
我们考虑分治,对于每一个区间[le,ri]我们计算这个区间中左端点属于[le,mid],右端点属于[mid+1,ri]的情况对答案的贡献
我们求左半个区间的最大最小值的后缀信息以及右半个区间的最大最小值的前缀信息
于是我们发现在左半面最大值越来越小、最小值越来越大,右半面反之
于是我们枚举左端点,并由这个点i找到它在右半个区间对应的p和q
p表示右面最靠左的大于premax[i]的点,q表示右面最靠左的小于premin[i]的点
然后我们分p<=q和p>q两种情况统计答案即可
注意为了方便起见我们提前处理右半个区间最大值、最小值、最大值乘最小值这三个值的前缀和信息
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const int mod = ;
int n,a[],premin[],surmin[],premax[],surmax[],Ans;
int s1[],s2[],s3[];
inline void go(int le,int ri){
if(le==ri){
Ans=(Ans+(long long)a[le]*a[le]%mod)%mod;
return;
}
int i,mid=(le+ri)>>,p=mid+,q=mid+;
premin[mid]=premax[mid]=surmin[mid]=surmax[mid]=a[mid];
for(i=mid-;i>=le;i--){
premin[i]=min(premin[i+],a[i]);
premax[i]=max(premax[i+],a[i]);
}
for(i=mid+;i<=ri;i++){
surmin[i]=min(surmin[i-],a[i]);
surmax[i]=max(surmax[i-],a[i]);
}
s1[mid]=s2[mid]=s3[mid]=;
for(i=mid+;i<=ri;i++){
s1[i]=(s1[i-]+surmax[i])%mod;
s2[i]=(s2[i-]+surmin[i])%mod;
s3[i]=(s3[i-]+(long long)surmin[i]*surmax[i]%mod)%mod;
}
for(i=mid;i>=le;i--){
while(surmax[p]<premax[i]&&p<=ri)p++;
while(surmin[q]>premin[i]&&q<=ri)q++;
int tot=;
if(p<=q){
tot=(long long)(p-mid-)*premin[i]%mod*premax[i]%mod;
tot=(tot+(long long)premin[i]*((s1[q-]-s1[p-])%mod+mod)%mod)%mod;
tot=(tot+((s3[ri]-s3[q-])%mod+mod)%mod)%mod;
}else {
tot=(long long)(q-mid-)*premin[i]%mod*premax[i]%mod;
tot=(tot+(long long)premax[i]*((s2[p-]-s2[q-])%mod+mod)%mod)%mod;
tot=(tot+((s3[ri]-s3[p-])%mod+mod)%mod)%mod;
}
Ans=(Ans+tot)%mod;
}
go(le,mid),go(mid+,ri);
return;
}
int main(){
int i,j,k;
scanf("%d",&n);
for(i=;i<=n;i++)scanf("%d",&a[i]);
go(,n);
printf("%d\n",Ans);
return ;
}
EZOJ #77的更多相关文章
- window 10 用composer安装 基于 Laravel 5.3 的 Coaster CMS Curl错误77解决
安装教程来自 http://laravelacademy.org/post/6547.html 1.系统环境windows 10 nodejs3.9.2 composer1.2.4(国内镜像) Cmd ...
- [stm32] 一个简单的stm32vet6驱动的天马4线SPI-1.77寸LCD彩屏DEMO
书接上文<1.一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO> 我们发现用16MHz晶振的nRF51822驱动1.77寸的spi速度达不到要求 本节主要采用7 ...
- [nRF51822] 1、一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO
最近用nRF51822写了个天马4线SPI的1.77寸LCD彩屏驱动,效果如下: 屏幕的规格资料为:http://pan.baidu.com/s/1gdfkr5L 屏幕的驱动资料为:http://pa ...
- 【hiho一下第77周】递归-减而治之 (MS面试题:Koch Snowflake)
本题是一道微软面试题,看起来复杂,解出来会发现其实是一个很简单的递归问题,但是这道题的递归思路是很值得我们反复推敲的. 原题为hihocoder第77周的题目. 描述 Koch Snowflake i ...
- NYOJ题目77开灯问题
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsUAAAHXCAIAAADbX7BCAAAgAElEQVR4nO3dvVLrSMAm4L0Jci6E2B
- LeetCode39/40/22/77/17/401/78/51/46/47/79 11道回溯题(Backtracking)
LeetCode 39 class Solution { public: void dfs(int dep, int maxDep, vector<int>& cand, int ...
- Scala 深入浅出实战经典 第77讲:模式匹配下的提取器动手构造实战
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性
[源码下载] 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件 ...
- 20135306黄韧[2.72 2.77 3.70](http://i.cnblogs.com/EditPosts.aspx?opt=1)
2.72 A.size_t是无符号整数,因此左边都会先转换为无符号整数,它肯定是大于等于0的. B.判断条件改为 if(maxbytes > 0 && maxbytes > ...
随机推荐
- LeetCode OJ:Count and Say(数数)
The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...
- 轮廓Outline|表格Table实例
1.使用outline属性在元素周围画一条线. border:red solid thin; outline:#00ff00 dotted thick; outline-style:dotted|da ...
- 2018.8.11E-mail
1发送附件 Attached please find the XXX for your review and comment. Outlook的附件最好不超过10M,文件要用英语命名,视频音频要压缩 ...
- python二分查找模块bisect
bisect模块用于二分查找,非常方便. Bisect模块提供的函数有: 1.查找 bisect.bisect_left(a,x, lo=0, hi=len(a)) : 查找在有序列表a中插入x的in ...
- set/multiset和map/multimap用法小结
二叉搜索树是ACM中经常需要用到的数据结构,熟练掌握map和set的用法很关键,现对其做一个简单的总结. 主要的功能有:插入元素,查找元素,删除,遍历/反向遍历. 插入,删除和查找操作的时间都和树的高 ...
- cmake安装MySQL数据库实例
一.编译安装MySQL前的准备工作 首先检查是否有安装其他版本的编译器和数据库,先卸载干净. 安装编译源码所需的工具和库 yum install gcc gcc-c++ ncurses-devel p ...
- 进程、线程、ThreadLlocal
1.线程是最小的执行单位,而进程中至少一个线程组:如果调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间 Unix/Linux操作系统提供了一个fork()系统调用,它非常 ...
- linux 下安装rar解压
在liunx下原本是不支持rar文件的,需要安装liunx下的winrar版本,操作如下 wget http://www.rarsoft.com/rar/rarlinux-4.0.1.tar.gz t ...
- 排序算法 java实现2
继续排序算法 4.冒泡排序 从第一个开始,跟后面一个数比较,如果比后面大就交换位置,这样没完成一轮,就可以把最大的选出来 public static <T extends Comparable& ...
- 应用层-day01
主流应用程序体系结构:CS结构.P2P结构. CS结构:客户-服务器体系结构.有一台总是打开的主机称为服务器,它服务来自其他许多称为客户的主机的请求. P2P体系结构:应用程序在不同的主机间链接,被称 ...