杂题乱做

UOJ317

对于每个 \(x\) 要么是 \(a\) 要么是 \(b\),爆搜即可

AGC023D

逆向思维,考虑最后一个visit哪个点

CF913F

考虑第一个scc后,将与第一个scc里的点有关的边全部计入ans,不计算其余点之间的连边,这样其余scc就可以变成子问题了

LOJ2504

\(P(x)\) 表示最小值为 \(x\) 的概率
\(Ans\ =\ \sum_{x}\ P(x)F(x)\)
发现 \(P(x),\ F(x)\) 都是多项式
\(G(x)\ =\ P(x)F(x)\),显然 \(G(x)\) 也是多项式
\(G(x)\) 积分之后仍是多项式
积分后只要求 \(G(n\ -\ 1)\) 就是答案
给多项式 \(F(x)\)\(0,\ 1,\ 2,\ ...,\ m\) 值,可以通过拉格朗日差值求出 \(0,\ 1,\ 2,\ ...,\ M\) 的值,可以通过卷积优化

LOJ536

二分图匹配判断一个点是否必定在最大匹配中的方法:跑网络流,在某个最大流中 \(S\)\(i\) 有边,且残留网络中不存在 \(S\)\(i\) 的路径。

BZOJ4259

\(*\) 的字符串匹配可以通过fft做

JOISC18 Fences

判断两线段是否相交,可以通过跨立实验。
判断线段是否有部分在多边形内,可以先判断是否与多边形的一条边有交点并且交点不在端点上,再判断线段两端是否在多边形内,最后判断如果都在多边形上。
最后要求点在多边形内,可以通过做一条射线,交点为奇数来判断,以此来跑最短路,比用角度做状态高的不知道哪里去了。。。

UOJ374

发现 \(min(t\ -\ 1,\ 2(t\ -\ h))\ =\ t\ -\ 1\) 的最多只有 \(O(log n)\) 个,问题就变成了如何维护一个点到根的路径上这样的边,可以用lct维护,复杂度是一个log,但是不会证啊qaq

TCO17 Final Easy

sxbk卡常题。。。
如果每次枚举第 \(i\) 个人开的那个桌子的大小,转移就是 \(O(n^3)\)
考虑改变转移状态,\(dp(i,\ j)\) 表示考虑完了所有 \(>\ i\) 的桌子之后还剩 \(j\) 个人要被安排桌子,这样直接枚举新开多少张大小为 \(i\ -\ 1\) 的桌子就行了,因为新开的大小为 \(i\ -\ 1\) 的桌子数一定不会多于 \(j\)。总复杂度就是 \(O(n\ *\ (\frac{n}{1}\ +\ \frac{n}{2}\ +\ \frac{n}{3}\ +\ ...\ +\ \frac{n}{n}))\ =\ O(n\ log_2\ n)\)

NFLSOJ100

对于一个数据结构如果要维护区间加和单点历史最小值的时候还需要维护历史最小标记

BZOJ3682

后缀平衡树的 \(\infty\) 不能设太大,因为如果区间两端都是 \(\infty\) 的话 \(l\ +\ r\) 会爆。
后缀平衡树重构的时候 \(tag\) 的值会更新,而本题中值更新后,却不用更新线段树的原因是对于线段树相关的值相对大小仍然不变。

BZOJ2555

SAM在copy的时候par会变,lct中要更新

UR17C

llround()函数和RAND_MAX
随机撒点精度不高,所以在拟合分数的时候分母不能过大,并且取因数较多的数

UR17B

abs在低版本的c++编译器上不支持long long
写计算几何的时候要注意,如果不是用double的话,叉积或者点积之后会爆int,如果之后再sqr的话要转double

ARC092D

\(u\ ->\ v\) 删去了之后 \(u\) 是否仍能到达 \(v\) 还有一种方法是从 \(u\) 的每个孩子依次 dfs,如果遇到遍历过的点就不访问,因为没有继续访问下去的必要了。

CF947E

