ACM模拟赛10.3

ACM模拟赛10.3

第一场还算是正式的ACM模拟赛,毛子营的题目,10道题场上只会2道,害怕。

B Divide and Conquer

题意

n 个点 m 条边的无向图,你要找到一个点 x ,使得所有和这个点相连的点都两两相连,所有不和这个点相连的点都两两不相连。

保证有解。

1n106,0m106

题解

感觉很妙的一道题,想了很久。

考虑这个点 x 满足什么性质,不妨记与 x 相连的点集为 S ,不与 x 相连的点集为 T ,往点的度数方向去想,那么有 dx=|S| ,并且 iS,di|S|iT,di|S| 。证明很简单, S 中的点至少要和 S 内的点以及 x 相连,而 T 中的点只能和 S 中的点相连。

另外,我们还可以发现,如果 x 满足条件,那么所有 dy=dxy 也会满足条件。分情况讨论即可:如果 yS ,那么 y 恰好与 Sx 相连,与 T 不相连,所以 y 满足;如果 yT ,那么 y 恰好与 S 中每个点都相连,且它不与 T 中其它点以及 x 相连,所以 y 也满足。

到了这里 O((n+m)m) 的做法就很显然了,直接枚举度数可能的值然后暴力判断,我们场上写了这个做法然后过了。

后来发现一种更优美的做法,仍然是之前的性质,如果 x 满足条件,那么它必然和 {y|dy>dx} 相连,与部分 {y|dy=dx} 相连,与 {y|dy<dx} 不相连。这个的一个必要条件是 |{y|dy>dx}|<dx<|{y|dydx}| 。而且我们可以发现,这样满足条件的度数是唯一的,而题目中保证有解,所以只需要扫一遍即可找到答案。(当然,不保证有解也可以先这样找到度数再判断即可)

复杂度 O(n+m)

C Spatial Thinking

题意

场上题意是真看不懂,感谢室友让我知道这题是要干啥。。。

将一个 n 维空间内的棱长为 1 的单位立方体任意切分成 n! 个单纯形(由你决定如何切分),要求单纯形每个顶点都在立方体上,再给定 m 个点,你需要判断每个点在哪个单纯形内(如果在交界处任意输出一个)。

2n8,0m105

题解

切分方法就是选取一个 n 的排列,然后从 (0,0,,0) 开始,依次将这些位置从 0 改成 1

找在哪个单纯形内就直接按照大小关系康托展开即可。

D Palindromes

题意

给定一个 mn 列的字符矩阵,将其划分成尽量少的若干连续列,使得每个连续列至少有一行回文。

1m10,1n105

题解

额,这题我场上居然没切,果然降智到了极点。。。

[最小回文划分](回文树 - OI Wiki (oi-wiki.org))的模板,复杂度 O(mnlogn)

当作复习回文树喽。

E Travelling by River

题意

河流上有 n 个港口和 m 条航线,其中保证任意一条航线连接的两个点编号不超过 k

港口按照 1n 的顺序从下游排列到上游,某人计划依次经过 q 个港口并列出了列表,但是它发现路线太长了,于是按照以下策略保留要依次经过的港口:从左到右考虑列表中每个港口,第一个港口必去,下一个港口不被删除当且仅当它不与前一个港口相同并且可以由前一个港口不回头走到。

给出最终的行走路线。

2n2105,0m2105,1k200,1q2105

题解

直接分治,从中间 k 个港口切开,如果要左右互到,则必然经过中间这些港口,于是压位记录每个点是否能不回头到达这中间 k 个港口,然后递归考虑。

容易发现时间复杂度为 O((nklogn+qk)/64)

H Beautiful Pairs

题意

n 次询问每次询问给定 l,r[l,r] 内有多少数对 (a,b) 满足 b|(a21)a|(b21)

1n105,1lr1018

题解

口胡的,没写,场上和队友一起找规律找了很久,最后找到了来不及写了。

考虑构造一个这样的矩阵 A ,满足 Ai,1=1,Ai,2=i+1,Ai,j=(i+1)Ai,j1Ai,j2

这样数对 (a,b) (不妨假设 a<b )满足条件当且仅当存在 i,j 使得 Ai,j=a,Ai,j+1=b

求矩阵中某个元素可以用矩阵快速幂,前 k 行二分找答案,后面在 logkV 列里面二分找答案,复杂度大概是 O(n(klogV+logkVlog2V))

I Binary Matrices

题意

给定下列代码:

calc (n, x, p, q) {
  ans = 0;
  do n times {
    x = x * p + q;
    lhs = x;
    x = x * p + q;
    rhs = x;
    ans = sum(ans, multiply(hls, rhs));
  }
  return ans;
}

其中 x,p,q 的类型都是 unsigned long long ,加法和乘法都是自然溢出。

sum(a, b) 函数将两个值转化为 8×8 的二进制矩阵然后相加再转化回值传回。

multiply(a, b) 函数将两个值转化为 8×8 的二进制矩阵然后相乘再转化回值传回。

注意:矩阵中的值相加为不进位二进制加法。

calc (n, x, p, q) 的返回值。

1n107,0x,p,q1018

时限 2s 。

题解

就恁卡常。

矩阵相加就是异或。

矩阵相乘先拆分成行和列,这样矩阵乘法的时候就可以通过与运算统计 1 的数量实现,运算次数 8×8

拆分成行简单,拆分成列就先矩阵转置,预处理一行转置成一列即可,运算次数 3×8

卡卡常勉强飘过。

J Quake

题意

LV 在打一个 Boss ,该游戏为回合制游戏,每个回合 LV 有 p% 的概率击败 Boss ,而 Boss 有 1(p%) 的概率打败 LV ,如果 LV 打败 Boss n 次他就赢了,如果 Boss 打败 LV m 次 LV 就输了,并且 LV 输后游戏立即重启,双方打败次数归零,当然 LV 也可以选择在游戏任一回合结束后立即重启游戏,次数归零,问 LV 至少赢一次期望需要多少回合。

1n,m103,0<p<100

题解

最水的一道题。

f(a,b) 表示 LV 已打败 a 次而 Boss 已打败 b 次后 LV 获胜的期望步数,那么有:

f(a,b)=min(p%f(a+1,b)+(1p%)f(a,b+1)+1,f(0,0))

二分 f(0,0) ,看看求出的 f(0,0) 会不会比二分的更小即可。

时间复杂度 O(nmlogV) ,其中 V 为精度。

posted @   xiaolilsq  阅读(108)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2020-10-07 [复习资料]概率期望学习笔记
点击右上角即可分享
微信分享提示