11.6 校内模拟赛总结

打的很顺的一场

复盘

7:40 开题,看到题目名很interesting

T1 看起来很典,中位数显然考虑二分,然后就是最大子段和;T2 构造?一看数据范围这么小,感觉不是很难做;T3 神秘数据结构;T4 看到数据范围,这不是我们广义串并联图吗?不过感觉应该有别的做法

7:50 开写,T1 很快过了大样例,感觉不是很能挂

8:00 看 T2,显然有 2 n + m 2^{n+m} 2n+m 的暴搜,然后先枚举行,每一列的值就定了,然后就是个背包?显然折半搜索。没什么细节,8:40 交了

看 T3,删除操作显然倒过来变成加边; 2 2 2 操作显然是问是否在一个边双里,可以先把最终状态下边双缩点,然后开始手玩,发现加一条边可以看作把树上两点间路径缩成一个点,这个过程有点抽象啊

上个厕所,冷静一下发现这个其实是能做的,直接从两端点暴力往上跳,每次合并给当前点的父亲,改编号的操作可以启发式来维护。这样就有 O ( n log ⁡ n + n α ( n ) ) O(n\log n+n\alpha (n)) O(nlogn+nα(n)) 的做法了, 8 × 1 0 5 8\times 10^5 8×105 应该不会卡 log ⁡ \log log

9:10 开写了,写完了困难的 tarjan 后猛然意识到图不连通!发现这就有点难做了,合并两棵树是不好做的,树的形态不固定没法找 LCA

再冷静一会,其实我可以把这些树边都保留下来?应该不影响答案,太对了啊

过程中发现启发式根本没必要,并查集直接维护即可

写写写,到最后一步 两个点往上跳, 先写了个暴力的做法验了验有没有写挂,发现确实挂了

改过后发现满数据竟然只跑 2.4 s 2.4s 2.4s?可是我这最坏复杂度 n 2 n^2 n2

还是改成复杂度正确的做法了,交了,此时 10:10

本地大样例跑 2.1 s 2.1s 2.1s,不是吧我都没 log ⁡ \log log 了还这么慢?考虑卡常

加上了手写快读,本地变成 1.3 s 1.3s 1.3s 了,可是时限 1 s 1s 1s

尝试输出运行时间,发现光读入就用了 0.6 s 0.6s 0.6s !于是立刻申请超级快读

拿到了超级快读的我发现读入只用 0.06 s 0.06s 0.06s,跑大样例只用 0.7 s 0.7s 0.7s

此时 10:30,开 T4 !

发现很唐的 B ( n ) B(n) B(n) 做法给了 50pts,然后是树上似乎也不是很难

很快写完了暴搜,发现 B ( n ) B(n) B(n) 不仅能跑过 n = 12 n=12 n=12 n = 13 , 14 n=13,14 n=13,14 也可以

于是启发我们广义串并联图缩完点后直接暴力,发现可以获得比树的做法多整整 10pts 的好成绩

中间又去想了想正解怎么做,类似毒瘤那个题,大概两个方向:要么就是广义串并联图,但缩完点后的暴力得优化一下;要么考虑生成树,然后加边

前者想了很久到最后最快只能得到 3 n 3^n 3n 的做法,后者往容斥去想,发现信息根本没法维护,就算按 dfs 序全是返祖边感觉也记录不了

决定写更简单的树,显然直接 d p dp dp,11:40 交了

剩下 20min 写广义串并联也写不完了,就又想了想正解怎么做,无果

结果是

100 + 100 + 100 + 70 = 370

差点挂分

看了赛时提交,T2 同一个做法,用 scanf 的得了 60,用 read 的得了 90,用 超级快读 的得了 100,逆

