test 190730 云顶之弈

问题描述

云顶之弈是一款最近很流行的自走棋游戏,玩家需要抽取卡片提升装备并通过巧妙的布局赢得游戏.

赢得游戏的关键在于良好的策略,但运气也是必不可少的.
游戏公司当然不会放过一个捞金的好机会,于是,如果抽不到想要的卡片,可以在商店购买.
当然,游戏公司也会利用人们的侥幸心理,让他们花钱购买抽卡的机会.商店进行保证,连抽c次一定可以获得想要的卡片.
具体来说,每个光顾商店的人有一个氪金值 和一个欧气值 ,若他的欧气值大于等于c,他会选择连抽c次获得卡片,若他的欧气值小于c,且他的氪金值大于等于卡片的价格p,他会氪金买他想要的卡片.否则他会离开商店.
现在,游戏公司要做的就是定下需要连抽多少次才能保证获得想要的卡片,即一个人连抽c次游戏公司可以赚取$c*w$的利润.游戏公司想要你帮他计算c 定为1到$1+max(b_i)$的最大利润.(p不确定).
输入格式
第一行两个数,n,w,表示光顾商店的人和单次抽取卡片的费用.
接下来n行,每行两个数,表示第i 个人的氪金值 $a_i$和欧气值$b_i$ .
输出格式
一行,共$1+max(b_i)$个数,第i个数表示c=i时的最大利润.
输入样例1
2 1
2 0
0 2
输出样例1
3 4 2
输入样例2
3 1
3 1
2 2
1 3
输出样例2
3 7 7 4
数据范围
$n\leq10^5$,$a_i,b_i\leq10^5$

基本思路思路很好想,枚举c求答案,加上离散化,时间复杂度$O(nmax(a_i))$

可以发现求答案的主要过程抽象为这样一种数据结构,支持给1~x中每个数加上它本身,询问1~n中的最大值

然后自然而然想到要用分块

如果修改的是一个完整块,怎样维护其中的最大值?

我们知道,每个位置对应的值为$i*tag_i+s_i$

修改时,只有$tag_i$会变化,而且单调递增

另外,在每个块内$i$也是单调递增的

是不是有一点点像斜率优化?

把每个元素看作$(i,s_i)$,维护一个下凸包,满足对于$i<j<k$,$\frac{s_i-s_j}{i-j}<\frac{s_j-s_k}{j-k}$

每次修改时,删去$s_i-s_j\leq(j-i)*tag_{block_i}$的

剩下的暴力重建即可,时间复杂度$O(n\sqrt{n})$

很巧妙地在分块中结合了斜率优化的思想

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,n_n,w,mxb,mxa;
int block[N],lft[N],rgt[N];
long long tag[N],s[N],maxx[N];
struct person {int a,b;} p[N];
bool cmp(person u,person v) {return u.b<v.b;}
int q[505][505],h[505],t[505];
void update(int r)
{
    int R=block[r];
    for(int i=1;i<R;++i)
    {
        ++tag[i];
        while(h[i]<t[i] &&
            s[q[i][h[i]]]-s[q[i][h[i]+1]]<=
                1ll*(q[i][h[i]+1]-q[i][h[i]])*tag[i])
            ++h[i];

        maxx[i]=1ll*q[i][h[i]]*tag[i]+s[q[i][h[i]]];
    }
    for(int i=lft[R];i<=r;++i) s[i]+=i;
    for(int i=lft[R];i<=rgt[R];++i) s[i]+=tag[R]*i;
    h[R]=1,t[R]=tag[R]=0;
    for(int i=lft[R];i<=rgt[R];++i)
    {
        while(t[R]>h[R] &&
            1ll*(s[q[R][t[R]]]-s[i])*(q[R][t[R]-1]-q[R][t[R]])>=
                1ll*(q[R][t[R]]-i)*(s[q[R][t[R]-1]]-s[q[R][t[R]]])) --t[R];
        q[R][++t[R]]=i;
    }
    while(h[R]<t[R] && s[q[R][h[R]]]<=s[q[R][h[R]+1]]) ++h[R];
    maxx[R]=s[q[R][h[R]]];
}
long long ask_max()
{
    long long ret=0;
    for(int i=1;i<=n_n;++i) ret=max(ret,maxx[i]);
    return ret;
}
int main()
{
    freopen("could.in","r",stdin); freopen("could.out","w",stdout);
    scanf("%d%d",&n,&w);
    for(int i=1;i<=n;++i)
    {
        scanf("%d%d",&p[i].a,&p[i].b);
        mxa=max(p[i].a,mxa);
    }
    sort(p+1,p+n+1,cmp);
    mxb=p[n].b+1;
    m=sqrt(mxa), n_n=(mxa-1)/m+1;
    for(int i=1;i<=mxa;++i) block[i]=(i-1)/m+1;
    for(int i=1;i<=n_n;++i)
    {
        lft[i]=(i-1)*m+1, rgt[i]=min(i*m,mxa);
        h[i]=1, t[i]=1, q[i][1]=rgt[i];
    }
    int pl=1,pr=1;
    for(int i=1;i<=mxb;++i)
    {
        long long ans=0;
        while(p[pr].b<i && pr<=n) ++pr;
        ans=1ll*i*w*(n-pr+1);
        for(int j=pl;j<pr;++j) update(p[j].a);
        pl=pr;
        printf("%lld ",ans+ask_max());
    }
    return 0;
}

