首页 > 其他分享 >CF1793E Velepin and Marketi

CF1793E Velepin and Marketi

时间:2024-09-14 14:24:32浏览次数:9  
标签:个题 Marketi int CF1793E sky read ans Velepin MX

首先发现,每个人过的题是不同的,所以我们不关心过了那些题目。

我们要直接去求分成 \(k\) 组最多的通过数是不容易的。我们可以转换一下,求当 \(i\) 个题通过的时候 __最多__分多少组。为什么记最多,因为化成 \(k\) 个组通过 \(i\) 题可以的情况下,我们可以任意合并两个组,保证依然可以通过 \(i\) 个题。相当于求了上界,方便求答案。

目前已知,要求:当 \(i\) 个题通过的时候 最多分多少组

我们考虑记两个内容 :

\(F_i\) :表示通过前 \(i\) 个题分成了多少组(只关心前 \(i\) 个被分成了多少组)。

\(G_i\) : 表示通过前 \(i\) 个题最少用了多少个人(因为会有后面的拿来充数)。

介绍一下定义,我们要求的其实是一个 \(ans\) 表示 \(i\) 个分组最多通过几道题。因为我求了 \(F_i\) 和 \(G_i\) ,所以我们可以得到所有的人被分成了多少组。即 \((n - G_i) + F_i\) 。将 \(ans_{(n - G_i) + F_i}\) 赋值为 \(i\) ,同时 \(ans_i = \max(ans_i,ans_{i-1})\)。这样就求出了 \(ans\) 数组。

当前可能 \(F_i\) 和 \(G_i\) 记录的情况可能不止过了 \(i\) 道题。但在后面会重新被更改为最大的,所以不影响答案。

关于转移。我们知道将排序后连续一段放在一个组别中一定最优。因为当花费了 \(a_i\) 个人帮助 \(i\) 个人完成了题目,但 \(i-1\) 不在,所以有要花费 \(a_{i-1}\) 来完成第 \(i-1\) 个题目,这显然不优。其次,我们转移中,\(G_i\) 越小转移越优。因为 \(G_i\) 越大那么没用的越少,我们要求最多没用的一定是单个单个分开,所有 \(G_i\) 越大一定不比自己小的优。在 \(G_i\) 相同的情况下,\(F_i\) 越大越好,这就不多解释了。

转移还要分类讨论一下。

\(a_i > i\) :找到 \(1 \sim (a_i - i)\) 中最小的 \(G_j\) ,最大的 \(F_j\)

\(a_i \le i\) :\(F_i = 1\) \(G_i = a_i\)

我们动态求前缀的最小的 \(G_j\) ,最大的 \(F_j\)。

#include<bits/stdc++.h>
#define int long long
#define debug(x) cout<<#x<<"[:]"<<x,puts("");
#define FOR(i,a,b) for(ll i=(a); i<=(b); ++i)
#define ROF(i,a,b) for(ll i=(a); i>=(b); --i)
//
//
//
using namespace std;
inline ll read() {
	ll f = 0, t = 0;
	char c = getchar();
	while (!isdigit(c)) t |= (c == '-'), c = getchar();
	while (isdigit(c)) f = (f << 3) + (f << 1) + c - 48, c = getchar();
	return t ? -f : f;
}
void write(int x) {
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
const int MX = 3e5 + 10;
int a[MX];
int f[MX], g[MX];
int ans[MX], G[MX];
sky pa[MX];
const int inf = 1e18 + 10;
struct sky {
	int a,b,id;
};
sky merge(sky x,sky y) {
	if(x.a < y.a) return x;
	if(x.a > y.a) return y;
	if(x.a == y.a)
		if(x.b > y.b) return x;
		else return y;
}
signed main() {
	ios::sync_with_stdio(0), cout.tie(0);
	int n = read();
	int Q = read();
	FOR(i,1,n) a[i] = read();
	sort(a+1,a+n+1);
	FOR(i,1,n) g[i] = inf;
	FOR(i,1,n) {
		if(i - a[i] >= 1) {
			sky A = pa[i - a[i]];
			f[i] = A.b + 1;
			g[i] = A.a + A.id + a[i] + (i - a[i] - A.id);
		} else f[i] = 1,g[i] = a[i];
		sky B = {g[i] - i, f[i], i};
		pa[i] = merge(B,pa[i - 1]);
	}
	FOR(i,1,n) G[i] = (n - g[i]) + f[i];
	FOR(i,1,n) ans[G[i]] = i;
	ROF(i,n,1) ans[i] = max(ans[i + 1],ans[i]);
	FOR(i,1,Q) {
		int k = read();
		cout<<ans[k]<<" ";
	}
	return 0;
}

——end——

标签:个题,Marketi,int,CF1793E,sky,read,ans,Velepin,MX
From: https://www.cnblogs.com/sirkey2119/p/18413877

相关文章

  • Digital Marketing Strategy Online Media Campaign
    DigitalMarketingStrategyAssessment2: OnlineMediaCampaignClientOverviewOperatingintherestaurantandbarindustry, SpritzSpizzicheria(2016) utiliseslocallysourcedingredientstodeliveritsconsumerswithqualityItaliancuisinesinacordia......
  • BAN 501 Marketing Campaign Budget Allocator
    BAN501Module1ProjectAProjectNameMarketingCampaignBudgetAllocatorProjectDueDateSundayby11:59pmObjectivesPracticeworkingwithvariables,datatypes,andoperators.Implementconditionalstatementsandloopstomakedecisionsandre......
  • CF1793E Velepin and Marketing 题解
    题目大意有\(n\)个读者,第\(i\)年他们要一起读\(k_i\)本书,每一本书至少要让一个人读,每一个人也只能读恰好一本书。如果某一个人\(j\),如果有\(a_j\)个人这一年里和他读了同一本书,那么他就会感到满足。对于所有的\(q\)组询问,每组给定一个\(k_i\),求感到满足的人数的最......
  • Data-driven marketing
    数据驱动营销(Data-drivenmarketing)是一种以数据为基础、借助数据分析和技术手段来指导营销决策和实施的方法。它通过收集、整理、分析和利用各种数据资源,以更加精确、客观和科学的方式来实现市场推广和营销目标。数据驱动营销的核心在于使用数据来了解消费者行为、洞察市场趋势和......
  • Salesforce Marketing Cloud 获取Token
    当我们要调用MarketingCloud的Api时,不管是SOAP还是REST都需要进行验权Authorization。如果我们需要使用v2版本去获取token,我们需要传递5个参数,其中有3个参数是必须要传递的,2个可选参数,参考官网的文档AccessTokenforServer-to-ServerIntegrations|MarketingCloudAPIsand......
  • Dynamics 365 Marketing自定义渠道的步骤
    1.创建2个实体:渠道【new_flashinfosmschannel】、消息模板(配置窗体)注意:如果想用标准消息模板,可以不用创建消息模板标准消息模板效果:   2.导出解决方案,往XML增加一个关系【EntityRelationship】https://learn.microsoft.com/zh-cn/dynamics365/marketing/real-time-mark......
  • CF1793E Velepin and Marketing
    个人思路:从小到大排序,因为一定先满足小的,再满足大的。分组时,我们发现,同一组内的数在排序后的序列内连续,这样更优。因为(不会证)。我们预处理出对于每个出书数量的答案,查询......