首页 > 其他分享 >2024.09.14模拟赛总结

2024.09.14模拟赛总结

时间:2024-09-14 13:25:00浏览次数:12  
标签:14 int LL 2024.09 long 数组 freopen mex 模拟

$ T1 $

似乎是签到题,但是没开 $ unsigned $ $ long $ $ long $ 挂成 $ 88 $ 分了。
直接模拟即可,从后往前考虑,将每个数放到离其最近的位置,不过不会证...

#include <bits/stdc++.h>

using namespace std;

typedef unsigned long long LL;

const int N = 1000010;

struct wasd
{
	int ct, v;
} unq[N];
int n, a[N], b[N];
LL res;
map<int, bool> m;
map<int, int> ctn;
vector<LL> ans;

bool cmp(LL a, LL b)
{
	return a > b;
}

int main()
{
	freopen("openhook.in", "r", stdin);
	freopen("openhook.out", "w", stdout);
	
//	cout << mod << '\n';
	scanf("%lld", &n);
	for (int i = 1; i <= n; i ++ ) scanf("%d", a + i);
	for (int i = 1; i <= n; i ++ ) scanf("%d", b + i);
	
	sort(b + 1, b + n + 1);
	sort(a + 1, a + 1 + n);
	int cnt = 0;
	for (int i = 1; i <= n; i ++ )
	{
		if (m.count(a[i])) 
		{
			unq[cnt].ct ++ ;
			continue;
		}
		unq[ ++ cnt].v = a[i];
		unq[cnt].ct = 1;
		m[a[i]] = 1;
	}
	
	int lst_pos = unq[cnt].v + 1;
	for (int j = 1; j < unq[cnt].ct; j ++ )
		ans.push_back(lst_pos - unq[cnt].v), lst_pos ++ ;
	for (int i = cnt; i > 1; i -- )
	{
		ctn[unq[i].v] = lst_pos;
//		cout << unq[i].v << ' ' << lst_pos << "wasn\n";
		lst_pos = unq[i - 1].v + 1;
		while (ctn.count(lst_pos)) lst_pos = ctn[lst_pos];
		for (int j = 1; j < unq[i - 1].ct; j ++ )
		{
//			cout << unq[i - 1].v << ' ' << lst_pos << '\n';
			ans.push_back(lst_pos - unq[i - 1].v);
			lst_pos ++ ;
			while (ctn.count(lst_pos)) lst_pos = ctn[lst_pos];
		}
	}
	int ct = 0;
	sort(ans.begin(), ans.end(), cmp);
	for (auto x : ans) res += x * (LL)b[ ++ ct];
	
	cout << res << '\n';
	
	return 0;
} 
/*
10
1 1 1 1 3 5 5 6 7 7 
1919810 1919810 1919810 1919810 1919810 1919810 1919810 1919810 1919810 1919810 

1 4
3 1
5 2
6 1
7 2

1 + 3 + 1 + 3 + 9
*/

$ T2 $

赛时基本上没有想,毕竟有关 $ mex $ 的题做得还是太少了。
只想到了一个 $ O(n ^ 3) $ 的做法:设 $ f[i][mex] $ 表示前 $ i $ 个数划分时,每段 $ mex $ 为 $ mex $ 的方案数。
大概是因为没有发现性质。

注意到一个性质:
整个数组的 $ mex $ 应当是要等于每个划分段的 $ mex $ 的。
设划分段 $ mex $ 都为 $ X $,整个数组的 $ mex $ 为 $ Y $。
那么 $ 0 \sim Y - 1 $ 应该都在数组中出现过了。
所以可以得出 $ X \ge Y $,再考虑 $ X > Y $ 的情况。
因为整个数组的 $ mex $ 为 $ Y $,那么 $ Y $ 一定没有出现过,所以 $ X $ 只能是 $ Y $。
得到了这个性质,不难想到 DP。
设 $ f_i $ 表示将数组前 $ i $ 位划分的方案数。
状态转移方程即为

$ f_i = \sum_{j = 1}^{i - 1} f_{j - 1} (mex[j, i] = Y)$

然后发现在这个过程中,$ j $ 只会向右移,于是可以用双指针 $ + $ 前缀和优化,是时间复杂度降到 $ O(n) $。

由于是前缀和,所以答案为 $ f_n - f_{n - 1} $。

#include <bits/stdc++.h>
#define lbw 37000000
#define thr 300010

using namespace std;

const int N = 37000010, mod = 1e9 + 7;

int n, a[N], cnt[N];
int f[N], mex;

