7.24 模拟赛总结 [dp 专场] + tarjan

复盘

7:40 开题

看 T1 ,妈呀,一上来就数数?盯了几分钟后发现会了,不就是 LCS 计数嘛

继续看,T2 看上去很恶心,线段覆盖,感觉可能是贪心什么的

再看 T3,先想了个 n 2 n^2 n2 的式子,再一看哎 max 肯定有决策单调性啊,而且决策还有区间限制,那刚好套个之前模拟赛的技巧,放到线段树上做,秒了?

胡完之后看 T4 ,推箱子,感觉是什么神秘不可做题

8:05 开始码了,发现 T1 还得套个小容斥,8:20 过样例了

接下来决定先写 T3,8:30 先交了个 n 2 n^2 n2,上决策单调性分治到 8:55 调过交了

然后放一边拍着,看 T2 ,简化了一下题意就是 若干个区间必须被一整段覆盖,转移点好像只有每个线段的两端点,嗯?梦回 NOIP T4?

去个厕所冷静下,发现实际上在值域上直接做就行了,然后求个区间 Max

回来看到时限开到 200ms,妈呀卡 log 呢?还好我已经胡出了单调队列线性做法

码码码,测大洋例挂了一个,发现没考虑 选择区间长度必须是偶数,那开两个 deque 分别维护奇偶就行,9:46 交了

