【学习笔记】CF573E Bear and Bowling

这篇具有很好参考价值的文章主要介绍了【学习笔记】CF573E Bear and Bowling。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

感觉贪心的做法比较自然🤔,推荐 这篇博客

非常经典牛逼的贪心思路:

考虑每次加入一个数,位置 i i i的贡献为 V i = k i × a i + b i V_i=k_i\times a_i+b_i Vi=ki×ai+bi,其中 k i k_i ki表示 i i i以前被选的位置的个数, b i b_i bi表示 i i i以后被选的数的和

发现每次都会加入当前贡献最大的数。想一想会发现非常对,可以用归纳+调整法证明。感觉就是拟阵啊?

这样,我们考虑分块,发现对于整块的询问本质上就是维护凸包(类似于斜率优化),这样就做完了

事实上我们不需要在凸包上二分,注意到询问的 k k k是递增的,因此不断弹出队头元素即可

复杂度 O ( n n ) O(n\sqrt{n}) O(nn )

remark \text{remark} remark 别把凸优化学魔怔了。。。不是啥题都要用 D P DP DP。。。文章来源地址https://www.toymoban.com/news/detail-732475.html

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define fi first
#define se second
#define db double
#define ull unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e5+5;
const int B=350;
int n,vs[N],bl[N];
ll sm[N],sm2[N];
ll a[N];
int b[N];
ll calc(pair<ll,ll>a,pair<ll,ll>b){
    if(a.fi==0&&b.fi==0)return b.se;
    return a.fi*b.se-a.se*b.fi;
}
struct node{
    pair<ll,ll>s[B];
    int l,r,L,R,id[B];
    ll tag1,tag2;
    void build(){
        ll x=0,y=0;
        for(int i=R;i>=L;i--){
            sm[i]=x+(vs[i]?a[i]:0),x=sm[i];
        }
        for(int i=L;i<=R;i++){
            sm2[i]=y+vs[i],y=sm2[i];
        }
        l=1,r=0;
        for(int i=L;i<=R;i++){
            int x=b[i];if(vs[x])continue;
            pair<ll,ll>tmp={a[x],sm[x]+sm2[x]*a[x]};
            while(r-l+1>=2&&calc({s[r].fi-s[r-1].fi,s[r].se-s[r-1].se},{tmp.fi-s[r].fi,tmp.se-s[r].se})>=0)r--;
            s[++r]=tmp,id[r]=x;
        }
    }
    pair<ll,ll>query(){
        if(l>r)return {-inf,inf};
        while(r-l+1>=2&&calc({1,-tag1},{s[l+1].fi-s[l].fi,s[l+1].se-s[l].se})>0)l++;
        return {tag1*s[l].fi+s[l].se+tag2,id[l]};
    }
}f[B];
bool cmp(int x,int y){
    return a[x]<a[y];
}
void update(int x){
    vs[x]=1;
    f[bl[x]].build();
    for(int i=bl[x]+1;i<=bl[n];i++)f[i].tag1++;
    for(int i=1;i<bl[x];i++)f[i].tag2+=a[x];
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n;for(int i=1;i<=n;i++)cin>>a[i],bl[i]=(i-1)/B+1,b[i]=i;
    for(int i=1;i<=bl[n];i++)f[i].L=(i-1)*B+1,f[i].R=min(n,i*B),sort(b+f[i].L,b+f[i].R+1,cmp),f[i].build(),f[i].tag1=1;
    ll res=0;
    for(int i=1;i<=n;i++){
        pair<ll,ll>tmp={-inf,-inf};
        for(int j=1;j<=bl[n];j++)tmp=max(tmp,f[j].query());
        if(tmp.fi<=0)break;
        res+=tmp.fi,update(tmp.se);
    }cout<<res;
}

