24.9.1(康托展开)

news2024/11/15 15:33:48

上星期三:

补 24牛客多校 二 C                                                  牛客传送门

思路: 赛时写模拟写的很臭,如果用dp写就很方便

代码如下:

const int N=2e6+10;
const int mod=1e9+7;
ll n;
char s[N][2];
int dp[N][2];
void solve(){
	cin >> n;
	for(int i=1;i<=n;i++) cin >> s[i][0];
	for(int i=1;i<=n;i++) cin >> s[i][1];
	if(s[1][0]=='R') dp[1][0]=(s[1][0]=='R')+(s[1][1]=='R');
	if(s[1][1]=='R') dp[1][1]=(s[1][1]=='R')+(s[1][0]=='R');
	int ans=max(dp[1][0],dp[1][1]);
	for(int i=2;i<=n;i++){
		dp[i][0]=(s[i][0]=='R');
		dp[i][1]=(s[i][1]=='R');
		ans=max(dp[i][0]+dp[i][1],ans);
		if(s[i][0]=='R' && s[i-1][0]=='R')
			dp[i][0]=max(dp[i-1][0]+1,dp[i][0]),ans=max(dp[i][0],ans);
		if(s[i][1]=='R' && s[i-1][1]=='R')
			dp[i][1]=max(dp[i-1][1]+1,dp[i][1]),ans=max(dp[i][1],ans);
		int dp0=dp[i][0],dp1=dp[i][1];
//		if(s[i][1]=='R' && s[i-1][0]=='R' && s[i][0]=='R')
//			dp[i][1]=max(dp0+1,dp[i][1]),ans=max(dp[i][1],ans);
//		if(s[i][0]=='R' && s[i-1][1]=='R' && s[i][1]=='R')
//			dp[i][0]=max(dp1+1,dp[i][0]),ans=max(dp[i][0],ans); //不该判上一列
		if(s[i][0]=='R' && s[i][1]=='R'){
			dp[i][0]=max(dp1+1,dp[i][0]);
			dp[i][1]=max(dp0+1,dp[i][1]);
			ans=max({dp[i][0],dp[i][1],ans});
		}
	}
	if(ans) cout << ans-1 << "\n";
	else cout << 0;
}

因为上星期的题量太少,没咋写周记,就给并掉了

星期二:

补 24牛客多校二 B                                             牛客传送门

题意:给一图和q次询问,每次询问给一图内点集,问子图的最小生成树

题解pdf

思路:最小生成树用kk算法处理,如何取边采用根号分治,若 k <= \sqrt{n},双重循环枚举点集,取出存在的边,若 k > \sqrt{n},枚举 m取出有效边

然后跑克鲁斯卡尔。因为 k的sum是有限制的,所以采用对应的枚举方法可有效降低总体复杂度

代码如下:

const int N=2e5+10,M=210;
const int INF=0x3f3f3f3f;
const int mod=998244353;
ll n;
struct edge{
	int u,v,w;
	bool operator <(const edge &b)const{
		return w<b.w;
	}
}e[N];
map<PII,int>mp; 
int fa[N];
int fnd(int x){
	return fa[x]==x?x:fa[x]=fnd(fa[x]);
}
void solve(){
	int m,q; cin >> n >> m >> q;
	int sq=sqrt(n);
	for(int i=1;i<=m;i++){
		int u,v,w; cin >> u >> v >> w;
		e[i]={u,v,w};
		mp[{u,v}]=w;
		mp[{v,u}]=w;
	}
	sort(e+1,e+m+1);
	while(q--){
		int k; cin >> k;
		vector<int>ve;
		vector<edge>ed;
		unordered_map<int,bool>vi;
		for(int i=1;i<=k;i++){
			int s; cin >> s;
			ve.push_back(s);
			vi[s]=1;
			fa[s]=s;
		}
		if(k<=sq){
			for(int i=0;i<k;i++){
				for(int j=i+1;j<k;j++) if(mp.count({ve[i],ve[j]}))
					ed.push_back({ve[i],ve[j],mp[{ve[i],ve[j]}]});
			}
			sort(ed.begin(),ed.end());
			ll cnt=0,sum=0;
			for(auto t:ed){
				int u=fnd(t.u),v=fnd(t.v);
				if(u==v) continue;
				fa[u]=v;
				sum+=t.w;
				if(++cnt==k-1) break;
			}
			if(cnt==k-1) cout << sum << "\n";
			else cout << "-1\n";
		}else{
			ll cnt=0,sum=0;
			for(int i=1;i<=m;i++) if(vi.count(e[i].u) && vi.count(e[i].v)){
				int u=fnd(e[i].u),v=fnd(e[i].v);
				if(u==v) continue;
				fa[u]=v;
				sum+=e[i].w;
				if(++cnt==k-1) break;
			}
			if(cnt==k-1) cout << sum << "\n";
			else cout << "-1\n";
		}
	}
}

