题目

思路

倒序 \(DP\)

设 \(f_{i,j}\) 表示 \(A\) 先手,当前 \(A\) 报出的值为 \(i\),\(B\) 报出的值为 \(j\),\(A\) 取诱惑值大于等于 \(i\) 的, \(A\) 能拿到的最大收益

\(g_{i,j}\) 表示 \(B\) 先手,当前 \(B\) 报出的值为 \(j\),\(A\) 报出的值为 \(i\),\(B\) 取诱惑值大于等于 \(j\) 的,\(B\) 能拿到的最大收益(和 \(f\) 同理)

那么我们考虑转移 \(f_{i,j}=\max(sum_{i,j} - g_{k,j}) i + 1 \leq k \leq n\)

\(sum_{i,j}\) 和 \(f,g\) 的意思差不多,就是改成全取的总收益

\(g\) 转移同理

但其中有个很重要的细节:每次转移必须选数

所以我们要记录 \(cnt_{i,j}\) 表示和 \(sum\) 差不多,但它存的是诱惑值范围内数的个数

当本次转移的 \(cnt_{i,j}\) 等于上次转移用的 \(cnt\) 时,直接继承

一看,what out?! \(O(n^3)\) 的!!

不可接受

但我们发现转移时总有一维是固定

我们可以开个数组算完 \(f\) 后更新最优值

这样就可以做到 \(O(1)\) 转移

注意先离散化,求 \(sum,cnt\) 时用二维前缀和

\(Code\)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL; const int N = 1005;
int n;
LL f[N][N] , g[N][N] , a[N] , b[N] , c[N] , val[N] , sum[N][N] , cnt[N][N]; int main()
{
freopen("poker.in" , "r" , stdin);
freopen("poker.out" , "w" , stdout); scanf("%d" , &n);
for(register int i = 1; i <= n; i++) scanf("%lld" , &val[i]);
for(register int i = 1; i <= n; i++) scanf("%lld%lld" , &a[i] , &b[i]); for(register int i = 1; i <= n; i++) c[i] = a[i];
sort(c + 1 , c + n + 1);
int m = unique(c + 1 , c + n + 1) - c - 1;
for(register int i = 1; i <= n; i++) a[i] = lower_bound(c + 1 , c + m + 1 , a[i]) - c; for(register int i = 1; i <= n; i++) c[i] = b[i];
sort(c + 1 , c + n + 1);
m = unique(c + 1 , c + n + 1) - c - 1;
for(register int i = 1; i <= n; i++) b[i] = lower_bound(c + 1 , c + m + 1 , b[i]) - c; for(register int i = 1; i <= n; i++)
++cnt[a[i]][b[i]] , sum[a[i]][b[i]] += val[i];
for(register int i = n; i; i--)
for(register int j = n; j; j--)
{
sum[i][j] += sum[i + 1][j] + sum[i][j + 1] - sum[i + 1][j + 1];
cnt[i][j] += cnt[i + 1][j] + cnt[i][j + 1] - cnt[i + 1][j + 1];
}
for(register int i = n; i; i--)
for(register int j = n; j; j--)
{
f[i][j] = (cnt[i][j] == cnt[i + 1][j] ? f[i + 1][j] : sum[i][j] - a[j]);
g[i][j] = (cnt[i][j] == cnt[i][j + 1] ? g[i][j + 1] : sum[i][j] - b[i]);
a[j] = min(a[j] , g[i][j]) , b[i] = min(b[i] , f[i][j]);
}
printf("%lld" , f[1][1]);
}

