9.28 daimayuan 模拟赛总结

news2024/9/30 5:02:36

感觉 -S 模拟赛时间好紧啊

复盘

8:00 开题

扫了一遍四道题,感觉 T1 很典,T2 有点神秘,T3 计数,但限制是简单的,看上去非常可做;T4 也有点神秘

推 T1,先定根,然后树形dp是显然的,这样有 n 2 n^2 n2 了,然后一般套路就是接下来推怎么换根…下意识觉得换根细节可能会比较多,决定先推一下别的性质

然后就突然蒙出来一个结论:当 a n s ≥ 2 ans\geq 2 ans2 时,路径必定经过重心,跑一次 O ( n ) O(n) O(n) dp 就行了

想了想怎么证明,发现考虑一个类似点分治的过程,第一次选出全局重心是不会比后面差的,所以应该是对的

8:50 过了大样例,然后突然想到没有处理 a n s = 1 ans=1 ans=1 的情况,想了一会,大概 9:10 写完交了

然后又磨了一会,手玩了几组样例,越发觉得这个结论是对的。

感觉花的时间有点长了,决定开下一道题已经 9:30 了

决定先推 T3,每一步思路都很顺畅,最后走到环上独立集,需要背包合并,表面看是 n 3 n^3 n3,实际分析一下发现和树上背包一样是 n 2 n^2 n2 的,于是开写

10:30 写完了,样例没过,调到 10:50 过了大样例

赶紧开 T2 ,发现其实和以前见过的某道题很像,直接二分求就行了,然后潜意识认为和之前那道题一模一样,求 [ l , r ] [l,r] [l,r] 元素的和

细节不少,看了眼时间不是很多,有点急

终于写完,已经 11:40,准备测样例看到是输出每个元素的值?才发现看错题了

简单想了想感觉最后那部分有点细节,不太好做,一时间决定打个暴力就润了

然后就结束了

结果是

65 + 35 + 100 + 0 = 200 , rk O ( n ! ) O(n!) O(n!)

  • T1 以为是结论假了,最后经提醒发现是多测没清空!唉
    其实如果往换根的方向想一想就可以得到一个正确性完全有保证且细节少的做法,不用浪费那么久的…

  • T2 最后就差一步了,那个东西可以直接暴力枚举所有元素的,时间太紧没想清楚

  • T4 应该看看的,没想象中的那么不可做

题解

T3

在这里插入图片描述

看到错排,反着来显然更好做,直接考虑容斥:钦定 c c c x x x 个位置填的数与 a a a b b b 相等,剩下随便。设钦定的方案数为 g x g_x gx,那么答案可以表示为 ∑ x = 0 n ( − 1 ) x g x ( n − x ) ! \sum_{x=0}^n (-1)^xg_x(n-x)! x=0n(1)xgx(nx)!

考虑怎么求 g x g_x gx,朴素的想法是枚举在 a a a 中钦定 A A A 个位置, b b b x − A x-A xA 个,方案数为 ∑ ( A n ) ( x − A n − A ) \sum\Large(^n_A)(^{n-A}_{x-A}) (An)(xAnA)

手画一下发现这样会算到一些不合法的,举个例子:

在这里插入图片描述

如果我在 a a a 中选出了 2 , 3 2,3 2,3 两个数,接下来又再 b b b 中选出 2 2 2 这个数,那么对于 2 2 2 这个数字来说,不可能 c 4 , c 6 c_4,c_6 c4,c6 同时等于 2 2 2,所以这是一种不合法的钦定

考虑对这个再进行一次容斥:从 1 ∼ n 1\sim n 1n 种数中选出 s s s 数,钦定这些数在 a a a b b b 中都被选出来了,设该方案数为 h s h_s hs

h s h_s hs 来求 g x g_x gx,已经选出了 s s s 种数,也就是钦定了 2 s 2s 2s 个位置,剩下需要再钦定 x − 2 s x-2s x2s 个位置,直接组合数

g x = ∑ s = 0 x ( − 1 ) s h s ( x − 2 s n − 2 s ) ∑ i = 0 ( i x − 2 s ) g_x=\sum_{s=0}^x (-1)^sh_s\large(^{n-2s}_{x-2s})\sum_{i=0}(^{x-2s}_i) gx=s=0x(1)shs(x2sn2s)i=0(ix2s)

