[Educational Round 59][Codeforces 1107G. Vasya and Maximum Profit]

咸鱼了好久...出来冒个泡_(:з」∠)_

题目连接:1107G - Vasya and Maximum Profit

题目大意:给出\(n,a\)以及长度为\(n\)的数组\(c_i\)和长度为\(n\)的严格单调上升数组\(d_i\),求\(\max\limits_{1 \le l \le r \le n} (a\cdot(r-l+1)-\sum_{i=l}^{r}c_i-gap(l,r))\),其中\(gap(l, r) = \max\limits_{l \le i < r} (d_{i + 1} - d_i)^2\)

题解:首先将所有的\(c_i\)转换为\(a-c_i\),这样就变成了求\(\max\limits_{1 \le l \le r \le n} (\sum_{i=l}^{r}c_i-gap(l,r))\)。如果\(l,r\)确定的话,我们就能通过求前缀和以及区间内最大值来算出该区间对应的答案,但我们还需要进一步的优化。

  考虑每一个\(d_{i + 1} - d_i\)能成为\(gap(l,r)\)的范围,即在区间\([L,R]\)中,\(\forall L \le l \le r \le R,gap(l,r)\le d_{i + 1} - d_i\)。这样我们只需要用线段树查询区间\([L,R]\)的最大子段和就能求出当\(gap(l,r) \le d_{i + 1} - d_i\)时的答案。先预处理所有的\(L,R\),再扫一遍就好了。

