首页 > 其他分享 >【题解】CF1854B Earn or Unlock

【题解】CF1854B Earn or Unlock

时间:2023-09-08 17:36:50浏览次数:45  
标签:分数 Earn NN 题解 ll 张牌 CF1854B 我们

你考虑,我们很容易地可以构造一个 \(n^2\) 的 DP

  • \(f_{i,j}\) 表示当前在 \(i\) 张牌,还可以摸 \(j\) 张牌的最大分数。转移也很好转移,你考虑一眼就会。

但是我们显然要缩减复杂度,我们看到数据范围 \(10^5\),想到了根号。

分块???显然不行。莫队???都没有区间查询,怎么行呢?

然后你苦思冥想,到最后也没有想出来这道题。

你考虑其实我们可以把 \(j\) 这一维吃掉,如果我们将继续往下摸牌少去的牌的代价均摊到后面的 \(a_i\) 张牌上,那么我们知道一个 \(i\),即可求出在该点的分数。

即对于位置 \(i\),对应的分数为 \(\sum\limits_{j = 1}^n a_j - i + 1\)。

然后现在我们的要求就变成了看到底能不能在位置 \(i\) 摸到完最后一张牌。

我们可以发现这个转移是 \(n^2\) 的,但是因为状态只有 \(0/1\) 所以说可以使用 bitset 进行优化,让复杂度变为 \(O(\frac {n^2} \omega)\)

处理的时候还有一个细节,就是计算的时候,摸牌的最后一个位置可能会到达 \(2\times n\),我们只需要将 \(a_{n+1\sim2n}\) 都赋值为 \(0\) 即可。

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll NN = 2e5 + 8;
ll n,m,ans;
ll a[NN],pre[NN];
bool f[NN];
bitset<NN> dp;
int main(){
	scanf("%lld",&n);
	pre[0] = 0;dp[1] = 1;
	for(int i = 1; i <= n; ++i)
		scanf("%lld",&a[i]), pre[i] = pre[i-1] + a[i];
	for(int i = 1; i <= n; ++i){
		dp = (dp | (dp << a[i]));
		f[i] = dp[i];dp[i] = 0;
	}
	for(int i = n + 1; i <= 2 * n; ++i) {
		f[i] = dp[i];
		pre[i] = pre[i - 1];
	}
	ans = 0;
	for(int i = 1; i <= 2 * n; ++i) if(f[i]) ans = max(ans, pre[i] - i + 1);
	printf("%lld", ans);
	return 0;
}

标签:分数,Earn,NN,题解,ll,张牌,CF1854B,我们
From: https://www.cnblogs.com/rickylin/p/17688140.html

相关文章

  • 【题解】AtCoder Regular Contest 161
    评价:感觉这场题目质量不咋地啊,都是一些乱搞题A.MakeM题目描述:\(N\)是一个正奇数。我们称一个长度为\(N\)的序列\(S\)是M型序列,当前仅当对于所有的\(i=2,4,6,\dots,N-1\)(即偶数位),都有\(S_{i-1}<S_{i}\)且\(S_{i}>S_{i+1}\)。现在给定你一个长度为\(N\)的序列\(A......
  • CF613D 题解
    一、题目描述:给你一颗$n$个点的树,有$m$组询问。一个点如果被攻占,那么这个点就不能通行了。第$i$次询问给出$k_i$个关键点,关键点不能被攻占。求最少攻占多少个点可以使得关键点两两不连通。若不可能,输出$-1$。数据范围:$1\len,m\le1\times10^5......
  • 9月杂题题解
    arc124_e一种方案的权值为\(\prod\limits_{1\leqi\leqn}b_i\),考虑其组合意义,就是每个人在自己最终的球中选一个。可以发现要么拿自己原来的球,要么拿上一个人传来的球。定义状态:\(f(i,0)\)为第\(i\)个人拿自己的球,考虑前\(i-1\)个人的答案。\(f(i,1)\)为第\(i\)个......
  • nvm有下载版本,切换版本成功,node -v还是切换前的版本问题解决
    是因为在下载nvm之前,电脑中的node版本已经存在了,所以需要将之前的node版本全部清楚干净!卸载node之前请node-v查看一下现在的版本,记住这个版本,切记切记!!!!!控制面板中卸载node.;卸载已安装过的NVM;没装过NVM的就仅仅卸载node去环境变量里面看一下有没有跟nvm和node相关的东西了,有的话全......
  • 【题解】CF1854A2 Dual (Hard Version)
    你考虑我们A1只需要通过自加凑一个最大的数,然后将所有的数都变成正数,最后做一次前缀和即可。(不懂可以看看落谷题解)好,我们现在去看HardVersion的\(31\)次操作怎么分配:前缀和(全为正)/后缀和(全为负)——\(19\)次还剩下\(12\)次,不知道该怎么做。我们的目标便变......
  • 题解 CF1787G【Colorful Tree Again】
    problem贼眉鼠眼有一棵\(N\)个节点的树,这棵树很特殊,每条边都有边权和颜色。果宝特攻会不定时来进攻贼眉鼠眼。具体地,在前\(Q\)个时刻,在每个时刻,会发生以下两个事件之一:果宝特攻摧毁了树上的一个节点\(u\)。贼眉鼠眼修复了树上的一个节点\(u\)。定义一条简单路径......
  • 国标GB28181视频监控EasyGBS接入大量通道时,创建角色接口未响应的问题解决方法
    EasyGBS是一款基于国标GB28181协议的视频云服务平台。它支持多路设备同时接入,并能将视频流以RTSP、RTMP、FLV、HLS、WebRTC等格式分发到多个平台和终端。该平台提供了视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台级联等功能。在视频能力方面,GB28181视频监......
  • CF868E Policeman and a Tree 题解
    Description.树上警察抓小偷。一名警察速度为\(1\),多名小偷速度为\(+\infty\),问多长时间抓到。树点数\(\le50\)Solution.首先不可能抓不到。其次步数不可能超过\(2500\)(每抓完一个小偷走一遍全图)。这启发我们可以直接暴搜每一步,并记忆化。如果状态设为当前在\(x\),那......
  • 【题解】《PTA-Python程序设计》题目集分享
    第1章-1从键盘输入两个数,求它们的和并输出(30分)本题目要求读入2个整数A和B,然后输出它们的和。输入格式:在一行中给出一个被加数在另一行中给出一个加数输出格式:在一行中输出和值。输入样例:在这里给出一组输入。例如:18-48输出样例:在这里给出相应的输出。例如:......
  • 题解 P8165 [eJOI2021] AddK
    不知道为什么这道题还没有题解。Solution对于操作\(1\),由于\(K\le10\),直接暴力单点修改即可。而操作\(2\)的询问,不难发现,最后结果的呈现形式是\[1\timesA_l+2\timesA_{l+1}+3\timesA_{l+2}+...+3\timesA_{r-2}+2\timesA_{r-1}+1\timesA_r\]其中中间可能有一段系数......