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 n≤12,注意要用集合划分的方式去搜,不会 TLE
从树上做法和暴力,我们可以拓展:
考虑往树上加边,不妨认为加的都是返祖边(后来发现这个没什么用),那么该边的权值与相连两个点的颜色有关
设 N = m − n + 1 N=m-n+1 N=m−n+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 ;
}
相关文章:

11.6 校内模拟赛总结
打的很顺的一场 复盘 7:40 开题,看到题目名很interesting T1 看起来很典,中位数显然考虑二分,然后就是最大子段和;T2 构造?一看数据范围这么小,感觉不是很难做;T3 神秘数据结构;T…...
Redis常用的五大数据类型(列表List,集合set)
简介 List 的特点:单键多值。底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。 Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边ÿ…...

Ubuntu 20.04 部署向量数据库 Milvus + Attu
前言 最开始在自己的办公电脑(无显卡的 windows 10 系统) 上使用 Docker Desktop 部署了 Milvus 容器,方便的很, 下载 Attu 也很方便,直接就把这个向量数据库通过 Attu 这个图形化界面跑了起来,使用起来感…...

实现数传数据转网口(以太网)和遥控器SBUS信号转串口的功能
为了帮助你实现数传数据转网口(以太网)和SBUS信号转串口的功能,这里提供一个基本的框架。我们将使用STM32微控制器来完成这些任务。假设你已经具备了STM32的基本开发经验,并且已经安装了相应的开发环境(如STM32CubeIDE…...

APP 后台广告位配置的关键要素与策略
在当今数字化营销的浪潮中,APP 作为重要的信息传播渠道,其后台广告位的配置显得尤为关键。这不仅影响着广告的展示效果,还直接关系到用户体验和平台收益。 首先,了解目标受众是配置广告位的基础。通过对 APP 用户的行为数据进行分…...
分布式数据库概述
分布式数据库概述 分布式数据库是一种将数据分散存储在多个物理节点上的数据库系统,这些节点通过网络相互连接,形成一个逻辑上统一的数据库系统。它旨在提高数据的可用性、可靠性、性能和可扩展性,是现代大数据和云计算环境下不可或缺的重要技术。 一、分布式数据库的核心…...
用通义灵码帮助实现校验bpmn.js当前画布上只能有一个开始节点的功能
最终代码: const elementRegistry this.bpmnModeler.get(elementRegistry);// 获取所有元素const allElements elementRegistry.getAll();// 过滤出开始节点const startEvents allElements.filter(element > element.type bpmn:StartEvent);// 校验开始节点的…...
OKHTTP断点续传
OKHTTP断点续传 文章目录 OKHTTP断点续传HTTP断点续传知识点RangeContent RangeEtag&If-Range(文件唯一标志) OKHTTP断点下载OKHTTP 简单短断点下载代码示例 Android 断点续传一直是面试的高频问点,这里从HTTP断点续传知识和Android续传思…...

软件测试学习笔记丨Flask操作数据库-ORM
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/23426 什么是持久化 是把数据保存到可永久保存的存储设备中(比如磁盘)。持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件…...

ABAP 开发的那些小技巧
在对话框程序中的选择屏幕添加图标 要在选择屏幕中添加图标,其中包括参数: 在参数的选择文本中或选择选项(select-option)中写入 01 或选择选项: 您可以使用 01、02、03,依此类推,以获取不同的不同图标。 在运行时…...

电科金仓(人大金仓)更新授权文件(致命错误: XX000: License file expired.)
问题:电科金仓(人大金仓)数据库链接异常,重启失败,查看日志如下: 致命错误: XX000: License file expired. 位置: PostmasterMain, postmaster.c:725 解决方法: 一、下载授权文件 根据安装版本在官网下载授权文件(电科金仓-成为世界卓越的数据库产品与服务提供商)…...

玩转「HF/魔搭/魔乐」平台
模型下载 Hugging Face 下载到 GitHub CodeSpace CodeSpace创建环境: # 安装transformers pip install transformers4.38 pip install sentencepiece0.1.99 pip install einops0.8.0 pip install protobuf5.27.2 pip install accelerate0.33.0下载internlm2_5-7b…...

鸿蒙系统的优势 开发 环境搭建 开发小示例
HarmonyOS是面向多智能终端、全场景的分布式操作系统,为消费者提供跨终端的无缝体验.华为开发者联盟从HarmonyOS应用设计、开发、测试、推广变现等环节全方位助力开发者。 开发者可以通过以下步骤学习鸿蒙系统的开发: 基础理论学习: 了解鸿蒙系统概述&a…...
python批量合并excel文件
当工作中发现有多个excel表需要进行相同的操作或者需要汇总在一起,一个一个处理太费时间,以下的python代码能够帮你解决这个问题~ import pandas as pd import os# 设置Excel文件所在的文件夹路径和合并文件的输出路径 folder_path D:\\Desktop\\dat…...
AWS S3 JavaScript SDK(v3)常用操作
安装 aws s3 sdk npm install aws-sdk/client-s3配置 创建 ~/.aws/credentials 文件,添加以下配置项: [default] aws_access_key_id<...> aws_secret_access_key<...> region<...>S3 SDK常用桶操作 获取桶列表 import {S3Client,…...

数据结构——图的基本操作
文章目录 1.图2.图的结构体定义3.图的初始化4.添加顶点、删除顶点4.1添加顶点4.2删除顶点 5.添加边、删除边5.1添加边5.2删除边 6.打印图7.main函数 在生命旅途中,我们就像是一个个节点,被无数看不见的边相连。每一次的相识与相离,都在这张巨…...

掌握全球速递:在表格中高效利用国际快递公式查询快递
在当今全球化的商业环境中,国际快递服务已成为连接世界各地企业与个人的重要桥梁。无论是跨国企业间的货物运输,还是个人用户的海外购物需求,国际快递都扮演着不可或缺的角色。然而如何快速准确地获取大量国际快递的物流轨迹成为了一个挑战。…...

【MySQL系列】字符集设置
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Vue2进阶之Vue3高级用法
Vue3高级用法 响应式Vue2:Object.definePropertyObject.definePropertythis.$set设置响应式 Vue3:Proxy composition APIVue2 option API和Vue3 compositionAPIreactive和shallowReactivereadonly效果toRefs效果 生命周期main.jsindex.htmlLifeCycle.vue…...

基于微信的追星小程序+ssm(lw+演示+源码+运行)
摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,追星小程序被用户普遍使用,为方便用户能够可以…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...