题意

https://codeforces.com/contest/1037/problem/F


思考

摘自一种比较有趣的做法。我们对序列进行分治,每次统计跨过mid的区间的贡献。其正确性是保证的:每个区间只会对应到一个mid。对于左区间,算出它的后缀最大值。

接下来从左到右枚举右区间的每一个点。对于点$i$,右端点在它上面的区间的跨度是$k-1$的。因此除了最大值相同的从右到左的block个区间,剩下的贡献要通过左区间跨度为(k-1)的(后缀最大值)的前缀和求出。

代码很少,但细节很多。虽然复杂度为$O(nlogn)$,但不失为解决这一类问题的优秀算法。


代码

 #include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
typedef long long int ll;
const int maxn=1E6+;
int n,k;
ll ans,a[maxn],maxx[maxn],sum[maxn];
inline ll max(ll x,ll y)
{
return x>y?x:y;
}
void solve(int l,int r)
{
if(r-l+<k)
return;
int mid=(l+r)>>;
maxx[mid]=a[mid];
for(int i=mid-;i>=l;--i)
maxx[i]=max(maxx[i+],a[i]);
sum[l-]=;
sum[l]=maxx[l];
for(int i=l+;i<=mid;++i)
{
sum[i]=;
int pos=i-k+;
if(pos>=l)
sum[i]=sum[pos];
sum[i]=(sum[i]+maxx[i])%mod;
}
ll now=a[mid+];
for(int i=mid+,j=mid;i<=r;++i,now=max(now,a[i]))
{
if(i-l+<k)
continue;
while(j>=l&&maxx[j]<now)
--j;
int len=i-j+;
int block=(len-)/(k-);
int out=block+;
block-=(i-mid-)/(k-);
ans=(ans+block*now%mod+sum[max(l-,i-out*(k-))])%mod;
}
solve(l,mid),solve(mid+,r);
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=;i<=n;++i)
cin>>a[i];
solve(,n);
cout<<ans<<endl;
return ;
}

[CF1037F]Maximum Reduction的更多相关文章

  1. [Manthan, Codefest 18][Codeforces 1037F. Maximum Reduction]

    题目链接:1037F - Maximum Reduction 题目大意:给出一段代码,给你一个长度为n的数组和数字k,求程序运行结果,mod 1e9+7输出 简单翻译下代码的意思,初始定义一个空数组b ...

  2. Codeforces1037F Maximum Reduction 【单调栈】

    题目分析: 没啥好说的,会单调栈就会做. 代码: #include<bits/stdc++.h> using namespace std; ; ; int n,k; int pre[max ...

  3. Codeforces 1037F. Maximum Reduction

    总感觉我这种做法会T,一直没写,看了其他人的题解也是这样,,,就果断写了,,可能数据不太深,或者玄学复杂度 题意即求xk-1长度的所有区间的最大值的和,对每一个i(数组下边),他对答案的贡献数量就是在 ...

  4. SAP ECC PP 配置文档

    SAP ECC 6.0 Configuration Document Production Planning & Control (PP) 1. General Settings 1.1 Ma ...

  5. codeforces 1037

    题解: E-trips 哎哎哎好傻逼啊 没有想到算不能的一直在想怎么算能的 太傻逼了 其实很简单 我们只需要对好友<=k的首先dfs一下给他连接着的朋友-1 然后如果小于了就递归下去 这个正确性 ...

  6. 官方推荐的MySQL参数设置值

    这oracle官方推荐的在OLTP环境下,MySQL参数设置的最佳实践. 下面的参数设置,对系统的性能会很有帮助.但是建议大家还是结合实际情况使用. APPLIES TO: MySQL Server ...

  7. ValueError: zero-size array to reduction operation maximum which has no identity

    数据打印到第530行之后出现以下异常,求解!

  8. erlang reduction

    “首先明确一点,Erlang的process的调度是抢占式的,而非couroutine的协作式的.其次,Erlang早期版本是只有一个调度器,运行在一个线程上,随着erts的发展,现在erlang的调 ...

  9. 壁虎书8 Dimensionality Reduction

    many Machine Learning problems involve thousands or even millions of features for each training inst ...

随机推荐

  1. 使用exp/imp 在oracle数据库间导数据

    最近工作需要将oracle数据库的表数据导出到另一个oracle数据库表,找到了oracle 自带的命令行,并记录下导数据过程. 导数据过程分以下几步: 假设源数据库为A,目标数据库为B 1.在B上通 ...

  2. Python10_代码规范和可读性

    养成好的编程习惯和方法对提升代码可读性至关重要. 1.类.模块.包:不要用下划线,命名要简短 2.类:命名最好以大写开头 3.模块.包:用小写单词 4.变量.函数.方法:可以用下划线提高可读性,尽量都 ...

  3. filter 开发

    在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...

  4. Linux: 在某个路径及其子目录下查找所有包含“hello abcserver”字符串的文件。

    find /etc -name “*” | xargs grep “hello abcserver” 在 / 及其子目录下查找所有包含UNEXPECTED_SCHEMA find /  -name * ...

  5. 初始Redis与简单使用

    初始Redis: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(so ...

  6. 从零开始のcocos2dx生活(六)EventDispatcher

    EventDispatcher可能是所有的里面比较不容易理解也不容易看的 我说自己的理解可能会误导到你们-[索了你们看不下去>< 我写了几乎所有的代码的注释,有的是废话跳过就好 主要的代码 ...

  7. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

  8. $ZOJ\ 2432\ Greatest\ Common\ Increasing\ Subsequence$

    传送门 $Description$ 求两个序列的最长公共上升子序列 $Solution$ $f[i][j]$表示$a$序列匹配到$i$和$b$序列匹配到$j$的最长上升序列的长度,这里并不要求$a[i ...

  9. StrategyPattern(策略模式)-----Java/.Net

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  10. Appium环境搭建超详细教程

    前言: 本系列教程会从软件的基本安装开始,最终目的是通过完成几个案例后, 大家实现自由抓取App中想要的资源. 本系列以后会更的: Appium基本使用及控制真机及安卓模拟器 Mitmproxy抓包工 ...