#include<bits/stdc++.h>
using namespace std;
#define N 300001
#define LL long long
LL n,b,l[N],r[N],a[N],d[N],L,R,M,S,ans;
struct rua{LL l,r,w,s,lw,rw;}t[N<<2];
void up(int x,int mid)
{
    t[x].s=t[x*2].s+t[x*2+1].s;
    t[x].w=max(t[x*2].w,t[x*2+1].w);
    t[x].lw=max(t[x*2].lw,t[x*2].s+t[x*2+1].lw);
    t[x].rw=max(t[x*2+1].rw,t[x*2+1].s+t[x*2].rw);
    t[x].w=max(t[x].w,t[x*2].rw+t[x*2+1].lw);
}
void Build(int l,int r,int x)
{
    t[x].l=l,t[x].r=r;
    if(l==r){t[x].w=t[x].lw=t[x].rw=t[x].s=a[l];return;}
    int mid=l+r>>1;
    Build(l,mid,x*2);
    Build(mid+1,r,x*2+1);
    up(x,mid);
}
void ask(int ll,int rr,int l,int r,int x)
{
    if(ll>r || l>rr)return;
    int mid=l+r>>1;
    if(ll<=l && r<=rr)
      {
      M=max(M,max(t[x].w,R+t[x].lw));
      L=max(L,S+t[x].lw);
      R=max(R+t[x].s,t[x].rw);
      M=max(M,max(L,R));
      S+=t[x].s;
      return;
      }
    ask(ll,rr,l,mid,x*2);
    ask(ll,rr,mid+1,r,x*2+1);
}
int main()
{
    scanf("%I64d%I64d",&n,&b);
    for(LL i=1;i<=n;i++)
      {
      scanf("%I64d%I64d",&d[i],&a[i]);
      a[i]=b-a[i],ans=max(ans,a[i]);
      }
    for(LL i=n;i>=1;i--)d[i]-=d[i-1];
    Build(1,n,1);
    d[1]=0;
    l[2]=2,r[n]=n;
    for(LL i=3;i<=n;i++)
      {
      LL _=i;
      while(_>2 && d[i]>=d[_-1])
        _=l[_-1];
      l[i]=_;
      }
    for(LL i=n-1;i>=2;i--)
      {
      LL _=i;
      while(_<n && d[i]>=d[_+1])
        _=r[_+1];
      r[i]=_;
      }
    for(LL i=2;i<=n;i++)
      {
      S=0;
      L=R=M=-(1e18);
      ask(l[i]-1,r[i],1,n,1);
      ans=max(ans,M-d[i]*d[i]);
      }
    printf("%I64d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/DeaphetS/p/10326785.html

时间: 2024-10-14 16:11:02

[Educational Round 59][Codeforces 1107G. Vasya and Maximum Profit]的相关文章

Codeforces 1032F Vasya and Maximum Matching dp

Vasya and Maximum Matching 首先能观察出, 只有完美匹配的情况下方案数唯一. dp[ i ][ 0 ], dp[ i ][ 1 ], dp[ i ][ 2 ] 分别表示 对于 i 这棵子树   0: 不向上连边完成  1:向上连边完成  2:向上连边未完成   的方案数 #include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long #

Educational Codeforces Round 59 (Rated for Div. 2) DE题解

Educational Codeforces Round 59 (Rated for Div. 2) D. Compression 题目链接:https://codeforces.com/contest/1107/problem/D 题意: 给出一个n*(n/4)的矩阵,这个矩阵原本是一些01矩阵,但是现在四个四个储存进二进制里面,现在给出的矩阵为0~9以及A~F,表示0~15. 然后问这个矩阵能否压缩为一个(n/x)*(n/x)的矩阵,满足原矩阵中大小为x*x的子矩阵所有数都相等(所有子矩阵构

CodeForces - 837E - Vasya&#39;s Function | Educational Codeforces Round 26

/* CodeForces - 837E - Vasya's Function [ 数论 ] | Educational Codeforces Round 26 题意: f(a, 0) = 0; f(a, b) = 1 + f(a, b-gcd(a, b)); 求 f(a, b) , a,b <= 1e12 分析: b 每次减 gcd(a, b) 等价于 b/gcd(a,b) 每次减 1 减到什么时候呢,就是 b/gcd(a,b)-k 后 不与 a 互质 可先将 a 质因数分解,b能除就除,不能

Codeforces Beta Round #59 (Div. 2)

Codeforces Beta Round #59 (Div. 2) http://codeforces.com/contest/63 A 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define lson l,mid,rt<<1 4 #define rson mid+1,r,rt<<1|1 5 #define sqr(x) ((x)*(x)) 6 #define pb push_back 7 #define

Codeforces 837E Vasya&#39;s Function - 数论

Vasya is studying number theory. He has denoted a function f(a, b) such that: f(a, 0) = 0; f(a, b) = 1 + f(a, b - gcd(a, b)), where gcd(a, b) is the greatest common divisor of a and b. Vasya has two numbers x and y, and he wants to calculate f(x, y).

CodeForces 577C Vasya and Petya&#39;s Game 数学

题意就是给你一个1到n的范围 你每次可以问这个数是否可以被某一个数整除 问你要猜多少数才能确定这个数…… 一开始一点思路也没有 后来查了一下才知道 每个数都可以分为几个质数的整数次幂相乘得到…… 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6 #include<string>

Codeforces 837E Vasya&#39;s Function 数论 找规律

题意:定义F(a,0) = 0,F(a,b) = 1 + F(a,b - GCD(a,b).给定 x 和 y (<=1e12)求F(x,y). 题解:a=A*GCD(a,b) b=B*GCD(a,b),那么b-GCD(a,b) = (B-1)*GCD(a,b),如果此时A和B-1依然互质,那么GCD不变下一次还是要执行b-GCD(a,b).那么GCD什么时候才会变化呢?就是说找到一个最小的S,使得(B-S)%T=0其中T是a的任意一个因子.变形得到:B%T=S于是我们知道S=min(B%T).也

Codeforces 837E. Vasya&#39;s Function

http://codeforces.com/problemset/problem/837/E 题意: f(a, 0) = 0; f(a, b) = 1 + f(a, b - gcd(a, b)) 输出f(a,b) a=A*gcd(a,b)    b=B*gcd(a,b) 一次递归后,变成了 f(A*gcd(a,b),(B-1)*gcd(a,b)) 若gcd(A,(B-1))=1,那么 这一层递归的gcd(a,b)仍等于上一层递归的gcd(a,b) 也就是说,b-gcd(a,b),有大量的时间减的

HDU5052 Yaoge’s maximum profit(树链剖分)点权更新,经典题

Yaoge's maximum profit Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 662    Accepted Submission(s): 182 Problem Description Yaoge likes to eat chicken chops late at night. Yaoge has eaten to