codeforces 1037

题解:

E-trips

哎哎哎好傻逼啊

没有想到算不能的一直在想怎么算能的

太傻逼了

其实很简单

我们只需要对好友<=k的首先dfs一下给他连接着的朋友-1

然后如果小于了就递归下去

这个正确性是比较好想的

最后剩下的每个都是好友>=k个的并且都是这之间的

我们把他们都选了就可以了

这样不支持连边但是可以删边,所以倒着做就可以了

F - Maximum Reduction

大水题

会发现要求的长度为k,2k-1,3k-2,4k-3的最大值

单调栈维护前驱后继

然后前缀和优化一下求答案就完了

 

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define mid ((h+t)>>1)
const int mo=1e9+7;
const int N=2e6;
ll a[N],sum[N],ans;
int nxt[N],pre[N];
struct re{
  int a,b;
}ve[N];
int main()
{
  freopen("1.in","r",stdin);
  freopen("1.out","w",stdout);
  ios::sync_with_stdio(false);
  int n,m;
  cin>>n>>m;
  rep(i,1,n) cin>>a[i];
  int k=0;
  rep(i,1,n)
  {
    while (m*k-k+1<=i) k++;
    sum[i]=(sum[i-1]+k-1)%mo;
  }
  int t=0;
  rep(i,1,n)
  {
    while (t&&ve[t].a<a[i]) 
    {
      nxt[ve[t].b]=i-1;
      t--;
    }
    t++; ve[t].a=a[i]; ve[t].b=i;
  }
  while (t)
  {
    nxt[ve[t].b]=n;
    t--;
  }
  dep(i,n,1)
  {
    while (t&&ve[t].a<=a[i])
    {
      pre[ve[t].b]=i+1;
      t--;
    }
    t++; ve[t].a=a[i]; ve[t].b=i;
  }
  while (t)
  {
    pre[ve[t].b]=1;
    t--;
  }
  rep(i,1,n)
  {
    ans+=(sum[nxt[i]-pre[i]+1]-sum[nxt[i]-i+1-1]-sum[i-pre[i]+1-1])*a[i];
    ans%=mo;
  }
  cout<<(ans+mo)%mo<<endl;
  return 0; 
}

 

转载于:https://www.cnblogs.com/yinwuxiao/p/9581172.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值