最后的求和含义是把选出的位置分配到 a a a b b b 中,显然是组合数一行的和

考虑求 h s h_s hs,发现这个选数不能随便组合数,因为可能同一个位置的上下两个数都被选到,如上图, 2 2 2 3 3 3 是不能同时被钦定的 (在位置4产生了冲突)

我们分析一下这个限制的本质是什么:建出代表 1 ∼ n 1\sim n 1n n n n 个点,对每个位置的上下两个数连边,有边直接相连的两种数不能被同时钦定

容易发现这样形成的必定是若干个环,每个环是独立的,求出单个环的方案后 分组背包合并一下即可求出整个的方案

n 元环 k 元独立集计数

对于一个环,设 f l e n , x f_{len,x} flen,x 表示长 l e n len len 的环中选出 x x x 个不相邻的点的方案,枚举 1 1 1 号点是否被选择即可破环成链

链上选出若干个不相邻的点就很好做啦

#include<bits/stdc++.h>
using namespace std ;

typedef long long LL ;
const int N = 1010 , mod = 1e9+7 ;

int n , a[N] , b[N] ;
LL l[N][N] , C[N][N] , fac[N] , Pw[N] ;
int tmp[N] , len , pos[N] ;//环 
bool vis[N] ;
LL dp[N] ;//考虑前i个环,一共选了x个 
inline LL V( int len , int x )
{
	if( len <= 3 ) {
		if( x == 0 ) {
			return 1 ;
		}
		if( x == 1 ) {
			return len ;
		}
		return 0 ;
	}
	return (l[len-1][x]+l[len-3][x-1])%mod ;//x!=0
}
inline LL pw( int x )
{
	if( x&1 ) return -1 ;
	return 1 ;
}
void solve()
{
	scanf("%d" , &n ) ;
	for(int i = 1 ; i <= n ; i ++ ) {
		scanf("%d" , &a[i] ) ;
		pos[a[i]] = i ;
		vis[i] = 0 ;
	}
	for(int i = 1 ; i <= n ; i ++ ) {
		scanf("%d" , &b[i] ) ;
	}
	len = 0 ;
	for(int i = 1 ; i <= n ; i ++ ) {
		if( vis[i] ) continue ;
		int now = i , cnt = 0 ;
		while( 1 ) {
			if( vis[now] ) break ;
			vis[now] = 1 ;
			cnt ++ ;
			now = pos[b[now]] ;
		}
		tmp[++len] = cnt ;
 	}
 	int sum = 0 ;
 	for(int i = 0 ; i <= n ; i ++ ) dp[i] = 0 ;
 	dp[0] = 1 ;
 	for(int i = 1 ; i <= len ; i ++ ) {
 		for(int j = sum ; j >= 0 ; j -- ) {
 			for(int k = tmp[i]/2 ; k >= 1 ; k -- ) {
 				dp[j+k] = ( dp[j+k] + dp[j]*V(tmp[i],k) ) % mod ;
			}
		}
 		sum += tmp[i] ;
	}
	LL ans = 0 ;
	for(int x = 0 ; x <= n ; x ++ ) {
		LL g = 0 ;
		for(int s = 0 ; s <= x && 2*s<=x ; s ++ ) {
			g = ( g + pw(s)*dp[s]*C[n-2*s][x-2*s]%mod*Pw[x-2*s] ) % mod ;
		}
		ans = ( ans + pw(x)*g*fac[n-x] ) % mod ;
	}
	printf("%lld\n" , (ans+mod)%mod ) ;
}
void pre_work( int n )
{
	for(int i = 0 ; i <= n ; i ++ ) {
		C[i][0] = 1 ;
		for(int j = 1 ; j <= i ; j ++ ) {
			C[i][j] = ( C[i-1][j] + C[i-1][j-1] ) % mod ;
		}
	}
	l[0][0] = 1 ; fac[0] = 1 ; Pw[0] = 1 ;
	for(int i = 1 ; i <= n ; i ++ ) {
		fac[i] = fac[i-1] * i % mod ;
		Pw[i] = Pw[i-1] * 2 % mod ; 
		for(int j = 0 ; j <= i ; j ++ ) {
			if( i == 1 && j == 1 ) l[i][j] = 1 ;
			else l[i][j] = ( l[i-1][j] + ((i>=2&&j>=1)?l[i-2][j-1]:0) ) % mod ;//链独立集
		}
	}
}

