摘要:
我的做法从一篇古老的博客学的,好像网上很少。不需要任何特判! 首先当然要算$a_i$的范围。 设最高位是$2^x$,考虑这一位能异或出来的概率。很多方法都能算出来$\frac{1}{2}$。 所以$\frac{1}{2}*2^{xk}<2^{63}$ 也就是$xk<64$ 这样就知道了$k=1$的2 阅读全文
摘要:
经常忘所以记一下。 我们都知道,普通卷积就是多项式乘法,$i$和$j$贡献到$i+j$。 狄利克雷卷积大同小异,$i$和$j$贡献到$i*j$。 要想数学一点可以这么说 盗图真爽 接着来 运算律很好理解,结合律就是$i,j,k$贡献到了$ijk$。 有一些恒等式可以用卷积简单的写出来。二和三就是定义 阅读全文
摘要:
是否还在为斜率优化发愁?怎么理解?怎么写?快看本博客,大伙看了都说好,史上最优秀的小白级讲解,令人拍案叫觉,享誉全球。 我是认真来作解说的 先看一道经典题特别行动队 可以列出转移方程 \(dp_i=\max \left\{ dp_j+a(sum_i-sum_j)^2+b(sum_i-sum_j)+c 阅读全文
摘要:
快看,这里有个蒟蒻不会写单调队列! 弱者就是弱。啥思路没有,码力还不行。 显然的思路是考虑每一个中心点,求最大边长。发现每个点的限制挺难维护的。其实可以把限制拆开,拆成上下左右四个方向,最后求个min。 以向上的方向为例。我们想求向上能扩展的最大边长。从上往下扫,维护半径单调递增的单调队列,每次从队 阅读全文
摘要:
代码是最好的教程。 广义sam int tt=1; inline void extend(int c){ int p=lst,q,np,nq; if(ts[p][c]){ q=ts[p][c]; if(len[q]==len[p]+1)lst=q; else{ lst=nq=++tt; memcpy 阅读全文
摘要:
以前做这题的时候没啥思路。该多练练找性质的题了。尤其这个性质还这么显然。 考虑环的情况:如果把每一个装备的两个性质连边,任何一个环上的所有点都能取到。 应该不难理解吧。进一步可以发现,从这个环往外扩展,整个联通块都能被取到。 所以只剩下树的情况了。我们惊喜地发现边变少了,可以用二分图做了。 其实可以 阅读全文
摘要:
mengbier学长的一道好题。看了提示才做出来。 首先发现的$(a_i,b_i)$的顺序对答案没有影响。考虑把b序列从1到n固定,依次把a序列的$1..n$分配给b。假如当前扫到了$i$,分情况讨论分在左边还是右边,我们可以把分在右边的数看成是“游离的”,也就是位置可以随便换,需要的时候再取出来。 阅读全文
摘要:
先放一下代码。题解日后再补。 怎么说呢,以前老是反感猜结论,其实多猜猜就不会这么想了。 //80分部分分 乱搞做法 #include<bits/stdc++.h> using namespace std; typedef pair<int,int> pii; #define forg(i,x) fo 阅读全文
摘要:
事实证明,省选题数据精心造水。我写的那个代码,漏洞多多的,对拍WAON1,AC绿绿的。 这题是一道被出烂了的集合合并,咋做都可以,不过我们闲的写一个splay启发式合并,有个结论,splay按照中序遍历合并,合并一次是均摊$O(1)$,总共$nlog$。 #include<bits/stdc++.h 阅读全文
摘要:
普通平衡树板子 访问空指针会出错,我用了一个nil代替他。(c++是谁设计的我还得把结构体定义在外面真难受) #include<bits/stdc++.h> using namespace std; #define forg(i,x) for(rint i=fir[x];i;i=nxt[i]) #d 阅读全文