其他-做题记录 (14 Jan - 23 Feb, 2019)

01.14

A. 摆放正方形

线段上摆满任意个正方形,边不能在某些给定位置,一种方案的价值是正方形面积之积,求所有方案价值之和。

等价于以正方形边划分为 \(k\) 区域,每个区域可以扔黑白两颗球到任意格子的方案数 \(\sum_{l_1,l_2,\cdots, l_k}l_1^2\times l_2^2 \times \cdots \times l_k^2\)\(l\) 是区间内格子数。然后 DP + 矩乘优化就行了。

B. Normal

求随机点分治期望时间复杂度。

答案是 \(\sum_i \sum_j \frac{1}{dis(i,j)+1}\) ,点分治统计每种长度的路径条数,注意合并两个子树贡献的 DP 是卷积形式, FFT 。

我点分治 get_ans 里还有个 \(O(n)\) 的 for 循环, T 飞了。直接固定长度 FFT 的时间复杂度是错误的!必须即时算一个合理的长度来 FFT ,因为点分治之所以时间复杂度正确就是因为它同一个递归层内的函数合起来才是 \(O(n)\) ,像我那样每一个函数都是 \(O(n)\) 还了得 Orz ……

C. Divljak

给出 \(S_i\) ,操作有添加一个字符串到 \(T\) 和询问 \(T\) 中有多少字符串包含给定的 \(S_i\)

\(S\) 建立 AC 自动机。一个被包含的字串可以表示为某个前缀的后缀,所以添加字符串的时候跑一下匹配,再沿着 fail 树往上跳,这些点构成的虚树都会得到 +1 的贡献,按照 dfn 排序然后相邻两个点找 lca 即可,所有路径无公共边。询问就是单点查询。众所周知路径修改加单点查询可以差分成单点修改加子树查询。

D.

可能字符串算法我还属于会敲但不会用的尴尬境地啊……做不来,遭了啊 Orz……

01.15

上午看了下虚树。圆方树求割点之类的题做了两道。

A. 杀毒软件

矩阵表示 AC 自动机上的结点状态,即 \(f(i,j)\) 表示匹配到主串第 \(i\) 个位置,在 \(j\) 结点的方案数,转移就是从一个点走向儿子(不能是叶结点)。维护动态 DP ,矩阵乘法过程中用 unsigned long long ,不取模,最后再取模,卡常。

B. 政治正确

爬山。

C. 水果拼盘

多维前缀和,或者单独考虑每种水果对期望的贡献。

D.

A 题又没想到,我字符串好弱呀。感觉 B 和 C 没啥意思,一道不可做,一道特别水。

01.16

忘了题目是啥,在哪了。

A.

Steiner 树,具体写图论的 post 里面了。

B.

忘了。

C.

行列异或均为 \(0\) ,有一些规定应算为一种的方案,置换群, hdhd 大佬讲了 Burnside 和 Polya 定理(对,对对,嗯,啥?)。

01.17

A. Power

\(max\{ (\sum x_i)^k, a^k \},x_i\in[l_i,r_i]\) 的期望。

积分,容斥(这个容斥比较简单,就是用大于等于容斥出两个区间),再见。

B. Sum

Source: 2019 雅礼集训

好像看出了 \(xy \ge x+y\ (x,y>1)\) ,不过没什么用。

结论:选的数至多有 2 个素约数,并且有 2 个的时候一个小于等于 \(\sqrt n\) ,一个大于 \(\sqrt n\) 。 两类数放两边建费用流,只有费用 \(f(x,y)-f(x)-f(y)>0\) 才连边( \(f(S)\) 表示 \(S\) 作为素约数集合,最大的那个 \(\le n\) 的数), \(dis(T)>0\) 的时候贡献给答案。

C. 先打乱后交换

Source: AGC

DP 是 \(O(n^2)\) 的,然后各种操作,它就卷积了,就 \(O(n\log n)\) 了……我不懂啊!

