首页 > 其他分享 >CF1793E Velepin and Marketing 题解

CF1793E Velepin and Marketing 题解

时间:2024-02-08 20:01:28浏览次数:22  
标签:本书 return int 题解 CF1793E mid long Marketing define

题目大意

有 \(n\) 个读者,第 \(i\) 年他们要一起读 \(k_i\) 本书,每一本书至少要让一个人读,每一个人也只能读恰好一本书。 如果某一个人 \(j\),如果有 \(a_j\) 个人这一年里和他读了同一本书,那么他就会感到满足。

对于所有的 \(q\) 组询问,每组给定一个 \(k_i\),求感到满足的人数的最大值。


\(\text{Solution}\)

我们先将 \(a_i\) 排序,考虑到答案一定是一个前缀 \([1,x]\),不然我们可以交换两个人 \(i \in [1,x]\) 和 \(j \in [x+1,n]\),这样显然不会更劣。

考虑设计一个状态 \(f_i\) 表示前 \(i\) 个人最多可以读 \(f_i\) 本书,且读这 \(f_i\) 本书的人都感觉满足。

转移是很简单的,\(f_i=\max\{f_{i-1},f_{i-a_i}+1\}\)。

接下来考虑怎么对于每一组询问求出答案。

既然答案是一个前缀,那么我们考虑二分这一个前缀,接下来的问题转化为:我们怎么判定前缀 \([1,x]\) 是否合法。

首先我们贪心的想,我们让后面的 \(n-x+1\) 个人每人读一本书。

接下来分为两种情况:

  • 如果后面人数有剩余,那么我们让他们和 \([1,x]\) 中的读统一本书,再判定即可。
  • 如果书有剩余 \(r\) 本,考虑检查 \(f_{x-a_x}\) 是否 \(\geq c\),如果是则我们让前 \(x-a_x\) 个人中不满足的和 \([x-a_x+1,x]\) 中的人读同一本即可。

代码实现很简单。

#include<bits/stdc++.h>

#define fi first
#define se second
#define vc vector
#define db double
#define END exit(0)
#define pb push_back
#define mk make_pair
#define ll long long
#define PI pair<int,int>
#define ull unsigned long long
#define all(x) x.begin(), x.end()
#define err cerr << " -_- " << endl
#define debug cerr << "------------------------" << endl

//useful:
//#define cout cerr
//#define OccDreamer
//#define int long long

using namespace std;

namespace IO{
	inline int read(){
		int X=0, W=0;char ch=getchar();
		while(!isdigit(ch)) W|=ch=='-', ch=getchar();
		while(isdigit(ch)) X=(X<<1)+(X<<3)+(ch^48), ch=getchar();
		return W?-X:X;
	}
	inline void write(ll x){
		if(x<0) x=-x, putchar('-');
		if(x>9) write(x/10);
		putchar(x%10+'0');
	}
	inline void sprint(ll x){write(x);putchar(32);}
	inline void eprint(ll x){write(x);putchar(10);}
}using namespace IO;

const int inf=1e9;
const int MAXN=4e5+5;
const int mod=998244353;

int n, k;
int a[MAXN], f[MAXN];

inline bool judge(int x, int k){
	int c=n-x, rest=c-k;
	if(rest>=0 && x+rest<a[x]) return 0;
	if(rest>=0) return 1;
	k-=c;
	if(a[x]>x) return 0;
	if(f[x-a[x]]>=k) return 1;
	return 0;
}

inline void solve(){
	n=read();
	for(int i=1;i<=n;++i) a[i]=read();
	sort(a+1,a+1+n); f[0]=0;
	for(int i=1;i<=n;++i){
		if(a[i]>i) f[i]=f[i-1];
		else{
			f[i]=f[i-a[i]]+1;
		}
		f[i]=max(f[i-1],f[i]);
	}
	int q=read(), k, l, r, mid;
	while(q--){
		k=read();
		l=1, r=n;
		int c;
		while(l<=r){
			mid=(l+r)>>1;
			if(judge(mid,k-1)) l=mid+1;
			else r=mid-1;
		}
		eprint(r);
	}
	return ;
}

int main(){
	solve();
	return 0;
}

标签:本书,return,int,题解,CF1793E,mid,long,Marketing,define
From: https://www.cnblogs.com/OccasionalDreamer/p/18012078