到了这里,关于【学习笔记】CF573E Bear and Bowling的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VK Cup 2017 - Round 1 A - Bear and Friendship Condition(并查集维护大小 + dfs 遍历图统计边数)

    题目大意: 给你一些n个点m条边,如果三个点(a,b,c)是合法的,当且仅当 a-b,b-c,c-a都有一条边,问你这个图是否合法,如果有一个或两个点视为合法 思路 考虑什么图才是个合法图:除了点数小于 3 的图一定合法外,必须是完全图才合法,假设完全图有 n 个点,则它的边数为

    2024年02月02日
    浏览(34)
  • 【学习笔记】CF1783G Weighed Tree Radius

    如果 w v ( u ) w_v(u) w v ​ ( u ) 指代的就是直径,或者说我们再添一项 a v a_v a v ​ ,那么我们几乎就做完了。 于是自然而然想到换一个定义: d ( u , v ) = dist ( u , v ) + a u + a v d(u,v)=text{dist}(u,v)+a_u+a_v d ( u , v ) = dist ( u , v ) + a u ​ + a v ​ 。 发现这样转化过后,设直径的两个端点

    2024年02月16日
    浏览(35)
  • 【学习笔记】CF1835D Doctor‘s Brown Hypothesis

    有点难😅 发现 x , y x,y x , y 在一个强连通块内,这样一定有环🤔 发现可以找到强连通块内所有环长度的 gcd ⁡ gcd g cd ,这样从 x x x 到 y y y 的所有路径的长度都模这个数同余,又因为 K K K 非常大,所以我们总可以遍历整个强连通块并走若干个环,因此只需要从 x x x 到 y y

    2024年02月09日
    浏览(31)
  • 【学习笔记】CF576D Flights for Regular Customers

    不同于传统的最短路,当我们走到一个节点的时候,还要记录此时经过的边数才能完成转移。但是第二维太大了,太抽象了! 看到 m m m 这么小,很难不想到离散化。那么设 f i , j f_{i,j} f i , j ​ 表示当第 i i i 条边出现时,在节点 j j j 是否可行,注意这是 01 01 01 状态。转移非

    2024年02月12日
    浏览(30)
  • 【学习笔记】CF582D Number of Binominal Coefficients

    注意 P P P 事实上不会影响复杂度,因为关于组合数,我们有一个非常经典的结论: ( n + m m ) binom{n+m}{m} ( m n + m ​ ) 包含的 P P P 的幂的次数等于 n n n 和 m m m 在 P P P 进制下做加法的进位次数。这样,我们只需要关心进位的次数,而不必知道每一位具体是多少。 这个结论的证

    2024年02月12日
    浏览(29)
  • 【CF闯关练习】—— 1400分(C. Make Good、B. Applejack and Storages)

    🌏博客主页: PH_modest的博客主页 🚩当前专栏: cf闯关练习 💌其他专栏: 🔴 每日一题 🟡 C++跬步积累 🟢 C语言跬步积累 🌈座右铭: 广积粮,缓称王! 👉传送门👈 XOR运算就是按位异或:相同为0,不同为1 这个操作符有两个结论: X ⊕ X = 0 Xoplus X= 0 X ⊕ X = 0 0 ⊕ X = X

    2024年01月21日
    浏览(49)
  • React-学习笔记(8—react-router@5 and @6)

    目录 1、react-router@5 1-1、在项目中安装路由 1-2、一个项目使用一个路由器来管理路由即可 1-3、 路由组件和一般组件的区别 1-4、使用 NavLink 1-5、封装 NavLink —— MyNavLink 1-6、使用 Switch 标签 1-7、BrowserRouter解决多级路径匹配样式丢失问题 1-8、路由的模糊匹配和严格匹配 1-9、路

    2024年02月12日
    浏览(46)
  • 视频理解学习笔记(二):I3D and Kinetics Dataset

    LSTM (a): ConvNet + LSTM 3D网络 (b): 3D-ConvNet 双流网络,利用光流 (c): Two-Stream 其他 : 将3D和双流结合 (d): 3D-Fused I3D (e): Two-Sream I3D Workshop : CVPR’17 论文标题 :Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset 论文地址:https://arxiv.org/abs/1705.07750 论文作者 : Joao Carreira from DeepMind

    2024年02月06日
    浏览(46)
  • verilog 学习笔记 —— 时序逻辑 Sequential Logics (Latches and Flip-Flops 锁存器和触发器)

    1. D flip-flop D触发器 2. D flip-flop  D触发器 3. DFF with reset  带复位的D触发器  4. 带复位值的D触发器 5. DFF with asynchronous reset 带异步复位功能的 D触发器 6. DFF with byte enable   带位启动的触发器 7. D Latch  D锁存器 8. DFF  9. DFF   10. DFF+gate   11. Mux and DFF   12. DFFs and gates   13

    2024年02月04日
    浏览(60)
  • 【计算机视觉—python 】 图像处理入门教程 —— 图像属性、像素编辑、创建与复制、裁剪与拼接【 openCV 学习笔记 005 to 010 and 255】

    OpenCV中读取图像文件后的数据结构符合Numpy的ndarray多维数组结构,因此 ndarray 数组的属性和操作方法可用于图像处理的一些操作。数据结构如下图所示: img.ndim:查看代表图像的维度。彩色图像的维数为3,灰度图像的维度为2。 img.shape:查看图像的形状,代表矩阵的行数(高

    2024年01月19日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包