NOIP 模拟赛:2024-11-19

T1:

对两个字符串a,b,分别选择a的一个前缀和b的一个后缀(均允许为空或等于原串),并拼接形成一个新的字符串。
求共有多少种可能得到的本质不同的拼接串。

结论题。对于一个 a 的前缀 a[1i],有 m+1cntb[a[i]] 个新的串。

证明:


T2:

对一个n个点m条边的无向图,边1m编号并红蓝二染色,保证红边构成一个生成树。

你需要给所有边赋边权,并保证边权构成为1m的一个全排列,同时保证红边构成的是最小生成树。这显然是可以做到的,因此进一步要求采取边权字典序最小的方案,即若两个方案中1k号边的边权对应相同,则优先选取k+1号边边权更小的方案。

求赋值方案。

经典 MST 的限制:一条多余的边对应路径上都要比它小。

按编号从小到大枚举每一条边。如果是树边,直接填当前最小的编号;否则找到它对应路径上所有还没填的边,按编号从小到大填了,再回来填它。

如果直接做是 O(n2logn) 的(边还要排序),但是找路径上没出现的边用并查集可以优化掉。


T3:

n个闭区间,其中第i个为[li,ri],该区间还有一个权值wi

考虑把每个区间视作图的一个结点,点权为区间的权值,并把每一对交集非空的区间对应的结点连一条边,注意这包括交集仅为一个边界值的情况,例如[1,2],[2,3]是要连边的。则得到一个具有点权的无向图。

你需要删除一些结点和它们的邻边,使得剩余的图中,所有连通分支的结点数都不超过k。问删除结点的权值和最小是多少。

区间端点离散化。dp[i] 表示考虑所有 ri 的区间,使得每个连通块 k 最多保留多少权值。

dp[i]=max0j<i{dp[j]+f(j+1,i)},其中 f(l,r) 表示考虑 [l,r] 内的区间最多保留多少权值。

显然 f(l,r) 也是没法直接求的。但是这里可以直接取 [l,r] 内最大的 k 个区间,可能导致的不合法答案一定比最优解更劣。

可以使用数据结构求前 k 大的和,但可以给区间先按权值降序排序,求 dp[i] 的时候让 j 扫描,过程中打选择标记,有被选的区间不合法了就把它的标记取消,然后往下扫描找到第一个没被选的合法区间替代。dp[i] 只会扫 n 次,总复杂度 O(n2)


T4:

矩形覆盖

题目描述

平面直角坐标系中有n个矩形,其中每个矩形的边均平行于坐标轴。每个矩形用左下角坐标(x1,y1)和右上角坐标(x2,y2)描述,坐标均为整数。这些矩形称为“原矩形”。

对这些矩形进行m次操作,每次操作

  • 首先,选择一个“原矩形”,并在向量(1,0),(1,1),(0,1),(1,1),(1,0),(1,1),(0,1),(1,1)中选一个作为(dx,dy),这在本次操作中都是不会变的;
  • 然后,对原矩形矩形执行d次平移,每次的移动向量为(dx,dy),第一次移动使得矩形左下角坐标(矩形形状不变,为描述方便才仅列出左下角坐标的变化)变为(x1+1dx,y1+1dy),第二次后为(x1+2dx,y1+2dy),以此类推,最终变成(x1+ddx,y1+ddy),注意该移动是永久的。
  • 最后,在矩形每一步平移前的位置都生成一个生成矩形,这样每次操作会生成d个新的生成矩形,注意原矩形并不在最终到达位置生成一个生成矩形,因此第一个生成矩形在原矩形移动前的位置,最后一个生成矩形的左下角坐标为(x1+(d1)dx,y1+(d1)dy)

这些矩形,包括“原矩形”和“生成矩形”,一共有n+i=1mdi个,其中有些矩形可能完全重合,它们仍视作不同的矩形。

你要回答q次询问,每次对于点(px,py),回答该点位于几个上述的矩形中,即对那个矩形满足x1pxx2,y1pyy2

横竖就是显然的差分 + 线段树扫描线了。对于斜线也可以按照斜线进行扫描线,但是我们维护两颗线段树:一颗维护 x=[l,r] 内所有 y 的信息和,一颗维护 y=[l,r] 内所有 x 的信息和。查询一个矩形 (sx,sy,ex,ey) 的信息和,就可以用 qx(1ex)+qy(1ey)qx(1+) 查,其实就是个容斥。

posted @   FLY_lai  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示