发现 T3 其实没必要写 tarjan,直接建最终的那棵最大生成树,然后正常的去缩环就行。( 没事复习了 tarjan 显然不亏啊!

T4 还是没想到正解啊,最后还是有点理不清哪些信息是重要的,需要维护的

题解

T3

在这里插入图片描述

T4

在这里插入图片描述
n ≤ 12 n\leq 12 n12,注意要用集合划分的方式去搜,不会 TLE

从树上做法和暴力,我们可以拓展:

考虑往树上加边,不妨认为加的都是返祖边(后来发现这个没什么用),那么该边的权值与相连两个点的颜色有关

N = m − n + 1 N=m-n+1 N=mn+1,发现这样的点只有 2 N 2N 2N 个,也就是说,我们关注颜色的点只有这么多,剩下的可以在 dp 里算贡献

那么考虑对于这 2 N 2N 2N 个点集合划分,接下来效仿树上做法,设状态 f i , c f_{i,c} fi,c 表示 i i i c c c 颜色时子树地贡献,特别地,若 c = 0 c=0 c=0,代表 i i i 的颜色与划分出的集合都不相同

转移小分讨一下。对于这 2 N 2N 2N 个点的限制,实际上只需把 f f f 数组的初值特殊赋即可

这个做法的复杂度加上前缀和优化就是 B ( 2 N ) N n B(2N)Nn B(2N)Nn

进一步优化:是否真的需要 2 N 2N 2N 个点的颜色信息呢?其实不用,对于每条边只要有一个点的颜色枚举即可,另一个点可以在 d p dp dp 到这个点时根据颜色直接算贡献,乘到答案里

就 ok 了

int n , m , K ;
struct nn
{
	int x , y , A , B ;
}e[N] ;
LL ksm( LL a , LL b )
{
	LL res = 1 , t = a % mod ;
	while( b ) {
		if( b&1 ) res = res * t % mod ;
		b = b >> 1 ;
		t = t * t % mod ;
	}
	return res ;
}
namespace subtask1
{
	const int N1 = 15 ;
	int w[N1] ;
	LL ans , g[N] ;
	void calc( int cnt )
	{
		LL res = g[cnt] ;
		for(int i = 1 ; i <= m ; i ++ ) {
			if( w[e[i].x]!=w[e[i].y] ) res = res * e[i].A % mod ;
			else res = res * e[i].B % mod ;
		}
		ans = ( ans + res ) % mod ;
	}
	void dfs( int x , int nw )
	{
		if( x == n+1 ) {
			calc(nw) ;
			return ;
		}
		// 新开
		w[x] = nw+1 ;
		dfs( x+1 , nw+1 ) ;
		// 
		for(int i = 1 ; i <= nw ; i ++ ) {
			w[x] = i ;
			dfs(x+1,nw) ;
		}
	}
	void solve()
	{
		g[0] = 1 ;
		ans = 0 ;
		for(int i = 1 ; i <= n ; i ++ ) g[i] = g[i-1]*(K-i+1)%mod ;
		dfs(1,0) ;
		printf("%lld\n" , ans ) ;
	}
}
struct edg
{
	int lst , to , id ;
}E[2*N] ;
int head[N] , tot = 1 ;
inline void add( int x , int y , int id )
{
	E[++tot] = (edg){head[x],y,id} ;
	head[x] = tot ;
}
namespace subtask2
{
	const int M = 5010 ;
	LL f[N][M] , Sum[N] ;
	void dfs( int x , int fa )
	{
		for(int i = 1 ; i <= K ; i ++ ) f[x][i] = 1 ;
		Sum[x] = 0 ;
		for(int i = head[x] ; i ; i = E[i].lst ) {
			int t = E[i].to ;
			if( t == fa ) continue ;
			dfs( t , x ) ;
			for(int j = 1 ; j <= K ; j ++ ) {
				f[x][j] = f[x][j] * (((Sum[t]-f[t][j])*e[E[i].id].A+f[t][j]*e[E[i].id].B)%mod) % mod ;
			}
		}
		for(int i = 1 ; i <= K ; i ++ ) Sum[x] = ( Sum[x] + f[x][i] ) % mod ;
	}
	void solve()
	{
		for(int i = 1 ; i <= m ; i ++ ) {
			add( e[i].x , e[i].y , i ) ;
			add( e[i].y , e[i].x , i ) ;
		}
		dfs( 1 , 0 ) ;
		printf("%lld\n" , (Sum[1]+mod)%mod ) ;
		tot = 0 ;
		memset( head , 0 , sizeof head ) ;
	}
}
namespace subtask3
{
	// emmm 似乎并不依赖返祖边的性质 
	const int M = 15 ;
	int dfn[N] , tim , Y[M] , R , nam[N] ;
	bool tree[N<<1] ;
	void dfs1( int x , int inE )
	{
		dfn[x] = ++tim ;
		for(int i = head[x] ; i ; i = E[i].lst ) {
			if( i==(inE^1) ) continue ;
			int t = E[i].to ;
			if( !dfn[t] ) tree[i] = 1 , dfs1(t,i) ;
			else {
				if( dfn[t]<dfn[x] ) Y[++R] = t ;//返祖边 
			}
		}
	}
	int w[M] , col ;
	LL ans , f[N][M] , Sum[N] ;// 1~col 表示划分出的这几种颜色,0 表示与这些都不同 
	void dfs3( int x , int inE )
	{
		for(int i = 1 ; i <= col ; i ++ ) {
			if( nam[x] ) f[x][i] = 0 ;
			else f[x][i] = 1 ;
		}
		if( nam[x] ) f[x][w[nam[x]]] = 1 , f[x][0] = 0 ;
		else f[x][0] = 1 ;
		Sum[x] = 0 ;
		for(int i = head[x] ; i ; i = E[i].lst ) {
			if( i==(inE^1) ) continue ;
			int t = E[i].to ;
			if( tree[i] ) {
				dfs3( t , i ) ;
				for(int j = 1 ; j <= col ; j ++ ) {
					f[x][j] = ((f[t][0]*(K-col)%mod+Sum[t]-f[t][j])*e[E[i].id].A+f[t][j]*e[E[i].id].B) % mod * f[x][j] % mod ;
				}
				f[x][0] = ((Sum[t]+f[t][0]*max(0,(K-col-1)))%mod*e[E[i].id].A+f[t][0]*e[E[i].id].B)%mod*f[x][0]%mod ;
			}
			else {
				if( dfn[t]<dfn[x] ) {
					int c = w[nam[t]] ;
					for(int j = 1 ; j <= col ; j ++ ) {
						if( j == c ) f[x][j] = f[x][j]*e[E[i].id].B%mod ;
						else f[x][j] = f[x][j]*e[E[i].id].A%mod ;
					}
					f[x][0] = f[x][0]*e[E[i].id].A%mod ;
				}
			}
		}
		for(int j = 1 ; j <= col ; j ++ ) {
			Sum[x] = ( Sum[x] + f[x][j] ) % mod ;
		}
	}
	LL g[N] ;
	void calc( int cnt ) // cnt 个集合 
	{
		col = cnt ;
		dfs3( 1 , 0 ) ;
		for(int j = 1 ; j <= col ; j ++ ) {
			ans = ( ans + f[1][j]*g[col] ) % mod ;
		}
		ans = ( ans + f[1][0]*(K-col)%mod*g[col] ) % mod ;
	}
	void dfs2( int x , int nw )
	{
		if( x == R+1 ) {
			if( nw <= K ) calc(nw) ;
			return ;
		}
		w[x] = nw+1 ;
		dfs2( x+1 , nw+1 ) ;
		for(int i = 1 ; i <= nw ; i ++ ) {
			w[x] = i ;
			dfs2(x+1,nw) ;
		}
	}
	void solve()
	{
		for(int i = 1 ; i <= m ; i ++ ) {
			add( e[i].x , e[i].y , i ) ;
			add( e[i].y , e[i].x , i ) ;
		}
		dfs1( 1 , 0 ) ;
		sort( Y+1 , Y+R+1 ) ;
		R = unique( Y+1 , Y+R+1 ) - (Y+1) ;
		for(int i = 1 ; i <= R ; i ++ ) nam[Y[i]] = i ;
		g[0] = 1 ;
		for(int i = 1 ; i <= n ; i ++ ) g[i] = g[i-1]*(K-i+1)%mod ;
		dfs2( 1 , 0 ) ;
		printf("%lld\n" , (ans+mod)%mod ) ;
		tot = 1 ; tim = 0 ; R = 0 ; ans = 0 ;
		memset( head , 0 , sizeof head ) ; 
		memset( dfn , 0 , sizeof dfn ) ;
		memset( nam , 0 , sizeof nam ) ;
		memset( tree , 0 , sizeof tree ) ;
	}
}
void solve()
{
	scanf("%d%d%d" , &n , &m , &K ) ;
	for(int i = 1 ; i <= m ; i ++ ) {
		scanf("%d%d%d%d" , &e[i].x , &e[i].y , &e[i].A , &e[i].B ) ;
	}
	if( n<=12 ) {
		subtask1::solve() ;
		return ;
	}
	if( m == n-1 ) {
		subtask2::solve() ;
		return ;
	}
	subtask3::solve() ;
}

int main()
{
	freopen("color.in","r",stdin) ;
	freopen("color.out","w",stdout) ;
	int t ;
	scanf("%d" , &t ) ;
	while( t -- ) solve() ;
	return 0 ;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nacos本地虚拟机搭建切换wiff问题

背景 在自己的电脑上搭建了vm虚拟机&#xff0c;安装上系统&#xff0c;设置网络连接。然后在vm的系统上安装了中间件nacos&#xff0c;mysql&#xff0c;redis等&#xff0c;后续用的中间件都是在虚拟机系统上安装的&#xff0c;开发在本地电脑上。 我本地启动项目总是请求到…

深入探讨钉钉与金蝶云星空的数据集成技术

钉钉报销数据集成到金蝶云星空的技术案例分享 在企业日常运营中&#xff0c;行政报销流程的高效管理至关重要。为了实现这一目标&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将钉钉的行政报销数据无缝对接到金蝶云星空的付款单系统。本次案例将重点介绍如何通过API接…

Rust 力扣 - 3090. 每个字符最多出现两次的最长子字符串

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 本题使用滑动窗口进行求解&#xff0c;使用左指针和右指针分别表示窗口的左边界和窗口的右边界&#xff0c;使用哈希表记录窗口内的字符及其对应数量 我们首先向右移动右指针&#xff0c;将字符加入到哈希表中进…

Jekins篇(搭建/安装/配置)

目录 一、环境准备 1. Jenkins安装和持续集成环境配置 2. 服务器列表 3. 安装环境 Jekins 环境 4. JDK 环境 5. Maven环境 6. Git环境 方法一&#xff1a;yum安装 二、JenKins 安装 1. JenKins 访问 2. jenkins 初始化配置 三、Jenkins 配置 1. 镜像配置 四、Mave…

uniApp使用canvas制作签名板

插件市场大佬封装好的 组件 可以直接拿过去 <template><viewclass"whole canvas-autograph flexc"touchmove.prevent.stopwheel.prevent.stopv-show"modelValue"><canvasclass"scroll-view"id"mycanvas"canvas-id&quo…

解决Knife4j 接口界面UI中文乱码问题

1、查看乱码情况 2、修改 编码设置 3、删除 target 文件 项目重新启动 被坑死了

FFmpeg 4.3 音视频-多路H265监控录放C++开发八,使用SDLVSQT显示yuv文件 ,使用ffmpeg的AVFrame

一. AVFrame 核心回顾&#xff0c;uint8_t *data[AV_NUM_DATA_POINTERS] 和 int linesize[AV_NUM_DATA_POINTERS] AVFrame 存储的是解码后的数据&#xff0c;&#xff08;包括音频和视频&#xff09;例如&#xff1a;yuv数据&#xff0c;或者pcm数据&#xff0c;参考AVFrame结…

【算法】递归+深搜+哈希表:889.根据前序和后序遍历构造二叉树

目录 1、题目链接 相似题目: 2、题目 ​3、解法&#xff08;针对无重复值&#xff0c;哈希表递归&#xff09; 函数头-----找出重复子问题 函数体---解决子问题 4、代码 1、题目链接 889.根据前序和后序遍历构造二叉树&#xff08;LeetCode&#xff09; 相似题目: 105.…

基于SpringBoot的“乐校园二手书交易管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“乐校园二手书交易管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 用户注册界面图 二手…

“高效开发之路:用Spring MVC构建健壮的企业级应用”

一、SpringMVC框架概念&#xff1a; &#xff08;一&#xff09;概述 SpringMVC是Spring框架的一个模块&#xff0c;Spring和SpringMVC无需中间整合层整合。该模块是一个基于MVC的web框架。 作用&#xff1a;只要需要前后端通信&#xff0c;就需要springMVC帮我完成&#xff…

练习LabVIEW第四十一题

学习目标&#xff1a; 编写一个程序测试自己在程序前面板上输入一段文字“CSDN是一个优秀的网站”所用的时间。 开始编写&#xff1a; 前面板放置一个数值显示控件&#xff0c;程序框图添加顺序结构共三帧&#xff0c;第一帧放一个获取日期/时间&#xff08;秒&#xff09;函…

编程之路:蓝桥杯备赛指南

文章目录 一、蓝桥杯的起源与发展二、比赛的目的与意义三、比赛内容与形式四、比赛前的准备五、获奖与激励六、蓝桥杯的影响力七、蓝桥杯比赛注意事项详解使用Dev-C的注意事项 一、蓝桥杯的起源与发展 蓝桥杯全国软件和信息技术专业人才大赛&#xff0c;简称蓝桥杯&#xff0c…

Cofounder:全栈 AI 应用开发 Agent,基于单一提示生成完整的应用程序

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

神奇!KMeans也可以进行图像语义分割?基于k-Means的遥感图像语义分割实战

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

2.2、软件生命周期模型介绍

软件生命周期模型 1. 传统软件过程模型1.1 瀑布模型Waterfall model1.2 V模型1.3 原型模型&#xff08;降低需求不明确的风险&#xff09;1.4 增量模型&#xff08;降低需求变化风险&#xff09;1.5 螺旋模型1.6 喷泉模型 2. 现代模型2.1 基于构件的开发模型2.2 统一过程RUP:Ra…

推荐程序员好用的浏览器插件

推荐程序员好用的浏览器插件 1. 网页颜色控制&#xff1a;Dark Reader安装效果 2. 前端助手&#xff1a;FeHelper安装效果 3. markdown可视化&#xff1a;Markdown Reader安装效果 4. ES插件&#xff1a;Multi Elasticsearch Heads安装效果 1. 网页颜色控制&#xff1a;Dark Re…

使用Jest进行JavaScript单元测试

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jest进行JavaScript单元测试 引言 Jest 简介 安装 Jest 创建基本配置 编写测试用例 运行测试 快照测试 模拟函数 代码覆盖率…

白杨SEO:百度在降低个人备案类网站搜索关键词排名和流量?怎样应对?【参考】

很久没有写百度或者网站这块内容了&#xff0c;一是因为做百度网站朋友越来越少&#xff0c;不管是个人还是企业&#xff1b;二是百度上用户搜索与百度给到网站的流量都越来越少。 为什么想到今天又来写这个呢&#xff1f;因为上个月有个朋友来咨询我说网站百度排名全没了&…

Linux——Shell的运行原理和Linux文件权限

Shell的运行原理和Linux文件权限 文章目录 Shell的运行原理和Linux文件权限1. Shell的运行原理(1) Shell是什么(2) 为什么要有Shell(3) Shell的运行原理(4) 解析命令行 2. Linux文件(1) 文件属性(2) 文件类型(3) 文件权限(4) 文件权限的修改(1) chmod(2) chown(3) chgrp (5) um…

linux守护进程与后台进程的区别

守护进程与后台进程有以下区别&#xff1a; 1. 概念与定义 后台进程&#xff1a; 是指在操作系统后台运行的进程&#xff0c;它不与用户直接交互&#xff08;没有连接到用户的终端&#xff09;。用户在终端中启动一个程序并让其在后台运行&#xff08;如通过在命令后加“&…