相关文章

  • CF1735E House Planning 题解
    题目大意一条直线上有\(n\)个房子和两个人,房子的坐标\(d_1,d_2,d_3\dotsd_n\),以及两个人坐标为\(p_1,p_2\)。现在会告诉你两个集合\(S_1=\{|p_1-d_i|,1\leqi\leqn\}\)以及\(S_2=\{|p_2-d_i|,1\leqi\leqn\}\)。这个写法可能不是很规范,但为了美观就写成这样了。......
  • CF1847E Triangle Platinum? 题解
    感谢@swiftc管理反馈的信息,对于题目大意确定的东西进行了完善。交互题。题目大意有一个长度为\(n\)的序列\(a\)满足\(1\leqa_i\leq4\),现在你可以进行不超过\(5500\)次询问,每次询问询问三个数\(1\leqi<j<k\leqn\),你将会得到\(a_i,a_j,a_k\)构成的三角形......
  • [ABC327G] Many Good Tuple Problems 题解
    Description对于一对长度均为\(M\)且元素值在\(\left[1,N\right]\)之间的序列\((S,T)\),定义其为好的当且仅当:存在一个长度为\(N\)的\(01\)序列\(X\),使得其满足如下条件:对于任意\(i\in\left[1,M\right]\),有\(X_{S_i}\neqX_{T_i}\)。给定\(N,M\),求在......
  • CF1918G Permutation of Given 题解
    总体思路本题通过每次在已知序列中加入\(2\)个元素的方法,可以构造出满足条件的序列\(A\),这里提供一种新的构造方法。性质因为序列\(A\)中所有元素构成的可重集与序列\(B\)中所有元素构成的可重集完全相等,所以\(A\)中所有元素之和与\(B\)中所有元素之和相等。\[\s......
  • SP277 CTGAME - City Game 题解
    题目传送门前置知识单调栈解法令\(f_{i,j}(1\lei\len,1\lej\lem)\)表示从\((1,j)\)到\((i,j)\)中以\((i,j)\)结尾的均为F的子串长度,即\((i,j)\)上面可延伸的最大距离(子矩形的长)。用单调栈的第一维存储子矩形的长,第二维存储子矩形的宽。考虑依次枚举每一......
  • qoj8171 Cola 题解
    题目链接点击打开链接题目解法很牛的题!!!会不了一点令\(pref_i\)表示第\(i\)轮知道了前缀\([1,...,i]\)考虑怎样的\(pref\)序列是合法的(即采用最优策略):\(pref_0=0\)\(\forall_{i\in[0,n-1]}\;pref_i\lepref_{i+1}\)\(pref\)中\(x\)的出现次数\(\len-x-1\),因......
  • [AGC021E] Ball Eat Chameleons 题解
    Description有\(n\)只变色龙,一开始都是蓝色。现在你喂了\(k\)次球,每次指定一只变色龙吃下你指定颜色的球。一只变色龙从蓝色变成红色当且仅当它吃的红球比蓝球多;一只变色龙从红色变成蓝色当且仅当它吃的蓝球比红球多。求最后能使所有变色龙都变成红色的方案数。两个方案......
  • AT_abc270_g [ABC270G] Sequence in mod P 题解
    题目传送门前置知识大步小步算法解法递推式为\(x_{n}=(ax_{n-1}+b)\bmodp\),发现可以统一消去\(\bmodp\),只在最后参与计算。以下过程省去模运算。当\(x_{0}=t\)时,则\(n=0\)即为所求。当\(a=0,x_{0}\net\)时,递推式转化为\(x_{n}=b\bmodp\)。若\(b=t\),则......
  • UVA10225 Discrete Logging 题解
    题目传送门前置知识大步小步算法题意多组询问,每次询问依次给定\(p,a,b\),求\(a^{x}\equivb\pmod{p}\)的最小非负整数解,其中\(a,p\)互质。解法BSGS板子题,不做过多介绍。貌似本题比P3846[TJOI2007]可爱的质数/【模板】BSGS和BZOJ3239DiscreteLogging数据较强......
  • [AGC041F] Histogram Rooks 题解
    题目链接点击打开链接题目解法好牛(难)的题!!!所有都被覆盖不难想到容斥暴力的容斥是钦定集合\(S\)中的位置都没被覆盖,然后把不能填棋子的点都去掉,假设剩下的不受限制的点的个数为\(c\),则答案为\(\sum2^c(-1)^{|S|}\)这个暴力是很难直接优化的如果一列被有点被钦定了,那么......