看时间剩两个小时,感觉很稳,决定先不拍,看 T4 ,说不定就阿克了(伏笔

看完数据范围后感觉应该直接搜所有状态, ( n m ) 2 (nm)^2 (nm)2 做法是显然的,记人和箱子位置就好

然后会发现人一定在箱子四周,那么状态数可以压缩到 4 n m 4nm 4nm,唯一需要考虑的就是怎么快速判断人能否从箱子的一边到另一边?

隐隐感觉和那些图论算法有关,仔细想想,在不经过这个箱子的前提下两点互达,边双?

刚准备回来写,顺手造一组样例就把自己 hack 了,无奈

继续想,考虑每次删一个点,判两点联通,哎线段树分治!好像很对,维护可撤销并查集

可是很遗憾,我不会写线段树分治

继续想图论算法,修修补补发现其实是点双,箱子那儿一定是一条路,“两条不交路径” 就行了,这就是点双定义啊

写写写,11:10 写完了,一发过了大样例?

以为自己 AK 了,想想还是拍下 T4

结果一下子 WA 了,赶紧调调调,发现 2 个sb错误,最后 2 min 改过交了

然鹅:

100+15+100+100 = 315 , rk_ O ( n ! ) O(n!) O(n!)

没想到 T2 的弱智错误… 本场唯一没拍的题…

Upd : T4 少讨论了一种情况,没想到过了

题解

T3

补一下正解 ~

在这里插入图片描述
观察转移方程: f i = m i n ( f j + m a x ( h j + 1 . . h i ) ) , p o s i ≤ j ≤ i − 1 f_i=min(f_j+max(h_{j+1}..h_i)),pos_i\leq j\leq i-1 fi=min(fj+max(hj+1..hi))posiji1 ,pos 表示合法区间左端点

考虑直接线段树维护区间 Max ,考虑阶段 i i i 右移对前面决策什么影响,发现会更改一段的 h m a x h_{max} hmax ,可以单调栈求出左边第一个比 h i h_i hi 大的,区间修改

由于每个位置的 f f f 值是固定的,线段树节点只需维护 f + h f+h f+h f f f 最小值,就可以传标记了

T4

在这里插入图片描述

奇奇怪怪,前面口胡过了

#include<bits/stdc++.h>
using namespace std ;typedef long long LL ;
const int N = 1510 ;int n , m , Q ;
int stx , sty , bx , by ;
char ch[N][N] ;
struct nn
{int x , y , f ;
};
bool vis[N][N][4] ;
int dx[4] = {-1,1,0,0} ;
int dy[4] = {0,0,-1,1} ;
queue<nn> q ;
bool can[N][N] ;
inline bool F ( int x , int y )
{if( x<1||x>n||y<1||y>m ) return 0 ;return 1 ;
}
struct node
{int x , y ;
};
void Get()
{queue<node> q ;q.push({stx,sty}) ;while( !q.empty() ) {int x = q.front().x , y = q.front().y ; q.pop() ;for(int i = 0 ; i < 4 ; i ++ ) {int tx=x+dx[i] , ty=y+dy[i] ;if( F(tx,ty) && !can[tx][ty] && ch[tx][ty]!='#' && ch[tx][ty]!='B' ) {can[tx][ty] = 1 ;q.push({tx,ty}) ;}}}	
}
// n^2 个点 
struct edg
{int lst , to ;
}E[4*N*N] ;// 边不多 
int head[N*N] , tot = 1 ;
inline void add( int x , int y )
{E[++tot] = (edg){ head[x] , y } ;head[x] = tot ;
}
inline int get( int x , int y )
{return (x-1)*(m)+y ;
}
int tim , dfn[N*N] , low[N*N] , cnt ;
stack<int> s ;
vector<int> bel[N*N] ; // 节点 x 属于哪些点双 
void tarjan( int x )
{dfn[x] = low[x] = ++tim ;s.push(x) ;for(int i = head[x] ; i ; i = E[i].lst ) {int t = E[i].to ;if( !dfn[t] ) {tarjan( t ) ;low[x] = min( low[x] , low[t] ) ;if( dfn[x] <= low[t] ) {cnt ++ ;int y ;do {y = s.top() ;s.pop() ;bel[y].push_back( cnt ) ;}while( y != t ) ;bel[x].push_back( cnt ) ;}}else low[x] = min( low[x] , dfn[t] ) ;}
}
int bt[N*N] ;
inline bool ok( int x , int y , int ax , int ay ) // 是否在一个点双 
{int A = get(x,y) , B = get(ax,ay) ;for(int t : bel[A] ) {bt[t] ++ ;}bool fg = 0 ;for(int t : bel[B] ) {if( bt[t] ) {fg = 1 ;break ;}}for(int t : bel[A] ) {bt[t] = 0 ;}return fg ;
}int main()
{scanf("%d%d%d" , &n , &m , &Q ) ;for(int i = 1 ; i <= n ; i ++ ) {scanf("\n%s" , ch[i]+1 ) ;for(int j = 1 ; j <= m ; j ++ ){if( ch[i][j] == 'A' ) stx = i , sty = j ;else if( ch[i][j] == 'B' ) bx = i , by = j ;}}for(int i = 1 ; i <= n ; i ++ ) {for(int j = 2 ; j <= m ; j ++ ) {if( ch[i][j-1] != '#' && ch[i][j] != '#' ) {add( get(i,j-1) , get(i,j) ) ;add( get(i,j) , get(i,j-1) ) ;}}if( i != 1 ) {for(int j = 1 ; j <= m ; j ++ ) {if( ch[i][j] != '#' && ch[i-1][j] != '#' ) {add( get(i,j) , get(i-1,j) ) ;add( get(i-1,j) , get(i,j) ) ;}}}}for(int i = 1 ; i <= n ; i ++ ) {for(int j = 1 ; j <= m ; j ++ ) {if( ch[i][j] != '#' ) {if( !dfn[get(i,j)] ) {while( !s.empty() ) s.pop() ;tarjan( get(i,j) ) ;}}}}Get() ;for(int i = 0 ; i < 4 ;  i ++ ) {int ax = bx+dx[i] , ay = by+dy[i] ;if( F(ax,ay) && can[ax][ay] ) {q.push({bx,by,i}) ;vis[bx][by][i] = 1 ;}}while( !q.empty() ) {int x = q.front().x , y = q.front().y , f = q.front().f ; q.pop() ;//箱 int ax = x+dx[f] , ay = y+dy[f] ;//人 // pushint tx = x+dx[f^1] , ty = y+dy[f^1] ;if( F(tx,ty) && ch[tx][ty]!='#' ) {if( !vis[tx][ty][f] ) {vis[tx][ty][f] = 1 ;q.push({tx,ty,f}) ;}}// turnif( f <= 1 ) {tx = x+dx[2] , ty = y+dy[2] ;if( F(tx,ty) && ch[tx][ty]!='#' && ok(ax,ay,tx,ty) ) {if( !vis[x][y][2] ) {vis[x][y][2] = 1 ;q.push({x,y,2}) ;}}tx = x+dx[3] , ty = y+dy[3] ;if( F(tx,ty) && ch[tx][ty]!='#' && ok(ax,ay,tx,ty) ) {if( !vis[x][y][3] ) {vis[x][y][3] = 1 ;q.push({x,y,3}) ;}}}else {tx = x+dx[0] , ty = y+dy[0] ;if( F(tx,ty) && ch[tx][ty]!='#' && ok(ax,ay,tx,ty) ) {if( !vis[x][y][0] ) {vis[x][y][0] = 1 ;q.push({x,y,0}) ;}}tx = x+dx[1] , ty = y+dy[1] ;if( F(tx,ty) && ch[tx][ty]!='#' && ok(ax,ay,tx,ty) ) {if( !vis[x][y][1] ) {vis[x][y][1] = 1 ;q.push({x,y,1}) ;}}}}int r , c ;for(int i = 1 ; i <= Q ; i ++ ) {scanf("%d%d" , &r , &c ) ;if( vis[r][c][0] || vis[r][c][1] || vis[r][c][2] || vis[r][c][3] || (r==bx&&c==by) ) {printf("YES\n") ;} else printf("NO\n") ;}return 0 ; 
}

一定要注意点双的定义: 点双内不存在割点,点双内的点对间有两条 点集 不交的路径

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

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

相关文章

Vue 3 + Vite 项目中安装 Tailwind CSS

官网&#xff1a;安装 - TailwindCSS中文文档 | TailwindCSS中文网 tips&#xff1a;只按照官网的配置可能会导致样式不加载/加载不生效的问题 1、正确安装指令 npm install -D tailwindcss postcss autoprefixer npx tailwindcss init -p 自动生成 ​tailwind.config.js​…

【C++】string类(上)

个人主页~ string 一、标准库中的string类1、什么是string类2、string类的常用接口讲解&#xff08;1&#xff09;string类的常见构造&#xff08;2&#xff09;string类的容量操作&#xff08;3&#xff09;string类对象的访问及遍历&#xff08;4&#xff09;string类对象的修…

Java语言程序设计——篇七(2)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 封装性与多态 封装性与访问修饰符类的访问权限类成员的访问权限 &#x1f320;防止类扩展和方法覆盖实战演练 抽象类实战演练 对象转换实战演练…

lambda表达式,真题示例

Lambda表达式 它使代码更加简洁、易读&#xff0c;函数式编程增强了代码的表达力。常用于对集合的操作&#xff0c;如遍历、过滤、转换等。 Lambda表达式的形式&#xff1a; 参数&#xff0c; 箭头&#xff08;->) 以及一个表达式&#xff1a; (String first, String sec…

Android P Input设备变化监听 Storage设备变化监听

InputManager.java中实现了InputDeviceListener接口&#xff0c;只需要新建一个类 implements InputDeviceListener &#xff0c;并且将类实例化注册给InputManager.getInstance().registerInputDeviceListener即可。 StorageManager同理 StorageManager中会调用StorageEventL…

还手动抄字幕?学会这3个视频转文字方法,轻松提取视频中的字幕!

大家有尝试过考试前极限抱佛脚吗&#xff1f; 在下不才&#xff0c;曾经试过一次&#xff0c;轻松在及格线低空飘过【大家不要学不要学不要学&#xff0c;重要的事情说三遍&#xff01;&#xff01;&#xff01;】 至于我当时究竟是怎么做到的呢&#xff1f;其实这里面有点小…

网络原理_初识

目录 一、局域网LAN 二、广域网WAN 三、网络通信基础 3.1 IP地址 3.2 端口号 3.3 协议 3.4 五元组 3.5 OSI七层模型 3.6 TCP/IP五层模型 3.7 网络设备所在分层 3.8 封装和分用 总结 一、局域网LAN 局域网&#xff0c;即 Local Area Network&#xff0c;Local 即标…

“微软蓝屏”全球宕机,敲响基础软件自主可控警钟

上周五&#xff0c;“微软蓝屏”“感谢微软 喜提假期”等词条冲上热搜&#xff0c;全球百万打工人受此影响&#xff0c;共同见证这一历史性事件。据微软方面发布消息称&#xff0c;旗下Microsoft 365系列服务出现访问中断。随后在全球范围内&#xff0c;包括企业、政府、个人在…

【定积分】

框架 概念&#xff0c;性质定积分计算基本特色变限积分及其导数反常积分&#xff08;广义积分&#xff09;定积分应用面积体积 讲解 1.概念&#xff0c;性质&#xff1a; 定积分就是求出曲线的面积&#xff1b;性质中要注意几个不等式的比较 2.定积分计算&#xff1a; 基本&…

物理机 gogs+jenkins+sonarqube 实现CI/CD

一、部署gogs_0.11.91_linux_amd64.tar.gz gogs官网下载&#xff1a;https://dl.gogs.io/ yum -y install mariadb-serversystemctl start mariadbsystemctl enable mariadbuseradd gittar zxvf gogs_0.11.91_linux_amd64.tar.gzcd gogsmysql -u root -p < scripts/mysql.…

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配&#xff01;有了上次的内容铺垫&#xff0c;我们可以根据用户的token来判定&#xff0c;到底是显示什么内容了。 1&#xff1a;我们在对应的导航组件内修改完善一下内容即可。 <script setup> import { useUserSt…

svn软件总成全内容

SVN软件总成 概述&#xff1a;本文为经验型文档 目录 D:\安装包\svn软件总成 的目录D:\安装包\svn软件总成\svn-base添加 的目录D:\安装包\svn软件总成\tools 的目录D:\安装包\svn软件总成\tools\sqlite-tools-win32-x86-3360000 的目录D:\安装包\svn软件总成\安装包-----bt lo…

C#调用OpenCvSharp实现图像的角点检测

角点检测用于获取图像特征&#xff0c;以支撑运动检测、目标识别、图像匹配等方面的应用。常用的角点检测算法包括Kitchen-Rosenfeld算法、Harris算法、KLT算法、SUSAN算法等&#xff0c;本文学习并测试Harris角点检测算法。   关于Harris算法的数学原理请见参考文献1的第18、…

C++内存管理和模板/stl初识

前言 c兼容C语言&#xff0c;但它因为有类和对象的概念&#xff0c;C语言原生的那套内存管理函数在特定场景下还是有些捉襟见肘的&#xff0c;为此c在C语言的基础上引入新的内存管理方案&#xff0c;今天我们就来简单的认识一下c的内存管理。除此之外&#xff0c;模板也是c引入…

Jetpack Compose 通过 OkHttp 发送 HTTP 请求的示例

下面是一个使用 Kotlin 和 Jetpack Compose 来演示通过 OkHttp 发送 HTTP 请求的示例。这个示例包括在 Jetpack Compose 中发送一个 GET 请求和一个 POST 请求&#xff0c;并显示结果。 添加okhttp依赖 首先&#xff0c;在你的 build.gradle.kts 文件中添加必要的依赖&#xf…

父子组件生命周期的执行顺序

在Vue中&#xff0c;父子组件的生命周期执行顺序是一个重要的概念&#xff0c;它帮助开发者理解组件之间的加载、更新和销毁过程。以下是对父子组件生命周期执行顺序的详细解释&#xff1a; 一、加载渲染过程 当Vue实例开始创建时&#xff0c;会按照以下顺序执行生命周期钩子…

PACS医学影像临床信息系统,C#影像归档和通信系统源码,PACS源码,支持图像的获取、传输、浏览、打印、测量、重建、对比、存储、处理,电子胶片影像管理等

医学影像临床信息系统具有图像采集、显示、存储、传输和管理等功能&#xff0c;支持DICOM影像设备和非DICOM影像设备&#xff0c;可以识别CT、MR、CR/DR、X光、DSA、B超、NM、SC等设备的图像类型&#xff0c;可对数字影像进行无损压缩和有损压缩处理。C/S体系结构的多媒体数据库…

STM32智能照明控制系统教程

目录 引言环境准备智能照明控制系统基础代码实现&#xff1a;实现智能照明控制系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;照明管理与优化问题解决方案与优化收尾与总结 1. 引言 智能照明控制系统通…

独立游戏《星尘异变》UE5 C++程序开发日志8——实现敏感词过滤功能(AC自动机)

在游戏中经常会有需要玩家输入一些内容的功能&#xff0c;例如聊天&#xff0c;命名等&#xff0c;这款游戏只有在存档时辉用到命名功能&#xff0c;所以这个过滤也只是一个实验性的功能&#xff0c;我们将使用AC自动机来实现&#xff0c;这是在我们把“csdn”这个词设置为屏蔽…

解决zabbix-server7 中文乱码问题

系统使用centos9 安装中文支持 yum install -y fontconfig langpacks-zh_CN.noarch 检查是否已有中文字体&#xff1a; fc-list :langzh 看到 直接使用GOOGLE的字体 ln -fs /usr/share/fonts/google-noto-cjk/NotoSansCJK-DemiLight.ttc /etc/alternatives/zabbix-web-fo…