JZOJ 4299. 【NOIP2015模拟11.2晚】舳舻牌的更多相关文章

  1. [JZOJ 4307] [NOIP2015模拟11.3晚] 喝喝喝 解题报告

    题目链接: http://172.16.0.132/senior/#main/show/4307 题目: 解题报告: 题目询问我们没出现坏对的连续区间个数 我们考虑从左到有枚举右端点$r$,判断$a[ ...

  2. JZOJ 4298. 【NOIP2015模拟11.2晚】我的天

    4298. [NOIP2015模拟11.2晚]我的天 (File IO): input:ohmygod.in output:ohmygod.out Time Limits: 1000 ms Memor ...

  3. 【NOIP2015模拟11.2晚】JZOJ8月4日提高组T2 我的天

    [NOIP2015模拟11.2晚]JZOJ8月4日提高组T2 我的天 题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着 ...

  4. JZOJ4307. 【NOIP2015模拟11.3晚】喝喝喝

    Description

  5. 【NOIP2015模拟11.2晚】我的天

    题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着独立的生活,完全没有意识到其他n个人的存在. 但有一天,村民xiba臻 ...

  6. 【NOIP2015模拟11.4】JZOJ8月6日提高组T1 刷题计划

    [NOIP2015模拟11.4]JZOJ8月6日提高组T1 刷题计划 题目 题解 题意 有\(n\)道题,编号为1~\(n\) 给出\(m\)次操作 每次操作有3种类型 1 \(x\) 表示交了\(A ...

  7. 【NOIP2015模拟11.5】JZOJ8月5日提高组T2 Lucas的数列

    [NOIP2015模拟11.5]JZOJ8月5日提高组T2 Lucas的数列 题目 PS:\(n*n*T*T<=10^{18}\)而不是\(10^1*8\) 题解 题意: 给出\(n\)个元素的 ...

  8. 【NOIP2015模拟11.5】JZOJ8月5日提高组T1 俄罗斯套娃

    [NOIP2015模拟11.5]JZOJ8月5日提高组T1 俄罗斯套娃 题目 题解 题意就是说 将1~\(n\)排列,问有多少种方案使得序列的逆序对个数小于\(k\) 很容易想到DP 设\(f[i][ ...

  9. 【NOIP2015模拟11.4】JZOJ2020年8月6日提高组T2 最优交换

    [NOIP2015模拟11.4]JZOJ2020年8月6日提高组T2 最优交换 题目 题解 题意 有一个长度为\(n\)的正整数 最多可以进行\(k\)次操作 每次操作交换相邻两个位置上的数 问可以得 ...

  10. 【NOIP2015模拟11.5】JZOJ8月5日提高组T3 旅行

    [NOIP2015模拟11.5]JZOJ8月5日提高组T3 旅行 题目 若不存在第\(k\)短路径时,输出"Stupid Mike" 题解 题意 给出一个有\(n\)个点的树 问这 ...

随机推荐

  1. ArcObjects SDK开发 001 ArcObjects SDK 简介

    1.什么是ArcObjects SDK 在网上搜索什么是ArcObjects,会搜到如下的定义. 这个定义比较准确,也比较容易理解. 2.什么是ArcEngine 在网上搜索ArcEngine,一般会 ...

  2. 工程坐标转换方法C#代码实现

    目录 1. 前言 2. 计算总体框架 3. C#代码实现 3.1 整体类的构建 3.2 椭球参数赋值 3.3 转换1.3(大地经纬度坐标与地心地固坐标的转换) 3.4 投影转换 3.5 转换2的实现( ...

  3. 【每日一题】【第一个出现的值】【二分】2022年1月10日-NC105 二分查找-II

    描述请实现有重复数字的升序数组的二分查找给定一个 元素有序的(升序)长度为n的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返 ...

  4. 【每日一题】【回溯】2021年12月29日-93. 复原 IP 地址

    有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔. 例如:"0.1.2.201" 和 "192.1 ...

  5. 一定要用Photoshop?no!动手用Python做一个颜色提取器! ⛵

    作者:韩信子@ShowMeAI Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56 计算机视觉实战系列:https://www.showmeai ...

  6. ATM+购物车(思路流程)

    ATM +购物车(思路流程) 启动文件 首先,创建一个start.py作为整个项目启动的启动文件 然后导入os和sys模块,从core中导入src,也就是展示给用户看的 在src.py用户视图层中,先 ...

  7. VS2019发布至远程IIS部署流程

    服务器部署 传统的开发将项目发布至本地桌面之后,复制至站点目录或通过FTP上传站点目录,有点小麻烦,通过开发工具VS2019本身集成的功能,可以一步到发布到远程IIS站点. 条件: VS系列发工具,例 ...

  8. MongoDB 索引类型介绍

    转载请注明出处: 目录 1.单字段索引 2.复合索引 3.多key索引 4.其他类型索引 5.索引额外属性 6.MongoDB 索引相关的常用sql命令 MongoDB 支持多种类型的索引,包括单字段 ...

  9. nuxt.js中登录、注册(密码登录和手机验证码登录)

    <!-- 登录弹框 --> <div class="mask" v-show="flag"> <div class="m ...

  10. 使用idea进行gitee代码管理

    目录 1.在idea插件市场安装gitee插件 2.把本地仓库的release分支上的代码合到dev分支上 3.把本地dev分支上的代码合到远程dev分支上去 1.在idea插件市场安装gitee插件 ...