int main()
{
	pre_work(1001) ;
	int t ;
	scanf("%d" , &t ) ;
	while( t -- ) solve() ;
	return 0 ;
}

T4

在这里插入图片描述
在这里插入图片描述
怪怪的题

下面钦定 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 0 0 0

朴素的想法是区间dp ,设 f [ l ] [ r ] [ 0 / 1 / 2 ] f[l][r][0/1/2] f[l][r][0/1/2] 表示 [ l , r ] [l,r] [l,r] 这一段能否全删成某种状态,转移枚举最后一个没被删的位置可以做到 O ( n 3 ) O(n^3) O(n3)

正解考虑寻找一种删数的通法

0 0 0 为例,考虑它的前面怎样能删完

显然当前面全是 1 1 1 时是可以的,那么我们大概的想法就是让 2 2 2 先吃掉所有 0 0 0,留下来的 1 1 1 吃完 2 2 2,最后这个 0 0 0 把前面 1 1 1 吃完

第二步中,只留一个 1 1 1 就够了,优先让 2 2 2 0 0 0 吃完

那么考虑以一个 1 1 1 为分界线,前后需要消成没有 0 0 0。先考虑前半部分,另一半是对称的

发现只要有一个 2 2 2 ,不管有多少 0 都可以消完;若没有 2 2 2,那就只能全是 1 1 1

这是十分充要的

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

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

相关文章

【Android】Jetpack组件之LifeCycle

引言 Lifecycle组件是Android Jetpack架构组件之一&#xff0c;它提供了一种方法来管理Android组件&#xff08;如Activity、Fragment和服务&#xff09;的生命周期。Lifecycle组件帮助你执行与生命周期相关联的操作&#xff0c;确保在适当的时间发生适当的事情&#xff0c;例…

服务器几核几G几M是什么意思?如何选择?

服务器几核几G几M是什么意思&#xff1f;我们建站、搭建网络平台都要用到云服务器&#xff0c;不管在腾讯云、阿里云还是别的云服务平台选购&#xff0c;都会接触到服务器配置。云服务器就是把物理服务器&#xff08;俗称“母鸡”&#xff09;&#xff0c;用虚拟机技术虚拟出多…

LeetCode: 1971. 寻找图中是否存在路径

寻找图中是否存在路径 原题 有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n - 1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点…

mips指令系统简介

**MIPS&#xff08;Microprocessor without Interlocked Piped Stages&#xff09;**&#xff1a;这是一种RISC&#xff08;精简指令集计算&#xff09;芯片架构&#xff0c;由John L. Hennessy设计&#xff0c;特点是没有内部互锁的流水级&#xff0c;简化了处理器设计。 对比…

python Scrapy 框架断点设置

文章目录 前言python Scrapy 框架断点设置1. 常用的 pdb 调试命令2. 示例流程 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖…

等保2.0数据库测评之优炫数据库测评

一、优炫数据库介绍 优炫数据库系统主要包含&#xff1a;优炫数据库&#xff08;以下简称UXDB&#xff09;、优炫数据库管理平台&#xff08;以下简称 UXDBWeb&#xff09;和优炫数据库图形化开发软件&#xff08;以下简称UXDBAdmin&#xff09;。UXDB是一款数据库软件&#x…

求恰好为k 的区间数量(滑动窗口进阶版)

前言&#xff1a;之前做的滑动窗口都是可以直接一遍过&#xff0c;然后每次右边确定了以后&#xff0c;左边不断缩小寻找最优解 但是这个题目呢我们不仅要保证我们的辅音字母的个数恰好为k&#xff0c;其他元音字母的个数只要每个都出现了就行&#xff0c;这个就导致我们不能用…

解析时间字符串为毫秒

Java 8中现已包含持续时间解析为纳秒再转换成毫秒 PeriodFormatter formatter new PeriodFormatterBuilder().appendDays().appendSuffix("d ").appendHours().appendSuffix("h ").appendMinutes().appendSuffix("min").toFormatter();Period p…

7. 机器人项目

在 “项目 ”章节中&#xff0c;我会暂时停止向你灌输新的理论&#xff0c;而是让我们一起完成一个程序。学习编程&#xff0c;理论是必要的&#xff0c;但阅读和理解实际程序同样重要。 本章的课题是建立一个自动机&#xff0c;一个在虚拟世界中执行任务的小程序。我们的自动机…