D.

hdhd 大佬讲了下昨天的那道虚数上 DP ,嗯,可以感性理解,写是不可能写的……

01.18

「雅礼集训 2018 Day2」颜色

我是直接看的代码 LOJ 上 supy 的提交

ppt 被我弄丢了 TAT 。

对于只询问一个区间 \([l,r]\) 的情况,每个位置 \(p\) 的颜色上一次出现位置记为 \(Last(p)\) ,如果 \(Last(p)\) 在询问区间内( \(Last(p) \ge l\) )则无贡献。分块,排序,二分最后一个 \(Last(p) < l\) ,计算答案。

正解仍然是分块,把除了最后 6 位都相同的数唯一对应到同一个 bitset 里的某一位。

    F[x >> 6] |= 1ull << (x & 63);

区间左右非整块直接添加, \(O(\sqrt n)\) 。每个整块可以预处理 or 值, \(O(\frac{32}{n})\) 。由于有多个整块在区间中间,再把这些整块的 or 值倍增一下就行了。

另外,一些数在整个序列中只出现了一次,把他们单独拿出来用前缀和维护,答案最后加上其贡献就可以。其他的数离散化一下,新的 \(n\) 会比以前小一点。

此题只用分块和 bitset 可能被卡常。

01.26

「雅礼集训 2018 Day7」A

被坑了,补充在 势能线段树

「雅礼集训 2018 Day7」B

\(p\) 位置开始取,值为 \((ap+0\cdot a+b),(ap+1\cdot a+b),(ap+2\cdot a+b),\cdots\) ,也就是说无论从何处开始取,值减去 \(ap\) 之后,可以看成是从 \(0\) 开始取。类似差分地,让 \(T(p)\) 在它的数字对应的那棵线段树 \(ap+b\) 的位置贡献 \(1\) 。 0 线段树上位置 \(x\) 加上 \(ap_0\)\(p_0\) 是开始取的位置 )才是 \(S\) 中对应位置的实际值, 线段树上位置 \(x\) 满足 \(x+ap_0 \ge c\) 这些位置的和就是贡献,因为这些位置 \(S\) 是 1 ,而 \(T\) 是 0 。注意模 \(n\) 意义下线段树上这些位置不一定是连续的,还可能左边一段右边一段。 1 线段树类似。动态开点,修改操作就是普通的单点修改,甚至不需要用儿子来维护区间和,因为修改的时候可以顺便处理经过的点。

01.27

LOJ6497 「雅礼集训 2018 Day1」图

交错路数量是指,在对结点染色并连边后,入度为 0 的点数(路径不存在完全包含关系),一个独立的点也算入度为 0 的点。

\(g(p)\) 表示 \(p\) 为终点的路径数。 \(f(p,k,x,y)\) 意义是: \([1,p]\) 结点构成的所有图中, \(k\) 为交错路总数的奇偶性, \(x\) 表示是否至少含一个 \(g\) 值为奇的黑点, \(y\) 表示是否至少含一个 \(g\) 值为奇的白点,满足这些约束条件的图的数量

刷表法,考虑下一个位置 \(p+1\) 染白色。

如果 \(x=0\) ,现在状态对应的每个图的黑点的 \(g\) 全为 \(0\) ,先算不连边的情况 ,即 \(p+1\) 是一个独立的白点的情况,交错路贡献了 \(1\) 条。然后如果 \(p+1\) 任意连至少一条边,白点无影响,所有黑点 \(\sum g\) 都是偶数。整体奇偶贡献是 \(1\)

如果 \(x=1\) ,考虑这样恰好构造出所有方案:先把不连边的贡献 \(1\) 算进去,然后任意连至少一条边,白点无影响,不要连向某个 \(g\) 为奇数的黑点。然后,是否连向这个特殊的黑点决定了方案数的奇偶性。思考一下可以发现奇偶性贡献 \(0\)\(1\) 的方案数是相同的,取决于不连向特殊点时的连边情况。