signed main()
{
	freopen("clods.in", "r", stdin);
	freopen("clods.out", "w", stdout);
	
	int T;
	cin >> T;
	while (T -- )
	{
		cin >> n;
		if (n != lbw)
			for (int i = 1; i <= n; i ++ ) cin >> a[i];
		else 
		{
			int x, y;
			cin >> x >> y;
			a[1] = 0;
			for (int i = 2; i <= n; i ++ )
				a[i] = (a[i - 1] * x + y + i) & 262143;
		}
		
		f[0] = 1;
		for (int i = 0; i <= min(thr, n); i ++ ) cnt[i] = 0;
		for (int i = 1; i <= n; i ++ )
			cnt[a[i]] ++ ;
		mex = 0;
		while (cnt[mex] > 0) mex ++ ;
		for (int i = 0; i <= min(thr, n); i ++ ) cnt[i] = 0;
		int nw = 0, pre = -1;
		for (int i = 1, j = 0; i <= n; i ++ )
		{
			pre = -1;
			cnt[a[i]] ++ ;
			while (cnt[nw] > 0) nw ++ ;
			while (nw >= mex && j <= i)
			{
				j = max(j, 1);
				cnt[a[j]] -- ;
				if (!cnt[a[j]] && a[j] < nw) pre = nw, nw = a[j];
				j ++ ;
			}
			if (~pre)
			{
				j -- ;
				cnt[a[j]] ++ ;
				nw = pre;
			}
			f[i] = f[i - 1];
			if (j > 0) (f[i] += f[j - 1]) %= mod;
		}
		
		cout << (f[n] - f[n - 1] + mod) % mod << '\n';
	}
	
	return 0;
}

标签:14,int,LL,2024.09,long,数组,freopen,mex,模拟
From: https://www.cnblogs.com/MafuyuQWQ/p/18413789

相关文章

  • 二分系列(二分答案)9/14
    一、使结果不超过阈值的最小除数给你一个整数数组 nums 和一个正整数 threshold  ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。(除法结果会向上取整7/3=3)请你找出能够使上述结果小于等于阈值 threshold 的除数中 最小 的那个。思路:......
  • Hume AI 推出 EVI 2 情感模型;OpenAI o1 模型问世,模拟人类思考问题 丨 RTE 开发者日报
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个......
  • 代码随想录算法训练营,9月14日 | 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,23
    530.二叉搜索树的最小绝对差题目链接:530.二叉搜索树的最小绝对差文档讲解︰代码随想录(programmercarl.com)视频讲解︰二叉搜索树的最小绝对差日期:2024-09-14想法:好好利用二叉搜索树中序遍历是有序的性质,设置一个节点表示前一个结点就能很方便的计算差值了Java代码如下:classSo......
  • 必趣CB1核心板、H616主控linux验证IO模拟I2C驱动DS1307时钟芯片
    使用了#include<gpiod.h>内部库作为IO驱动`#ifndef __DS1307_Hdefine__DS1307_HdefineNUM_LEDS21//控制4个GPIO引脚defineCHIPNAME"gpiochip0"//GPIO芯片的名称defineWRITE_CMD 0x00defineREAD_CMD 0x01defineDEV_ADDR0xD0//......
  • PMP模拟考试第94题笔记
    注:obstacle障碍commence 开始priorities 优先事项existingrequirements 现有要求barrier 障碍lackof缺乏在敏捷项目中,障碍(obstacle)指的是阻碍团队按计划推进工作的任何因素。障碍通常会影响团队的生产力和工作进度,因此需要被识别和解决。让我们逐一分......
  • 2024.9.14
    1.如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。2.访问数组中的元素是常数时间操作,或说O(1)操作。一个算法如果能在每个步骤去掉一半数据元素,如二分检索,通常它就取O(logn)时间。用strc......
  • 20240909_141725 c语言 整数类型
    整数型重点演练演练关于c99longlong类型是从c99版本开始有的C99是C语言的一个标准版本,全称为ISO/IEC9899:1999,是C语言的一个官方标准化版本,由国际标准化组织(ISO)和国际电工委员会(IEC)联合发布。C99标准在C89/ANSIC(1989年发布的C语言标准)的基础上进行了扩展和更新,引入了......
  • uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款
    uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款等功能,界面漂亮颜值高,视频商城小工具等,蚂蚁森林种树养鸡农场偷菜样样齐用于视频,商城,直播,聊天等sumer-alipay介绍uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝......
  • 2024.09.13练习总结
    没有参与比赛练习,所以没有赛时总结。$T1,T2$比较简单,似乎是签到题。$T3$题意不是很懂。首先将题目中的要求转换为人话:当两个区间有交,他们必须长度相同。注意到题目中说有$n$个人要上下电梯,且每站只会有一个人的状态改变。那么不难发现对于一段区间$[l,r]$......
  • 9.13 模拟赛(炼石计划 11 月 04日 CSP-S 十连测 #7)
    炼石计划11月04日CSP-S十连测#7【补题】-比赛-梦熊联盟(mna.wang)复盘基本上一眼秒了T1,先写这题。在8:30写完了对拍。用了将近一个小时。然后放到桌面2就没管,一直拍到了比赛结束。T2什么牛魔题面???出题人学过语文吗???T3把题读懂了,但是一直不能正确模拟出样例1,......