\(A\) 为转移矩阵,问题变为求 \(A^M\cdot p\)
矩阵对角化:求 \(Q\) 使得 \(Q^{-1}AQ\ =\ B\) 为对角线矩阵。
有结论 \(B_{i,\ j}\ =\ [i\ =\ j]\cdot \lambda_i\)\(\lambda_i\) 为特征多项式的一个根,\(Q\ =\ (v_1,\ v_2,\ v_3,\ ...,\ v_n)\)\(v_i\) 为特征值为 \(\lambda_i\) 时的 \(A\) 的特征向量。
对角化后有 \(A^M\ =\ QB^MQ^{-1}\)\(B^M\) 计算复杂度为 \(O(N\ log\ M)\)
\(Av\ =\ \lambda_iv\ =\ \lambda_iIv\)
\((A\ -\ \lambda_iI)\ v\ =\ 0\)
因为 \(|\ A\ -\ \lambda_iI\ |\ =\ 0\),所以直接暴力高斯消元,另 \(v_i\ =\ 1\),然后找一波规律就可以把 \(Q\) 解出来了,发现也是个上三角矩阵,直接反演一下求出 \(Q^-1\)
还用到的trick就是不要从左向右乘,从右向左每次乘向量,复杂度少个 \(N\)

CF949E

30多人过的套路题都不会做了,没救了啊。。。
发现每一位要么是 \(1\) 要么是 \(-1\) 之后直接搜索,可以证明如果一个数 \(a\)\(abs(a)\ \&\ (1\ <<\ i)\ \neq\ 0\),则构成 \(a\) 一定需要用 \(1\ <<\ i\)\(-1\ <<\ i\)
那么从低位向高位扫,如果对于第 \(i\) 位,当前的数中没有需要用 \(1\ <<\ i\)\(-1\ <<\ i\) 直接不填,否则暴力枚举填 \(1\ <<\ i\) 还是 \(-1\ <<\ i\)。枚举完后对当前所有需要的数操作一遍,得到一个新的数列 \(b\),且 \(\forall\ x\ \in\ b,\ x\ \&\ (1\ <<\ j)\ =\ 0\ (j\ \leq\ i)\)
时间复杂度分析可以考虑如果还剩 \(j\) 层没填,剩余的数至多只有 \(2^j\) 个,所以复杂度类似于线段树,即 \(O(n\ log\ n)\)

SHOI2017 相逢是问候

可以通过预处理 \(c^i\ (i\ \leq\ \sqrt{N})\)\(c^{i\cdot \sqrt{N}}\) 来做到 \(O(1)\) 回答 \(x^N\)

CF744D

感觉计算几何还是挺有趣的啊,有空可以多研究研究
二分最后的答案,可以发现最后的圆至少经过一个点,枚举那个点,然后计算出其余的点在被这个圆包含时圆心位置的范围,扫描线扫一波即可
如果是每次二分一个值,然后对所有的点判一下是否可行的话需要 \(O(log\ 10^9\ N^2\ log\ N)\)
如果先random_shuffle一遍点的顺序,然后对每个点先check当前的答案是否可以满足,如果满足再继续二分,期望复杂度为 \(O(log\ 10^9\ log\ N\ N\ log\ N)\),复杂度计算的时候可以考虑如果第 \(i\) 个遍历的点check之前的答案可以满足的概率为 \(\frac{1}{i}\),所以 \(\frac{1}{1}\ +\ \frac{1}{2}\ +\ ...\ +\ \frac{1}{N}\ =\ log\ N\)

SRM720-Hard

整体二分最后要assign的value
对于一个给定的 \(x\),考虑在最优解中哪些value要 \(>\ x\)
由于本题中函数 \(f(val_i\ -\ w_i)\) 具有单峰性,所以可以证明如果只允许assign \(x\)\(x\ +\ 1\),计算出来的哪些要 assign \(x\ +\ 1\) 的点,在最终 value 一定 \(>\ x\)
只有 \(x\)\(x\ +\ 1\) 的话直接就变成了最大权闭合子图,这都忘了,网络流怕是没救了qaq

CF54E

对一个多边形,直接扫一遍,然后相邻det加起来可能是负的,要abs一下

AGC021F

afo之后啥都忘了
按照 \(M\) 扫过去进行 \(dp\),前 \(i\) 层已经填了多少个 \(A\)
同时保留没填 \(A\) 的行无法转移,考虑在转移的时候将新的行插入就没了。。。

AGC021D