if (x) {
    upd(G[k ^ 1][x][1], mul(tmp, B[i - 1]));
    upd(G[k][x][y], mul(tmp, B[i - 1]));
} else {
    upd(G[k ^ 1][x][1], mul(tmp, B[i]));
}

染黑色类似。

LOJ6495 「雅礼集训 2018 Day1」树

\(f(x,y)\) 表示 \(x\) 个点,深度为 \(y\) 的方案数。方程就是网上题解的那个。考虑枚举 \(2\) 号点的深度,如果小于 \(y-1\) 就说明最深的树是 \(1\) 号点与其他儿子构成的树,如果等于 \(y-1\) ,那么 \(1\) 号点与其他儿子构成的树的深度就可以任意取了。

官方正解是按照深度排序之后,什么什么差分,被上面 \(O(n^4)\) 做法吊打了……

02.19

nodgd 杂题讲, 内容很多,另外开篇 blog 讲。

02.20

hdhd 和 chjingqi 的互测赛。

A.

题意:忘了,什么 \(gcd(i,j)^k\)

Mobius 反演,然后正常搞是 \(O(n+\sqrt n)\) 的,有一个 \(f(n)=\sum_{p|n}p \cdot \mu(\frac{n}{p})\) ( \(p\) 是素数 ) 不好算,似乎对于 \(10^9\) 的数据,需要 Bernoulli 数和 Min25 筛,暂时没搞懂(挖坑)。

B.

题意:给定一棵边权 \([1,9]\) 的树,问所有有向路径上依次连接而成的十进制数字中,是 \(m\) 倍数的有多少个。

点分,合并两条路径对应的数字 \(a \oplus b=f(b)\cdot a + b\)\(f(x)\) 表示对应的十的幂,比如 \(f(8211)=10^4\) 。要求 \(f(b)\cdot a +b\equiv 0\ (\mod m)\) ,由于数据保证有 \(10\) 的逆元,所以 \(a \equiv \dfrac{-b}{f(b)}\) 。对模意义下的数字排序之后枚举 \(b\) ,二分查找 \(a\) ,然后点分常规套路,容斥一下减去子树答案。

C.

题意:给定一张无向图和其中 \(k\) 个点权,边权定义为两端点权异或和,问怎样设置未给出的点权,使得边权和最小。在此基础上,使得点权和最小。

按位讨论。一个点权不是 \(0\) 就是 \(1\) ,然后两个点间有边且点权相异就有 \(2^k\) 的贡献。最小割保证边权和最小。假设 \(S\) 表示 1 集合,最后从 \(S\) 开始 dfs ,直到可能的割边(残量 \(0\) )就停止,可以发现这样的 \(S\) 集合是最小的,就保证了点权和最小。

D.

chjingqi 大佬的 C 挺有趣的, A 在 hdhd 大佬博客有,好像明白了吧……

02.21 [多省联考 2018 模拟 Day 1]

A.

题意: 给定 \(n\) 个数,调整位置,使得满足 \(A_i\ge A_{\lfloor \frac{i}{k} \rfloor}\) ,并且下标最小的数尽可能大,此基础上下标第二大的数尽可能大……

限制关系是一棵树。数字不同的情况树形贪心就行。否则需要很神仙的线段树维护.

B.

题意: \(10\times 10\) 的棋盘,每个位置有 \(a_{i,j},b_{i,j}\) 两个数字,两个人轮流选一个上和左均有棋子的位置落子, 甲收益为 \(a\) ,乙为 \(b\) ,双方均聪明并最大化自己与对手分数的差,求最终结果。

最后走的是一个上梯形,维护轮廓线,合法情况 \((^20_10)\) 种,用括号序列表示的话,最大是 \(2^20\) 。搜索, \(f(s)\) 表示 \(s\) 轮廓线右下的部分,先手获得的最大差值。 \(f(s)=max\{gain-f(next)\}\) ,转移就是括号序列中的 \(01\rightarrow 10\) (凹的凸出来)。