plt.bar函数介绍及实战

目录 plt.bar() 函数实战 plt.bar() 函数 plt.bar() 函数是 Matplotlib 中用于创建柱状图的函数。它用于在图形中绘制一个或多个柱状图&#xff0c;通常用于展示类别型数据的数量或大小的比较。 基本语法&#xff1a; plt.bar(x, height, width0.8, bottomNone, aligncenter…

【css】常见布局概述

本文将对css的常见布局方案进行概述&#xff0c;给大家提供系统化的布局解决方案参考。 一、流式布局 二、浮动布局 三、定位布局 四、弹性布局 五、网格布局 一、流式布局 顾名思义&#xff0c;该布局基于dom的文档流进行布局&#xff0c;是最常用、最原始的布局方式。 …

ThinkPHP发送邮件教程:从配置到发送指南!

ThinkPHP发送邮件功能实现策略&#xff1f;Thinkphp如何发邮件&#xff1f; ThinkPHP作为一个流行的PHP框架&#xff0c;提供了强大的邮件发送功能&#xff0c;使得开发者可以轻松地在应用中集成邮件发送功能。AokSend将详细介绍如何在ThinkPHP中配置和发送邮件。 ThinkPHP发…

Goland 设置GOROOT报错 The selected directory is not a valid home for Go SDK

问题描述 将go版本从1.16升级到1.22时配置GoRoot报错了如下图问题 The selected directory is not a valid home for Go SDK起因的是我的这个goland比较老了&#xff0c;2020年的。所以需要设置下版本 解决 OK&#xff0c;说一下解决办法&#xff1a; 找到go的安装路径&am…

Tomcat架构解析

Tomcat: 是基于JAVA语言的轻量级应用服务器&#xff0c;是一款完全开源免费的Servlet服务器实现。 1. 总体设计 socket: 其实就是操作系统提供给程序员操作“网络协议栈”的接口&#xff0c;你能通过socket的接口&#xff0c;来控制协议&#xff0c;实现网络通信&#xff0c;达…

.Net 6.0 监听Windows网络状态切换

上次发了一个文章获取windows网络状态&#xff0c;判断是否可以访问互联网。传送门&#xff1a;获取本机网络状态 这次我们监听网络状态切换&#xff0c;具体代码如下&#xff1a; public class WindowsNetworkHelper {private static Action<bool>? _NetworkStatusCh…

《Programming from the Ground Up》阅读笔记:p117-p146

《Programming from the Ground Up》学习第8天&#xff0c;p117-p146总结&#xff0c;总计30页。 一、技术总结 1.共享函数用法示例 (1)不使用共享函数 linux.s&#xff1a; # filename:linux.s# system call numbers(按数字大小排列&#xff0c;方便查看) .equ SYS_READ,…

FreeRTOS学习笔记一——FreeRTOS介绍

RTOS学习笔记&#xff0c;主要参考正点原子教程 目录 FreeRTOS特点任务调度方式抢占式调度时间片调度 任务状态状态转换任务列表 FreeRTOS特点 实现多个任务功能划分延时函数实现任务调度高优先级抢占低优先级每个任务都有自己的栈空间 注意&#xff1a; 中断可以打断任意任务…

Spring依赖注入推荐使用构造函数注入而非@Autowired

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl在Spring框架中,依赖注入(Dependency Injection, DI)是实现组件之间松耦合的关键技术。Spring支持多种依赖注入方式,其中构造函数注入和基于@Autowired注解的注入是两种常见的方法。然而,Spri…

活体检测标签之2.4G有源RFID--SI24R2F+

首先从客户对食品安全和可追溯性的关注切入&#xff0c;引出活体标签这个解决方案。接着分别阐述活体标签在动物养殖和植物产品方面的应用&#xff0c;强调其像 “身份证” 一样记录重要信息&#xff0c;让客户能够了解食品的来源和成长历程&#xff0c;从而放心食用。最后呼吁…

手机USB连接不显示内部设备,设备管理器显示“MTP”感叹号,解决方案

进入小米驱动下载界面&#xff0c;等小米驱动下载完成后&#xff0c;解压此驱动文件压缩包。 5、小米USB驱动安装方法&#xff1a;右击“计算机”&#xff0c;从弹出的右键菜单中选择“管理”项进入。 6、在打开的“计算机管理”界面中&#xff0c;展开“设备管理器”项&…