首页 > 其他分享 >CF1939D Big Persimmon 题解

CF1939D Big Persimmon 题解

时间:2024-05-24 16:18:12浏览次数:26  
标签:le return int 题解 det res ch Big CF1939D

题目链接

点击打开链接

题目解法

什么神仙题/jy

先把 \(a_i\) 都 \(\times 2\),默认一开始先手比后手快 \(1\) 时间,可以避免两个人同时结束一个柿子的情况
朴素的 \(dp\) 是显然的,令 \(f_{l,r,det}\) 表示当前剩下区间 \([l,r]\) 中的柿子,先手比后手快了 \(det\) 秒,先手最多能比后手多吃多少体积的柿子
转移分取 \(l\) 或 \(r\),不难做到 \(O(1)\)
暴力实现这个东西可以获得 \(56pts\):submission

接下来的一步非常神
我们考虑使每一步的 \(det\) 都 \(\le a_{r+1}\)

  1. 取左端
    这是不用管的,因为它天然满足取完之后的 \(det'\le a_{r+1}\)
  2. 取右端
    我们考虑取最长的能取的后缀,假设从 \(k\) 取到 \(r\),满足 \(0\le det-w_{k+1}-...w_{r}\le w_{k}\)
    考虑取完之后的 \(det'=w_k-(det-w_{k+1}-...-w_{r})\le w_k\),所以每一步都能使 \(det\le a_{r+1}\)
    至于为什么一定尽可能选,是因为每次一方选择一定是选左边的一段和右边的一段,我们相当于钦定顺序为:左边的一段一个一个选,右边的一段一起选

时间复杂度 \(O(n\sum w_i)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){
    FF=0;int RR=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    FF*=RR;
}
const int N=2010,V=20010;
int n,a[N],s[N],pos[N][V],f[N][V];
#define ff(l,r,det) f[l][(s[r]+det)/2]
int solve(int l,int r,int det){
    if(l>r) return 0;
    if(ff(l,r,det)!=-1) return ff(l,r,det);
    if(det>s[r]-s[l]) return ff(l,r,det)=s[r]-s[l-1];
    int res=-1e9;
    //choose l
    if(a[l]>det) chkmax(res,a[l]-solve(l+1,r,a[l]-det));
    else chkmax(res,a[l]+solve(l+1,r,det-a[l]));
    //choose r
    int p=pos[r][det/2];
    chkmax(res,s[r]-s[p-1]-solve(l,p-1,s[r]-s[p-1]-det));
    return ff(l,r,det)=res;
}
int main(){
    read(n);
    F(i,1,n) read(a[i]),a[i]*=2;
    F(i,1,n) s[i]=s[i-1]+a[i];
    a[n+1]=a[n];
    F(i,1,n){
        int k=i;
        for(int j=1;j<=a[i+1];j+=2){
            while(k&&j>s[i]-s[k-1]) k--;
            pos[i][j/2]=k;
        }
    }
    ms(f,-1);
    int g=solve(1,n,1),ans1=(s[n]+g)/2,ans2=(s[n]-g)/2;
    printf("%d %d\n",ans1/2,ans2/2);
    return 0;
}

标签:le,return,int,题解,det,res,ch,Big,CF1939D
From: https://www.cnblogs.com/Farmer-djx/p/18211187

相关文章

  • 充电桩——微信小程序,缴纳的1000元交易保障金,问题解答。
    1、小程序后台,申请退款保障金有一条不符合要求,无法退款。 2、咨询客服,能否退款然后再以公司名义缴纳保证金,等待回复:暂不支持对公转账,只能微信扫码支付缴纳哈。退保的话,支持退回对公账户。详情请查看小程序交易保证金管理规定https://developers.weixin.qq.com/miniprogram/de......
  • P5531 [CCO2019] Human Error 题解
    可能是一个比较劣的做法。但复杂度是对的。思路我们容易发现状态数非常的稀少。一个比较宽松的上限时\(3^{13}\)种状态由于每个点每走一步会吃掉一个棋子。所以实际的状态是远远达不到这个上限。那么我们可以直接设\(dp_{i,0/1,0/1}\)为在\(i\)状态下,目前是Justin......
  • Codeforces Global Round 12 C2. Errich-Tac-Toe (Hard Version) 题解 构造
    Errich-Tac-Toe(HardVersion)题目描述TheonlydifferencebetweentheeasyandhardversionsisthattokensoftypeOdonotappearintheinputoftheeasyversion.ErrichtogaveMonogonthefollowingchallengeinordertointimidatehimfromtakingh......
  • 蓝桥楼赛第30期-Python-第二天赛题 题解
    楼赛第30期Python模块大比拼解析网页元素目标本次挑战,我们需要使用Python访问软科世界大学排行榜来获取首页30所学校的信息。为避免目标网站的内容发生变化,我们使用保存之后的网页进行实验。链接如下:https://labfile.oss.aliyuncs.com/courses/4070/rank2021.h......
  • 优美子序列 题解
    有n个整数从左往右排成一行,构成一个序列a。如果通过删除原序列的若干个数(可以是删除0个),其他数保持位置不动,那么得到的序列就称为“子序列”。记sum表示序列a的所有数的总和,即sum=a[1]+a[2]+a[3]+...+a[n]。如果一个“子序列”的各个数加起来的和等于sum-1,那么这个“子序列”......
  • 题解:聪聪与可可(概率与期望)
    [NOI2005]聪聪与可可题目描述在一个魔法森林里,住着一只聪明的小猫聪聪和一只可爱的小老鼠可可。虽然灰姑娘非常喜欢她们俩,但是,聪聪终究是一只猫,而可可终究是一只老鼠,同样不变的是,聪聪成天想着要吃掉可可。一天,聪聪意外得到了一台非常有用的机器,据说是叫GPS,对可可能准确的定位......
  • [Usaco2017 Open]Bovine Genomics 题解^&*^(
    不知道为啥,我死活想不到二分(楼下正解)所以,就有了这篇题解可以看到,这道题离暴力的距离只有一步!就是数组开不下!!小问答:数组开不下时,你会?A:mapB:优化代码C:gp_hash_table由于正在学hash,所以容易想到...tong[本来的下标%9999999]然后就玄学的过了。。。ACcode#include<bi......
  • 【转载】2024年度山东省自然科学基金项目(第一批)申报常见问题解答
    地址:https://mp.weixin.qq.com/s?__biz=Mzg2NDU5NjA1OQ==&mid=2247579452&idx=2&sn=a038e35fb2958666ab255993008c8064&chksm=ce650e08f912871e77d05569567a15fdffcbedd6a1762a19433b4aabcdcbdf96272d52e28112&mpshare=1&scene=23&srcid=0523SHJ0......
  • Vue 使用 Devextreme框架,下拉框不会随页面的滚动而移动的问题解决
    Devextreme的DxSelectBox组件的下拉选项部分,默认是绝对位置布局,导致页面滚动时,下拉部分不会上下移动个人的解决方案,监听页面滚动事件,如果目前有打开的下拉框,先关闭下拉框,随后迅速再打开,视觉效果上可以做到下拉选项跟随组件滚动vue项目中可能会有很多页面,很多下拉框,我是用的给每......
  • NPOI创建word文档,使用unicode写入打勾的小方框,word2021显示异常问题解决
    word2019查看NPOI创建的word中打勾方框,显示正常,但是word2021显示就变成下面这个样子了,应该是word2021对这个特殊字符的渲染导致的 想要普通的效果,白色背景黑边黑勾的效果,换一个字体可以解决 c# 代码XWPFDocumentdocument=newXWPFDocument();XWPFParagraphparagrap......