题意

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. ImportError: No module named 'cx_Oracle'问题处理过程记录,安装python cx_Oracle库

    错误如下: E:\pargram>python Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul 5 2016, 11:41:13) [M ...

  2. CP防火墙导入.csv格式的对象

    Step1:将.csv格式的对象上传到管理服务器,本例为/home/admin目录 [Expert@SZ-OFFICE-SMT:0]# pwd/home/admin[Expert@SZ-OFFICE- ...

  3. ASP.NET WebForm Identity使用

    环境 win10企业版x64+visual studio 2017+.net 4.5 step1 基本使用+邮件确认+密码重置 https://docs.microsoft.com/en-us/asp ...

  4. python3 实现删除数组中相同的元素

    # #把数组中相同的元素去除 # #第一种方式: def del_repeatnum(s=[1,1,1,2,2,3,3,4]): s1=[] for i in s: print(i) if i not ...

  5. MFC_对话框_访问控件_7种方法_A

    访问对话框控件的七种方法 方法一. GetDlgItem()->GetWindowText(); GetDlgItem()->SetWindowText(); 方法二. GetDlgIte ...

  6. 适配器模式 iOS

    前言: 最近需求作一个公共空间的需求,最后决定用适配器模式来做. 首先,需求是什么? 在我们app中,会有很多列表,tableviewcell的样式会比较统一(当然,我之前在公司那个app不算很大,基 ...

  7. java后台防止sql注入的方法

    1.采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可: String sql= "select * from users where usernam ...

  8. 微信支付-小程序H5 公众号 Payment SDK

    前言 今天是2020年一天,去年最后一个月开发了订单和支付系统,尤其在支付系统和微信对接的时候遇到了很多坑,这里给大家总结下,以免大家遇到相同的问题还浪费大量时间 微信支付前期准备 微信商户号,需要商 ...

  9. 网络知识_01:ISO七层模型

    一 IOS七层模型 1.1OSI的概念 Open System Interconnect开放系统互连参考模型,是由ISO(国际标准化组织)定义的.它是个灵活的.稳健的和可互操作的模型. 1.2OSI模 ...

  10. Asp.net导入Excel并读取数据

    protected void Button1_Click(object sender, EventArgs e) { if (station.HasFile == false)//HasFile用来检 ...