C.

题意:一棵树,有点权,求所有的大小为 \(s\) 的连通块中第 \(k\) 大点权的和。

\(k\) 大点权是 \(i\) \(\Rightarrow\) 点权 \(\ge i\) 的点 \(\ge k\)

\(f(i)\) 表示第 \(k\) 大点权 \(\ge i\) ,大小 \(s\) 的连通块个数。

\(\sum_{i=1}^{w_{max}} f(i)\) ,一个第 \(k\) 大点权是 \(i\) 的连通块被计算了 \(i\) 次,看成乘 \(i\) 的话,这正好就是答案。

枚举 \(i\) ,用树上背包计算 \(f\)\(O(w_{max}n^2)\)

然后什么什么点分治 FFT ?我也不明白,听说 newuser 大佬暴力卡过了。

D.

这是今天为了凑互测赛,我搬的一道 hdu 的题,叫 Sum Of Gcd 。

题意:询问 \((l,r)\) ,表示求 \(\sum_{l \le i < j \le r}gcd(a_i,a_j)\)

Mobius 反演之后暴力用约数贡献,莫队维护。

02.22 [2018 多省省队联测 Day 2]

A. 劈配

题意:说不清楚。

从排名最前的选手开始,寻找导师,就是一个增广的过程,最大流。

第一问,依次添加每个选手的每一档志愿的导师,看是否可以增广,每一个选手增广成功后就把图存下来,然后讨论下一个选手。

第二问,二分一个位置,拿出 \(mid-1\) 个选手增广成功后的图,然后加入 \([1,s]\) 档志愿的导师,看是否能增广。

难点主要是读题障碍吧。

B. 林克卡特树

题意:给定带边权的树,求 \(k\) 条路径的最大权值和。

问题转化还是比较容易,从什么删边加边转化到求多路径权值和。带权二分套路,写 带权二分-一丢丢感悟 里了,想清楚那个取等时的边界,第二关键字怎样取就好了。

C. 制胡窜

题意:给定字符串,多个询问,问把原字符串切成非空的三段,至少有一段包含询问给定的子字符串的方案数。

\(ans = (^{n-1}_2)-k\)\(k\) 是切成三段,每段都不包含 给定子字符串的方案数。

\(k\) 只和子字符串的 Right 集合有关,所以先吃一发线段树合并维护 Right 集合具体是什么。

然后如果有三个无交的出现区间, \(k=0\)

还有很多情况,分类讨论挺恶心的,不写了。这题切成 2 段,考察线段树合并不好吗 Orz ,感觉像是两道题合并在一起了。

02.23 [2017 安师大附中集训]

A. 作业 (homework)

题意: \(f_0=\dfrac{1}{e},\ f_n=1-n \cdot f_{n-1}\) ,求 \(f_n\) ( \(n \le 10^4\) ) 。

\(f_0\) 当做变量,正着推会发现常数项比较复杂, \(f_0\) 的系数是一个阶乘。阶乘误差巨大,不行。

如果可以得到结论 \(f_n \in (\dfrac{1}{e(n+1)}, \dfrac{1}{n+1})\) ,直接倒着推, \(f_n = 1-\dfrac{f_{n+1}}{n+1}\) 就行了。我只能感性理解到 \(f\) 在递减……

但是还可以:

\[f_n = 1-\dfrac{f_{n+1}}{n+1}\\=\dfrac{1-\frac{1-f_{n+2}}{n+2}}{n+1}\\=\dfrac{1}{n+1}-\dfrac{1-f_{n+2}}{(n+1)(n+2)}\\=\dfrac{1}{n+1}-\dfrac{1}{(n+1)(n+2)}+\dfrac{1-f_{n+3}}{(n+1)(n+2)(n+3)}\\= \cdots \cdots\]