对于字符串 \(S\)\(reverse(S)\) 的串 \(S'\),最长公共子序列长度可以通过如下方式构造出。
\(a_1\ \leq\ a_2\ \leq\ a_3\ \leq\ ...\ \leq\ a_m\)\(b_1\ \geq\ b_2\ \geq\ b_3\ \geq\ ...\ \geq\ b_m\),且 \(s_{a_i}\ =\ s_{b_i}\)
\(\forall\ i\ \leq\ k,\ a_i\ =\ b_{m\ -\ i},\ b_i\ =\ a_{m\ -\ i}\) 其中 \(k\ =\ \left \lfloor \frac{m}{2}\right \rfloor\)

CC 2018 Feb LUCASTH

看到 \(\sum_{i\ =\ 0}^{P\ -\ 1}\ (ix\ +\ 1)^{a_i}\) 都不会求了qaq,直接分治fft一波就没了啊。。。
发现unsigned第一类斯特林数 \(|S(n,\ k)|\ =\ [x^k]F_n(x)\) 其中 \(F_n(x)\ =\ \Pi_{i\ =\ 0}^{n\ -\ 1}\ (x\ +\ i)\),所以有 \(F(n, k)\ =\ |S(n\ +\ 1,\ k\ +\ 1)|\)

51nod1258

题解by wwt

PE169

如果拆分方案中有1的话枚举1的个数推出递归式

CF438E

打了个多项式板子
在求inv和sqrt的时候一定要注意不要变成循环卷积了,每个数组\([l,\ l2)\)一定要清0

CF891E

解题的第一步结论还是挺重要的
遇到\(\binom{n}{i_1\ i_2\ i_3\ ...i_m}\)的时候可以考虑使用EGF
这题里需要熟悉常见的EGF和之间的变形

BZOJ3456

dp式子推完之后一种是分治fft,还有一种可以考虑将所有包含dp的放在等号一边,其余的放在等号另一边,就是一个多项式求逆了
学了一波生成函数相关的知识以及多项式\(ln\)和多项式\(exp\),注意一定要对\(\frac{2^{\binom{n}{2}}}{n!}\)\(ln\)

CF794G

对于由01串\(s\)\(t\)拼接成的长度相同的两个字符串\(A\)\(B\), 如果\(A\ =\ B\),那么对应的不同的\(s\)\(t\)的个数只有\(2^{gcd(|s|,\ |t|)}\)个,特别的如果\(gcd(|s|,\ |t|)\ =\ 1\),则\(s\)\(t\)中的每个字符都相等

UOJ316

UOJ58

x +=  (long long)a * b;

x +=  1ll * a * b;


在莫队的时候最后一维的顺序根据倒数第二维的奇偶性判断正序还是逆序
树上莫队的时候用\(n^{\frac{2}{3}}\)\((2n)^{\frac{2}{3}}\)

BZOJ2120

学了一波带修改莫队
将修改操作单独拉出去考虑,可以对其建成一个链表的形式,快速得到每次修改的上一次修改和下一次修改
将询问操作变成三个值\((l,\ r,\ t)\),表示对于\([l,\ r]\)区间,一直到\(t\)时刻的修改都做过之后的答案
\((\frac{l}{B},\ \frac{r}{B},\ \frac{t}{B})\)排序,\(B\)\(N^{\frac{2}{3}}\)

BZOJ2120

一个cdq分治的题目现在已经不会做了
考虑将这个题目变成对每个\(i\)存储上次\(a_i\)出现的位置\(pre_i\),然后就变成了有两种操作,一个是询问\([l,\ r]\)\(pre_i\ <\ l\)的个数,第二个是将\((x,\ y)\)修改成\((x,\ z)\)
将第二种操作拆成两个后可以cdq分治做
每次考虑\(y\)\([l,\ r]\)范围内的所有询问和操作,在递归到\([l,\ mid]\)和[mid\ +\ 1,\ r]\(之前,将\)y\(坐标在\)[l,\ mid]\(区间里的加入删除点操作对\)y\(坐标在\)[mid\ +\ 1,\ r] 区间里的询问的贡献先计算

UOJ327

可以用\(O(n\ logn)\ -\ O(1)\)的lca,这样每次询问可以变成\(O(1)\)
也可以不建trie,直接建树,记录hash值,然后做lca的时候判断

UOJ310

连蒙带猜就把解法给凑出来了qaq
对每个\(a_i\)都要做一次fwt,然后求乘积不太可做,但是打表可以发现,对只有一个数非0的序列做fwt之后的结果只有两种
在本题中,只有\(3\)\(-1\),所以可以考虑将乘积变成对绝对值做\(log_3\),将乘法变成加法
对于\(a_0,\ a_1,\ a_2,\ ...,\ a_{n\ -\ 1}\)做fwt等价于对\(\{a_0,\ 0,\ 0,\ ...,\ 0\},\ \{0,\ a_1,\ 0,\ ...,\ 0\},\ \{0,\ 0,\ a_2,\ ...,\ 0\},\ ...,\{0,\ 0,\ 0,\ ...,\ a_{n\ -\ 1}\}\)做fwt之后每一位的和
题解里有关于FWT的FFT形式式子,感觉挺有启发性的orz

UOJ272

看到这种题面就想到fwt
暴力矩乘打表后可发现其实只要确定了第一行,整个矩阵就可以确定
仔细分析可以发现\(A^t_{x,\ y}\ =\ A^t_{0,\ y\ -\ x}\)(这里为三进制不带进位减法)
证明可以通过数学归纳法证明
然后就可以通过fwt解决啦
问题主要在求\(\omega\)
可以对\(P\)分解质因数得\(P\ =\ \prod_i\ p_i^{q_i}\)对每一项求\(\omega\)然后crt
在对每个\(p^q\)求的时候,可以求出原根\(root\),则\(\omega\ =\ root^{\phi(p)}\)
原根定义可见http://blog.csdn.net/fuyukai/article/details/50894609
在求原根的时候可以在暴力枚举\(root\)的时候check\(root^x\)是否为1,x的值只需要试\(\phi(q)\)的约数

CF850F

居然是原题。。。自己做过的题太少了。。题解pdf里有

CF878E

有些倍增的题目可以通过对询问离线之后用dsu做

CF806F

CF815C

推出了dp,但是复杂度算错。。。好菜啊
复杂度应该这样算,最坏情况下,是完全二叉树的情况,那么复杂度是:
\(T(n)\ =\ 2T(\frac{n}{2})\ +\ O(n^2)\ =\ O(n^2)\)

BZOJ4382

对每个数分出的区间标号,比较标号一样可以通过hash

CF855F

终于学会了吉司机线段树最简单的做法

CF819D

合数的逆元要用extgcd!!!

CF819C

数论题不能思维江化啊,一开始直接想莫反就gg了
1e18里的数因数最多的只有1e5级别

CF830E

tm就是纯数学题吧。。。刁难我这种mo啥奖都拿不到的人啊qaq
感觉最恶心的就是只有一个度为3的点,找出它的三个子树,设节点数分别为\(p,\ q,\ r\),赋的值分别为\(a_{1,\ 2,\ 3,\ ...,\ p},\ b_{1,\ 2,\ 3,\ ...,\ q},\ c_{1,\ 2,\ 3,\ ...,\ r}\),度数为3的点值为\(v\ =\ a_{p\ +\ 1}\ =\ b_{q\ +\ 1}\ =\ c_{r\ +\ 1}\)
题面变成使\(\sum_{i\ =\ 1}^p\ a_i^2\ +\ \sum_{i\ =\ 1}^q\ b_i^2\ +\ \sum_{i\ =\ 1}^r\ c_i^2\ -\ \sum_{i\ =\ 1}^p\ a_i\ a_{i\ +\ 1}\ -\ \sum_{i\ =\ 1}^q\ b_i\ b_{i\ +\ 1}\ -\ \sum_{i\ =\ 1}^r\ c_i\ c_{i\ +\ 1}\ +\ v^2\ \leq\ 0\)
这时有个非常妙的裂项
注意到\(2\ (\sum_{i\ =\ 1}^{p\ +\ 1}\ a_i^2\ -\ \sum_{i\ =\ 1}^p\ a_i\ a_{i\ +\ 1})\ =\ \sum_{i\ =\ 1}^p\ \frac{i\ +\ 1}{i}\ (a_i\ -\ \frac{i}{i\ +\ 1}\ a_{i\ +\ 1})^2\ +\ \frac{p\ +\ 2}{p\ +\ 1}\ v^2\)
于是式子可以变成\(X\ +\ Y\ +\ Z\ +\ (\frac{1}{p\ +\ 1}\ +\ \frac{1}{q\ +\ 1}\ +\ \frac{1}{r\ +\ 1}\ -\ 1)\ v^2\ \leq\ 0\ (X,\ Y,\ Z\ \geq\ 0)\)
因此只有在\(\frac{1}{p\ +\ 1}\ +\ \frac{1}{q\ +\ 1}\ +\ \frac{1}{r\ +\ 1}\ \leq\ 1\)时有解
构造答案的时候只需要分三种情况讨论即可:
\(\{p,\ q,\ r\}\ =\ \{2,\ 2,\ 2\},\ \{p,\ q,\ r\}\ =\ \{1,\ 4,\ 4\},\ \{p,\ q,\ r\}\ =\ \{1,\ 2,\ 5\}\)

CF866G

给函数传数组的时候,对于\(int\ *a\),memset的时候不能\(memset(a,\ 0,\ sizeof(a));\)
想出了矩乘优化dp的算法,可是cf跑不过去。。。本机才跑1.5s, cf要5s, 垃圾cf评测机
不过这种题看到就一种多项式的感觉嘛>_<
\(P(x)\ =\ \sum_{i\ =\ 1}^n\ x^{a_i}\)
如果令\(Q(x)\ =\ \sum_{i\ =\ 1}^m\ x^{b_i}\)的话,没法求解,想到这就不会了
还是不会多项式啊,这时候应该可以考虑多项式取模的过程,其实就等价于填方案的过程
所以令\(Q(x)\ =\ 1\ -\ \sum_{i\ =\ 1}^m\ x^{b_i}\),答案即为\(P^N(x^{-1})\ (mod\ Q(x))\)\(x^0\)系数

CF866C

还是不会期望qaq
如果直接上dp,没法做,这时候考虑二分最后的答案ans,这样整个问题就不会再出现从头开始这种没法处理顺序的dp了。
每一关的时候如果打完这关要选择reset,就直接把转移的值\(+ans\)
最后将dp[0][0]和ans比较

CF871E

读入优化的时候数组不够,以后要注意用fread写读入优化

CF843D

用队列模拟dijkstra过程,去掉一个log

CodeFestival2017 Qual.A E

感觉自己数学水平就是小学生的啊,组合式根本推不出来qaq 可以推出\(\sum_{i\ =\ 1}^n\ \binom{a\ +\ i\ -\ 3}{i\ -\ 1}\ \binom{b\ +\ n\ -\ i\ -\ 1}{n\ -\ i}\ =\ \sum_{i\ =\ 1}^n\ \binom{a\ +\ i\ -\ 3}{a\ -\ 2}\ \binom{b\ +\ n\ -\ i\ -\ 1}{b\ -\ 1}\ =\ \binom{n\ +\ a\ +\ b\ -\ 3}{a\ +\ b\ -\ 2}\),见到\(\binom{n\ +\ m\ -\ 1}{n}\)可以考虑表示成\(1\ \leq\ x_1\ \leq\ x_2\ \leq\ \cdots\ \leq\ x_n\ \leq\ m\),然后来推。题解的做法是将组合数表示成一个n*m网格左上到右下角路径条数,感觉智商根本想不出啊orz

BZOJ5006

自己犯了许多傻吊错误改了半天qaq
直接用dp[s]来进行记忆化搜索,状压经常跑不满。取模的时候注意pw2[30]已经超过了mod,
注意

int &ans = dp[S];
if(!(S & pw[cur])) {
    return ans = DP(S, cur - 1);
}

会wa,
应该用

while(S & pw[cur]) {
    --cur;
}

51nodR29F

考虑dp[s][d]表示距离s为d的有多少个,按位转移即可

CF866D

从后向前贪心,每次买当前的,并卖一个之后的,如果更优就进行该操作。这样向前扫的时候有撤销操作,可以保证答案最优

CF868F

猜到决策单调性之后直接分治,一开始一直以为分治会Tqaq。高老师说他只会两个log的,我觉得他非常的假啊
高老师教了我一种比较好的实现方法是通过类似莫队左移右移的方法来实现,这样只需要在每次求值的时候修改,效率更高

CodeFestival2017 Qual.B F

一开始想分类讨论,发现细节特别多。
应该注意到分类之后,产生了新的三种串,所以可以通过递归解决。

AGC013F

AGC012F

对于这类求可能产生的序列个数的题目,先把可能产生的序列的性质给推出来再做

AGC001F

对于一个序列,如果操作不能交换值为\(x\)的数和值为\(y\)的数,则无论怎么交换\(x\)均在\(y\)之前
问题就转化成了每次取最小的\(i\)使得\(i\)\([i\ -\ K\ +\ 1,\ i\ +\ K\ -\ 1]\)\(p[i]\)最小的
直接做会炸,题解用了先按\(K\)分块的技巧,之后,每个满足条件的数,首先必须满足是在块内最小值

AGC014F

题解的做法根本想不到,看了几个用线段树+treap的做法,但是不是太会证复杂度啊,感觉可能是数据水?

CF878D

感觉正常用数据结构的方法没法做,考虑枚举最后的答案,将大小关系变成0和1,压位做

CF868E

dp状态比较好想,转移的时候变成从贼的角度贪心进行

posted @ 2018-03-12 10:45  King_George  阅读(533)  评论(0)    收藏  举报