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\)个点的树 问这 ...
随机推荐
- 解决mysql本地连接速度慢
解决方法 用127.0.0.1而不用localhost 原因 听说是有什么DNS的反向解析
- JavaEE Day04 MySQL多表&事务
今日内容 多表查询 事务 DCL用于控制权限和管理用户,DBA完成:SQL中四类DDL DML DQL DCL 一.多表查询 1.多表查询_概述 1.1 查询语法 select ...
- ATM项目
ATM项目实战 项目需求分析: 1.注册(密码要加密) 2.登陆 3.查看余额 4.提现(可自定手续费) 5.还款 6.转账 7.查看流水 8.添加购物车功能 (商品可配置) 9.查看购物车功能 10 ...
- 注意看,她叫小美,在地址栏输入URL地址后发生了什么?
注意看,这个用户叫小美,他在地址栏输入了一串URL地址,然后竟然发生了不可思议的事情! 01.输入URL发生了什么? 从输入URL开始,到页面呈现出来,简单来说分为四个步骤: ① 建立连接:建立与服务 ...
- 通过GitHub和阿里云自定义域名实现https认证
在GitHub中的操作 登录GitHub, 点击"Your repositories",进入个人仓库页面: 点击"new",进入新建仓库页面: 仓库名称填写&l ...
- vue项目 h5上拉加载(分页功能)
<template> <div class="receivable"> <div class="application-header fle ...
- Redis数据结构与对象
参考<Redis设计与实现> 系列文章目录和关于我 一丶简单动态字符串 当redis需要的不仅仅是一个字符串字面量,而是一个可以被修改的字符串值时,就会使用SDS(simple dynam ...
- Generator(生成器),入门初基,Coroutine(原生协程),登峰造极,Python3.10并发异步编程async底层实现
普遍意义上讲,生成器是一种特殊的迭代器,它可以在执行过程中暂停并在恢复执行时保留它的状态.而协程,则可以让一个函数在执行过程中暂停并在恢复执行时保留它的状态,在Python3.10中,原生协程的实现手 ...
- Kali Pi 安装 RTL8812AU驱动
今天,我们来实操安装一下昨天的RTL8812的无线网卡驱动. 说明 我们今天使用的网卡是磊科的NW392无线网卡,其主要核心为NW392. 一张32G内存卡 树莓派为树莓派4B 4G-RAM 系统为 ...
- 一个小而美的 C 语言项目
我最近在学习 C 语言,看的一本书叫做 <C Primer Plus>,这本书对 C 语言的描写.特性介绍.代码示例都介绍的比较详细,是小白入门 C 语言非常不错的一本书,还有一本经典书叫 ...