\(f_{lim\rightarrow \infty}=0\) ,所以取 \(30\) 项算一下,精度就够了。

大致思路是乘法误差远小于阶乘吧?

B. 恢复 (restore)

题意:给定 \(n\) 个点两两间距离,任意输出一种合法的 \(n\) 个点坐标。

两点确定后,就是两个圆求交,用三角函数也行,作差得到切线方程,再求直线和圆交点也行。

坑点是由于有两个交点 \(a,b\) 需要选择其一,最好不要用

Ans[i] = a;
if (fabs(get_dis(a, ans[p]) - Dis[a][p]) > EPS) {
    Ans[i] = b;
    break;
}

来决定选哪个,为了精度,最好枚举所有点 \(p\) ,把偏差值 \(fabs(get_dis(a, ans[p]) - Dis[a][p])\) 取一个 \(\max\) ,然后选小的作为答案。

那种 break 写法不好,因为 \(a,b\) 的偏差值都 \(> EPS\) 时,总是会选到 \(b\) ,根本没有比较 \(a,b\) 哪种更好,即偏差更小

还有一个细节就是初始两个点选 \((0,0),(x,0)\) 并不好,因为计算的时候坐标差有作为分母出现,所以需要一个非常好(实测太小不行,太大也不行,就用题目给出的精度最好)的 \(EPS\) 来把第二个点改为 \((x,EPS)\)

但实际上直接选 \((0,0),(\frac{x}{\sqrt 2}, \frac{x}{\sqrt 2})\) 就好, STL 里面的数学函数似乎总是很精确(就像通常不手打 \(\pi\) 而直接用 acos(-1) 更精确一样)……

C. 决战 (final)

题意:给定矩阵的 \(a_{1,1},a_{1,2}, \cdots, a_{1,n}\) ,其他地方任意填 \([-2000,2000]\) 的数,使得 \(det(a)=1\)

\(n=2\) 的情况,扩展欧几里得算法求解。

正解是考虑构造一个上三角矩阵 \(det = 1\) ,第一行还是给定的那些数,但是位置打乱了,然后再在不改变 \(det\) 的情况下改变成满足条件的矩阵。

这样构造:第一行寻找到任意一对互素的 \(a_{1,x}<a_{1,y}\ (x<y)\) 记为 \(m,n\),放到第一行最左两个位置,后面依次放原来第一行剩下的数。

求解 \(mx+ny=1\) ,然后第二行最左依次放 \(-y,x\) 。其他行主对角线位置放 \(1\) ,其余位置为 \(0\) 。这样把第二行加上第一行乘 \(\dfrac{y}{m}\) 后,整个是一个上三角矩阵, \(a_{1,1} \cdot a_{2,2}=m \cdot (x+\dfrac{y}{m}\cdot n)=mx+ny=1\) ,所以这个矩阵 \(det=1\) ,然后如果原来 \(m\) 不在 \((1,1)\)\(n\) 也不在 \((1,2)\) ,那直接把 \(1\) 列和 \(m\) 原来在的列交换, \(n\) 同理。否则一定是 \(m\) 原来在 \((1,1)\)\(n\) 不在 \((1,2)\) ,那交换一下 \(2\) 列和 \(n\) 原来在的列,然后再任意交换不是 \(1\) 行的两行。这样 \(det\) 不变,就构造完了。

D.

10 + 10 + 10 ,我打得可好了 T_T 。就 B 写了正解,结果用了 break 写法,还开了 EPS = 1e-6 ,就 10 分。 B 这种题肯定应该对拍嘛。毕竟 checker 非常好写,然而我没有,我是智障。

A 不会做,完全没思路。 C 的构造没想到。

整体难度诡异,没有部分分,打的时候感觉难上天,下来发现还是可做的,多多积累吧……

转载于:https://www.cnblogs.com/ghcred/p/10274017.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值