原文地址:https://www.cnblogs.com/w19567/p/11272705.html

时间: 2024-10-13 16:02:06

test 190730 云顶之弈的相关文章

flutter-lol云顶之弈助手app

前两天利用业余时间开发了一个云顶助手app,所以来分享一下使用flutter的经验和看法. 先贴一个项目地址:https://github.com/Purelightme/lol_chess 可以给个小星星吗? 因为wegame上面已经有云顶相关的资料了,比较健全,但是是需要联网才能用的,经常网络慢(也可能是wegame服务器卡了)刷新不出来东西,我就想着这些英雄,装备,羁绊不都是固定的数据吗,何不把他们做成本地的,不需要网络,这样也更快,体验更好. 恰好flutter支持sqlite数据库,于

云顶记

三河交汇,沱江之始.于此,沿江南下,十里有余.有一山,曰:云顶.山势挺拔,峭壁入云,如刀削斧砍.上有紫气云虎,啸腾峰间.下有江雾水龙,万古萦绕.仙灵之地,人神庇护.闻千年之造化,感此生而游其中.翠绿满山,浓荫蔽日.其间烟雾朦朦,云起如诗如画.集万物之精华,尽鬼斧之神功.古来数几百年,兵家要地.宋末抗元,在此筑城,故又称:石城. 方岩为栈,巨石为垣.顺山脉之势,依岩壁之力,随茂林之气,附天地之灵,至底而上,蜿蜒数里,直入峰顶.基石沉而稳,栈道宽而长,城垣大而险,据点多而巧.丁字堆砌而筑墙,一字石墙

关于自走棋类游戏棋子搜索算法分析

最近自走棋类游戏非常风靡,从DOTA2的自走棋到LOL的云顶之弈 玩家在享受游戏快乐的同时,也被搜不来牌所烦恼,当然这也是麻将元素带来乐趣的所在 分析搜牌算法: 1.有一个牌库1¥棋子13个比如一共有30个就是13*30:加上2¥棋子3¥4¥5¥棋子,总个数=13*30+14*25+15*20+12*15+6*10=1280(个) (以上数据与棋子个数均为猜测估算,目的为分析算法内容,数据来源不真实) 2.在这个牌库中,每回合从牌库中抽取牌,而抽取牌需要根据当前棋手等级对应一定的搜索概率,例如:

teb切换

页面的切换 HTML <div class="gonggao" id="di2"> <div class="ggtb" id="op2"> <ul class="xinwen"> <li class="zhe">综合</li> <li class="zhe">公告</li> <l

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP.电商系统等软件开发,商标.商品LOGO.VI.产品包装设计.营销推广.大数据人工智能等各类企业上云.数字化转型服务. 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP.电商系统等软件开发,商标.商品LOGO.VI.产品包装设计.营销推广.大数据人工智能等各类企业上云.数字化转型服务

英语电影剧本大全(中英对照)

目     录 <泰坦尼克号>全部英文剧本 TV REPORTER: Treasure hunter Brock Lovett is best known for finding Spanish gold off islands in the best Caribbean. LIZZY: It’s OK, I’ll get you in a minutes. Come on. TV REPORTER: Now he is using Russian subs to reach the most

2017 上海车牌(沪牌)标书购买攻略

本文介绍 上海车牌标书购买的攻略,本文会一直跟随政策而更新, 希望对大家有所帮助   本文2017年4月更新 阅读目录 第一步:确认自己是否有资格购买标书 非上海户籍:   需要上海市居住证,驾照,三年社保或者个税(社保,可以自己上上海市社保局申请) 上海户籍:    只需要有驾照就行 名下没有沪牌 (每个人只能有一张沪牌) 驾照没有扣12分,也没有5次违规 一定要确认自己的有资格再去申请,现在购买标书的政策越来越严格 第二步:网上申请资格 1. 打开国拍官方网站 http://chepai.a

迈阿密房价仅为北京40% 当地地产商急盼中国投资者

迈阿密房价仅为北京40% 当地地产商急盼中国投资者 行业动态中国新闻网[微博]2014-10-21 00:40 我要分享 31 因阳光.沙滩和影片<迈阿密风云>而被中国人熟知的迈阿密,如今像一个大工地,到处是正在修建的地产项目. 房价仅为纽约的 37%.北京的40%,当地地产商急寻中国富豪马云 特别报道迈阿密地产风云 <中国经济周刊> 记者 刘永刚美国迈阿密报道 “你能帮我联系到马云吗?” 得知记者来自中国后,美国迈阿密的地产开发商马可立刻表达了自己希望见到马云的急迫心情.他希望马

MODIS数据说明

MODIS目前主要存在于两颗卫星上:TERRA和AQUA.TERRA卫星每日地方时上午10:30时过境,因此也把它称作地球观测第一颗上午星(EOS-AM1).AQUA每日地方时下午过境,因此称作地球观测第一颗下午星(EOS-PM1).两颗星相互配合,每1-2天可重复观测整个地球表面,得到36个波段(表1)的观测得到,这些数据广泛用于全球陆地.海洋和低层大气内的动态变化过程研究. MODIS获取数据的原始分辨率包括三类:波段1–2 – 250m.波段3–7 – 500m.波段8–36 – 1000