补 24牛客多校 二 I                                          牛客传送门

思路:p【num】【0/1】表示数字 num的左右区间下标

         dp【num】【i】表示数字为num,考虑到第 i个数的最大贡献(i <= p【num】【1】

处理大区间时,需考虑其间的小区间贡献,将区间按长度从小到大排序,对每个区间进行遍历,若遇到包含在内的小区间,对是否转移取max,O(n^2)的复杂度

代码如下:

const int N=2e5+10,M=210;
const int INF=0x3f3f3f3f;
const int mod=998244353;
ll n;
int a[3030*2],p[3030][2];
int id[3030];
ll dp[3030][3030*2];
void solve(){
	cin >> n;
	for(int i=0;i<=n;i++) id[i]=i;
	a[1]=0,p[0][0]=1;
	for(int i=2;i<=n*2+1;i++){
		cin >> a[i];
		!p[a[i]][0]?p[a[i]][0]=i:p[a[i]][1]=i;
	}
	a[n*2+2]=0,p[0][1]=n*2+2;
	n++;
	sort(id,id+n,[&](int a,int b){
		return p[a][1]-p[a][0]<p[b][1]-p[b][0];
	});
//	for(int i=1;i<=n;i++) cout << a[i] << " \n"[i==n];  //注意下标是到n*2
	for(int num=0;num<n;num++){
		int x=id[num];
		dp[x][p[x][0]]=x;
		for(int i=p[x][0]+1;i<=p[x][1];i++){
			dp[x][i]=dp[x][i-1]+x;        //默认贡献为x
			if(p[a[i]][0]>p[x][0] && i==p[a[i]][1])
				dp[x][i]=max(dp[x][p[a[i]][0]-1]+dp[a[i]][i],dp[x][i]);
		}
	}
	cout << dp[0][n*2];
}

星期三:

学了下康托展开,可用来求全排列的编号,树状数组优化后复杂度为O(nlogn)

逆康托可以把编号转为全排列(编号的数据范围需在 20!内,21!会爆 ull

学这个的目的主要是掌握逆康托,如果遇到了可暴力全排列的题且不知正解,可以试着用随机数加上逆康托,生成一个随机的全排列,然后开始暴力枚举一定次数,有极小概率撞上答案,不过此为走投无路之举,且有很大的局限性,慎用

贴个n^2板子:

const int N=2e6+10,M=210;
const int INF=0x3f3f3f3f;
const int mod=998244353;
ll n;
ull fac[N];
ll kt(vector<int> ve){
	ll res=0;
	int sz=ve.size();
	unordered_map<int,bool>vi;
	for(int i=0;i<sz;i++){
		int cnt=0;
		for(int j=1;j<ve[i];j++) if(!vi.count(j)) cnt++;   //可用树状数组优化
		(res+=1ll*cnt*fac[sz-i-1]%mod)%=mod;
		vi[ve[i]]=1;
	}
	return ++res%mod;
}
vector<int> rev_kt(ull k,int len){             //编号和排列长度
	vector<int>ans;
	k--;
	vector<int>ve;
	for(int i=1;i<=len;i++) ve.push_back(i);
	for(int i=1;i<=len;i++){
		int t=k/fac[len-i];
		ans.push_back(ve[t]);
		ve.erase(ve.begin()+t);
		k%=fac[len-i];
	}
	return ans;
}
void solve(){
	cin >> n;
	fac[0]=1;
	for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
	vector<int>ve;
	for(int i=1;i<=n;i++){
		int x; cin >> x;
		ve.push_back(x);
	}
	cout << kt(ve);
}

星期四:

补 24牛客多校 二 G                                            牛客传送门

题意:定义一集合为好集合,需满足元素乘积为平方数即 x^2,此集合权值即为 x。给一数集,问所有为好集合的子集的权值和是多少

贴个dalao题解:2024牛客暑期多校训练营2 - Luckyblock - 博客园 (cnblogs.com)

思路:由平方数考虑到质因子分解,值域1000以内,若存在大于31的质因子,则必定只有一个,且31以内的质数也只有11个,可以状压处理,将所有数分解,若不存在大质数则分解后为1,若存在即为大质数,按此分组,对每组进行转移

如何分解:对于每个数,我们要知道它的小质数的奇偶状态,但除此之外,还要处理出它的偶数个质因子对答案的贡献,即处理为pair值,再分组处理

dp【i】【mask】【0/1】表示考虑到每组第 i个数,小质数奇偶状态为mask,选了 偶/奇个大质数

对于不存在大质数的数,只需关注小质数奇偶状态,第三维暂时用不上,对于每个【ma,v】, 枚举状态进行转移,注意答案除了需乘v外,还需乘上两状态同奇的质数

对于存在大质数的数,按大质数 p分组进行转移,因为答案不断累加,到了下一组后,之前的答案仍保留,不过需要清除选了奇数个p‘(p’<p 的状态的值。接下来仍是枚举状态转移,注意每当 p选了偶数个,dp【now^1】【mask】【0】就需乘上 p

代码如下:

const int N=2e6+10,M=210;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
ll n;
ll dp[2][1<<11][2];
vector<PII>ve[1010];
int p[11]={2,3,5,7,11,13,17,19,23,29,31};
ll cal(int ma1,int ma2){
	ll res=1;
	for(int i=0;i<11;i++) if((ma1&ma2)&1<<i) (res*=p[i])%=mod;
	return res;
}
void solve(){
	cin >> n;
	for(int i=1;i<=n;i++){
		int x; cin >> x;
		ll xma=0,v=1;
		for(int j=0;j<11;j++){
			while(x%p[j]==0){
				if(xma&1<<j) v*=p[j];
				xma^=(1<<j);
				x/=p[j];
			}
		}
		ve[x].push_back({xma,v});
	}
	int now=0;
	dp[0][0][0]=1;
	for(auto [ma,v]:ve[1]){
		for(int mask=0;mask<1<<11;mask++) dp[now^1][mask][0]=dp[now][mask][0];
		for(int mask=0;mask<1<<11;mask++){
			int nmask=mask^ma;
			(dp[now^1][nmask][0]+=dp[now][mask][0]*v%mod*cal(mask,ma)%mod)%=mod;
		}
		now^=1;
	}
	for(int val=32;val<=1000;val++) if(!ve[val].empty()){
		for(int mask=0;mask<1<<11;mask++) dp[now][mask][1]=0;
		for(auto [ma,v]:ve[val]){
			for(int mask=0;mask<1<<11;mask++)
				dp[now^1][mask][1]=dp[now][mask][1],dp[now^1][mask][0]=dp[now][mask][0];
			for(int mask=0;mask<1<<11;mask++){
				int nmask=mask^ma;
				(dp[now^1][nmask][0]+=dp[now][mask][1]*v%mod*cal(mask,ma)%mod*val%mod)%=mod;
				(dp[now^1][nmask][1]+=dp[now][mask][0]*v%mod*cal(mask,ma)%mod)%=mod;
			}
			now^=1;
		}
	}
	cout << (dp[now][0][0]-1+mod)%mod;
}

星期五:

补 24牛客多校 三 A                                          牛客传送门

思路:最少的需要从右往左的趟数为 s= ( n-r ) / ( r-l )向上取整,最后一趟载 r个人,每个来回能有 r-l个人过河。把每个人的体力数处理为能趟一来回的次数 a即a = ( h-1 )/2。

最少要往回趟 s次,每次载 l个人,在贪心即每次运输体力最高的人的前提下,所有人 a的总和最少需要 s*l,若一个人的 a大于 s,那么超出的部分没有意义,所以计算总和时 a需要和 s取min,再和 s*l进行比较

代码如下:

const int N=2e6+10,M=210;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
ll n;
ll a[N];
void solve(){
	int l,r; cin >> n >> l >> r;
	ll s=(n-r+r-l-1)/(r-l),cp=0;
	for(int i=1;i<=n;i++){
		int h; cin >> h;
		a[i]=(h-1)/2;
		cp+=min(a[i],s);
	}
	if(cp>=s*l) cout << "YES";
	else cout << "NO";
}

恐怖故事,摸了两天半鱼,发现已经星期一了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

别再被假WiFi坑!正规品牌教你如何慧眼识珠!随身wifi哪些才是正规品牌?全网最靠谱的随身wifi推荐!

如今的随身 WiFi 市场&#xff0c;可谓是热闹非凡。各种品牌如雨后春笋般涌现&#xff0c;让人眼花缭乱。然而&#xff0c;当流量告急时&#xff0c;我们也不能病急乱投医&#xff0c;随便购买随身 WiFi。毕竟&#xff0c;市场上的随身 WiFi 品牌五花八门&#xff0c;质量参差不…

活动系统开发之采用设计模式与非设计模式的区别-需求设计及拓展

通过活动系统流程图拆分成5个业务流程图 1、签到与滚动抽奖业务流程图 2、签到与答题领取奖品业务流程图 3、签到与抽奖业务流程图 4、答题与组团业务流程图 5、答题与美图分享业务流程图 6、总结 因业务流程相互嵌套&#xff0c;所以将每个系统模板化后可以动态组合目前的子业…

【卷起来】VUE3.0教程-02-模板语法

&#x1f341; 项目目录结构 在上面的案例中&#xff0c;我们创建出了一个vue项目&#xff0c;项目结构如下&#xff1a; .vscode&#xff1a;vscode工具的配置文件node_modules&#xff1a;Vue 项目的运行依赖文件public&#xff1a;资源文件夹&#xff08;浏览器图标&#x…

Leetcode Day18 堆

Python中关于堆的操作 注意, python默认的是最小堆 什么时候想到用堆 A: 流!或者我们只关心k个元素 373 查找和最小的前k对数字 给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff…

Learing——protobuf(一)

目录 前言 一、protobuf的简介 二、编写一个.proto文件 1.选择使用的protobuf版本 2.指定命名空间&#xff08;package&#xff09; 3.定义一个“消息”&#xff08;message&#xff09; 4.定义消息字段 标量类型&#xff1a; 枚举类型(enum): 多选一类型(oneof)&…

论文速读|I-CTRL:通过受限强化学习使人型机器人模仿和控制

论文地址&#xff1a;https://arxiv.org/pdf/2405.08726 I-CTRL&#xff08;Imitation to Control Humanoid Robots Through Constrained Reinforcement Learning&#xff09;是一个旨在解决现有人类运动到人型机器人的转换方法在物理可行性上的不足的框架。该框架通过在非物理…

基础闯关3

一、基础任务 大模型在浮点数大小比较上表现不佳&#xff0c;直接询问大模型浮点数大小往往会出现错误&#xff0c;而通过设定适当的提示词可以引导大模型生成正确的答案。提示工程是指设计和优化输入提示&#xff08;prompts&#xff09;的过程&#xff0c;这些提示用于指导大…

一网统管政企联动:计讯构建城市生命线安全智能体的应急管理革新

城市生命线国家政策推动生命线风险频发 随着城市化进程加速&#xff0c;城市安全问题日益凸显&#xff0c;包括自然灾害、建筑老化、环境污染和公共卫生事件等潜在风险。城市不仅要更新“硬设施”&#xff0c;更在于通过大数据、云计算、5G等新兴技术提升城市管理的“软实力”。…

three.js 开发粒子系统

在 three.js 中开发粒子系统&#xff0c;你通常会使用 THREE.Points 和 THREE.PointsMaterial。这些组件允许你创建一个由大量点组成的系统&#xff0c;每个点都可以代表一个粒子&#xff0c;并可以自定义其大小、颜色、透明度等属性。以下是一个基本的步骤指南&#xff0c;用于…

赞奇科技与华为云共襄828 B2B企业节,激活数字内容“云”创作

8月28日&#xff0c;在2024中国国际大数据产业博览会上&#xff0c;第三届828 B2B企业节正式开幕&#xff0c;旨在融通数智供需&#xff0c;加速企业智改数转&#xff0c;助推中国数智产业实力再升级。 828 B2B企业节是全国首个基于数字化赋能的企业节&#xff0c;由华为联合上…

kafka安装配置、以及遇到闪退问题的解决办法

一、Kafka对于zookeeper是强依赖&#xff0c;保存kafka相关的节点数据&#xff0c;所以安装Kafka之前必须先安装 zookeeper 详细安装过程参见这位大神写的博客 windows系统kafka小白入门篇——下载安装&#xff0c;环境配置&#xff0c;入门代码书写_windows kafka-CSDN博客 注…

【C++11及其特性】智能指针——unique_ptr

unique_ptr目录 一.排他所有权模式二.auto_ptr的缺点1.可以直接复制和拷贝构造2.STL可以直接赋值3.不支持动态内存分配数组 三.unique_ptr(C11)1.不支持直接赋值和构造2.STL可以不可以直接赋值3.支持动态内存分配数组 四.unique_ptr的用法1.构造函数2.赋值操作3.主动释放对象4.…

免费的电脑录屏软件,这几款软件满足录屏需求!

在数字化时代&#xff0c;电脑录屏已成为我们日常生活和工作中不可或缺的一部分。无论是教学演示、游戏直播、会议记录&#xff0c;还是视频创作&#xff0c;一款优秀的录屏软件都是不可或缺的。今天&#xff0c;就为大家推荐几款免费、高效、易用的电脑录屏软件&#xff0c;帮…

首批国自然博士项目获批名单

【SciencePub学术】从公开新闻来看&#xff0c;已经有20所高校的博士生获批项目&#xff0c;分别是北京大学、清华大学、北京航空航天大学、东南大学、复旦大学、华中科技大学、吉林大学、兰州大学、南方科技大学、南开大学、山东大学、上海交通大学、四川大学、武汉大学、南京…

VSCode必备插件!快看过来!

同学同学&#xff0c;你是不是也很头疼VSCode不知道安装什么插件啊&#xff1f;尤其是萌新小白&#xff0c;更是一头雾水&#xff0c;那就快来一起看看吧~我帮你整理了一些非常实用的插件&#xff0c;安装上它们&#xff0c;你的开发体验会大大提升&#xff01; 1. Chinese (S…

DWG如何转换成PDF?总结了四种转换

DWG如何转换成PDF&#xff1f;在日常工作和学习中&#xff0c;经常需要将CAD软件中的DWG文件转换为PDF格式&#xff0c;以便于更广泛地分享和查阅。那么具体要怎么做&#xff0c;才能实现两种格式的顺利转换呢&#xff1f;为了帮助读者轻松完成这一任务&#xff0c;本文将详细介…

网络价格管控行动:四大策略,打击低价

网络价格管控的举措 设定最低售价约束&#xff1a;品牌方能够与在线零售商订立协议&#xff0c;清晰界定产品的最低售价&#xff0c;以守护品牌形象与市场秩序。推行动态定价策略&#xff1a;依照市场需求、竞争态势以及库存状况动态调节产品价格&#xff0c;保障市场竞争力并…

Java爬虫开发:Jsoup库在图片URL提取中的实战应用

在当今的互联网时代&#xff0c;数据的获取和处理变得尤为重要。对于网站内容的自动化抓取&#xff0c;爬虫技术扮演着不可或缺的角色。Java作为一种广泛使用的编程语言&#xff0c;拥有丰富的库支持网络爬虫的开发。其中&#xff0c;Jsoup库以其简洁、高效的特点&#xff0c;成…

51单片机 - 定时器0(按键控制LED流水灯模式)

时间&#xff1a;2024.9.2 目的&#xff1a;手撕51 作者&#xff1a;Whappy 定时器0寄存器配置 1.定时器0配置过程 首先要配置定时器的寄存器TCON和TMOD使计数器开始计数及定时器的初始值&#xff0c;配置使这个链路连起来。 #include <REGX52.H>void Timer0_Init() {…

【HarmonyOS 4.0】鸿蒙应用模型

应用模型是HarmonyOS为开发者提供的应用程序所需能力的抽象提炼&#xff0c;它提供了应用程序必备的组件和运行机制。有了应用模型&#xff0c;开发者可以基于一套统一的模型进行应用开发&#xff0c;使应用开发更简单、高效。随着系统的演进发展&#xff0c;HarmonyOS先后提供…