JZOJ 4299. 【NOIP2015模拟11.2晚】舳舻牌
题目


思路
倒序 \(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晚】舳舻牌的更多相关文章
- [JZOJ 4307] [NOIP2015模拟11.3晚] 喝喝喝 解题报告
题目链接: http://172.16.0.132/senior/#main/show/4307 题目: 解题报告: 题目询问我们没出现坏对的连续区间个数 我们考虑从左到有枚举右端点$r$,判断$a[ ...
- JZOJ 4298. 【NOIP2015模拟11.2晚】我的天
4298. [NOIP2015模拟11.2晚]我的天 (File IO): input:ohmygod.in output:ohmygod.out Time Limits: 1000 ms Memor ...
- 【NOIP2015模拟11.2晚】JZOJ8月4日提高组T2 我的天
[NOIP2015模拟11.2晚]JZOJ8月4日提高组T2 我的天 题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着 ...
- JZOJ4307. 【NOIP2015模拟11.3晚】喝喝喝
Description
- 【NOIP2015模拟11.2晚】我的天
题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着独立的生活,完全没有意识到其他n个人的存在. 但有一天,村民xiba臻 ...
- 【NOIP2015模拟11.4】JZOJ8月6日提高组T1 刷题计划
[NOIP2015模拟11.4]JZOJ8月6日提高组T1 刷题计划 题目 题解 题意 有\(n\)道题,编号为1~\(n\) 给出\(m\)次操作 每次操作有3种类型 1 \(x\) 表示交了\(A ...
- 【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\)个元素的 ...
- 【NOIP2015模拟11.5】JZOJ8月5日提高组T1 俄罗斯套娃
[NOIP2015模拟11.5]JZOJ8月5日提高组T1 俄罗斯套娃 题目 题解 题意就是说 将1~\(n\)排列,问有多少种方案使得序列的逆序对个数小于\(k\) 很容易想到DP 设\(f[i][ ...
- 【NOIP2015模拟11.4】JZOJ2020年8月6日提高组T2 最优交换
[NOIP2015模拟11.4]JZOJ2020年8月6日提高组T2 最优交换 题目 题解 题意 有一个长度为\(n\)的正整数 最多可以进行\(k\)次操作 每次操作交换相邻两个位置上的数 问可以得 ...
- 【NOIP2015模拟11.5】JZOJ8月5日提高组T3 旅行
[NOIP2015模拟11.5]JZOJ8月5日提高组T3 旅行 题目 若不存在第\(k\)短路径时,输出"Stupid Mike" 题解 题意 给出一个有\(n\)个点的树 问这 ...
随机推荐
- 关于windows上pip安装报错
前言 因为我一直用linux,所以windows上的很多问题我都不怎么记录了,但是昨天去网吧,打算玩玩,遇到了安装第三方库报错,所以我有必要水一篇文章 为什么报错 其实python的第三方库很多不仅仅 ...
- TornadoFx的TableView组件使用
原文: TornadoFx的TableView组件使用 - Stars-One的杂货小窝 最近慢慢地接触了JavaFx中的TableView的使用,记下笔记总结 使用 1.基本使用 TornadoFx ...
- 【每日一题】【动态规划&二分】2022年2月9日-NC91 最长上升子序列(三)
描述给定数组 arr ,设长度为 n ,输出 arr 的最长上升子序列.(如果有多个答案,请输出其中 按数值(注:区别于按单个字符的ASCII码值)进行比较的 字典序最小的那个) 方法1:双层循环实现 ...
- 【大数据面试】【框架】Flume:Source的断点续传、重复数据、Channel选择
〇.用途 流式结构 获取磁盘日志,拦截器过滤后,传递指定数据,写入HDFS或kafka 一.组成-Source.Channel.Sink 事务(put/take) 1.Source---taildir ...
- 什么是NineData?突然就火了
NineData 是集成了 SQL 开发.数据复制.数据备份.数据对比多个模块的云服务,支持混合云(自建库+云数据库的业务架构)和多云(多个不同云厂商数据库组成的业务架构)架构下的企业数据管理,大幅降 ...
- C#11新特性-Raw string literals原始字符串研究、示例
这几天看C# 11的新语法,学习到了Raw string literals 今天给大家分享一下: 原始字符串是字符串的一种新格式. 原始字符串可以包含任意文本,包括空格.新行.嵌入引号和其他特殊字符, ...
- java的基本数据类型自动转换
本文主要内容阐明java的自动数据类型转换 首先明确,数据总是由精度低到精度高方向转换 public class AutoConvert { public static void main(Strin ...
- python Flask 操作数据库
Flask数据库 转载:Flask数据库 - 苦行僧95 - 博客园 (cnblogs.com) Flask-SQLAlchemy Flask-SQLAlchemy是在Flask中操作关系型数据库的拓 ...
- Django简介以及基本使用
目录 Django简介以及基本使用 一.django简介 1.web框架的本质是什么 ? 2.python主流web框架有那些 ? 3.web框架的推导过程 二.基本使用 1.运行django注意事项 ...
- ssm——springMVC整理
目录 1.概念 1.1.什么是SpringMVC 1.2.B/S架构 1.3.MVC结构 1.4.Spring MVC常用名词 1.5.常用注解 1.6.rest和restfull 1.7.Reque ...