「Poj1845」Sumdiv 解题报告】的更多相关文章

题面戳这里 啥都别看,只是求 \(a^b\)所有的因数的和 思路: 真没想到! 其实我们可以先将\(a^b\)分解成质因数的 因为\(a^b\)的因数肯定是\(a^b\)的质因数在一定的条件下相乘而成的 然后组合一下 正解!!! h^ovny:走开!别误导别人! 来一波公式: \(a=\Pi^n_{i=1}p[i]^{c[i]}\) \(a^b=\Pi^n_{i=1}p[i]^{c[i]*b}\) 所有因数的和: \(Ans=\Pi_{i=1}^n\Sigma^{k[i]}_{j=0}p[i]^…
「ZJOI2016」旅行者 对网格图进行分治. 每次从中间选一列,然后枚举每个这一列的格子作为起点跑最短路,进入子矩形时把询问划分一下,有点类似整体二分 至于复杂度么,我不会阿 Code: #include <cstdio> #include <cctype> #include <cstring> #include <queue> #include <vector> #include <algorithm> using std::mi…
「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写的. 大值思路是对每个子树维护成一个大节点,存一些根啊,深度啊,到大节点根距离啊,节点编号范围啊之类的信息. 然后发现维护相对节点标号大小是个区间第k大,得对dfs序建一颗主席树 然后每次询问倍增跳一跳,讨论个几种情况之类的. ps:别吐槽名字 Code: #include <cstdio> #i…
「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的,但注意它是单调的 于是每个点假装向左边第一个小于它的位置连边,就可以处理出前缀和一样的东西,然后预处理后也是\(O(1)\)的 Code: #include <cstdio> #include <cctype> #include <algorithm> #include…
「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这个路径条数等于大于当前答案的所有路径条数,那么这个答案是不行的. 关于链修改单点询问,可以树状数组维护dfs序,然后每次修改链去差分修改 然后把二分答案拿到整体二分上去就可以了 Code: #include <cstdio> #include <cctype> #include <…
「HAOI2018」染色 是个套路题.. 考虑容斥 则恰好为\(k\)个颜色恰好为\(c\)次的贡献为 \[ \binom{m}{k}\sum_{i\ge k}(-1)^{i-k}\binom{m-k}{i-k}\binom{n}{si}\frac{(si)!}{(s!)^i}(m-i)^{n-si} \] 有两项最开始搞忘了..\(\binom{n}{si}\frac{(si)!}{(s!)^i}\)就是这两个 代表钦定\(si\)个位置去染,然后染色本身是个可重排列 设\(d=\min(\l…
「HNOI2016」最小公倍数 考虑暴力,对每个询问,处理出\(\le a,\le b\)的与询问点在一起的联通块,然后判断是否是一个联通块,且联通块\(a,b\)最大值是否满足要求. 然后很显然需要去离线搞一下,考虑定期重构. 具体的,先把边按\(a\)排序,然后每\(S\)分一块. 处理每一块时,把前面所有块的边和权值在这个块内的询问放在一起按\(b\)排序,这个可以用类似归并的思路\(O(n)\)完成. 然后遍历这个排序后的东西,用带权并查集维护联通性. 具体的,如果是边,就在并查集里面加…
「SCOI2016」围棋 打CF后困不拉基的,搞了一上午... 考虑直接状压棋子,然后发现会t 考虑我们需要上一行的状态本质上是某个位置为末尾是否可以匹配第一行的串 于是状态可以\(2^m\)压住了,但还是会T 考虑到复杂度瓶颈在于每行的状态都要枚举上一行的状态,是按行转移的. 那么如果做一个轮廓线,就可以按格子转移 考虑有那些状态,当前格子\(i,j\),当前轮廓线是否可以匹配第一行的串的状态\(s\) 然后你试试发现如果想好好转移 得存一个\((i,j)\)匹配到第一行串的位置\(x\),和…
「SCOI2016」妖怪 玄妙...盲猜一个结论,然后过了,事后一证,然后假了,数据真水 首先要最小化 \[ \max_{i=1}^n (1+k)x_i+(1+\frac{1}{k})y_i \] \(k\)是大于0的正实数 最大值显然在上凸包上,先把上凸包搞出来 然后每个点成为最大值时,\(k\)都有个取值范围(就是它左边或者右边的点成为最大值时) 然后对每个点用均值不等式得到最小值为 \[ \begin{aligned} z&=kx+\frac{1}{k}y+x+y\\ &\ge2\s…
「SCOI2016」美味 状态极差无比,一个锤子题目而已 考虑每次对\(b\)和\(d\)求\(c=d \ xor \ (a+b)\)的最大值,因为异或每一位是独立的,所以我们可以尝试按位贪心. 如果要求\(c\)的从低到高第\(i\)位为\(0\)(最低位为第\(0\)位),那么此时\(c\)的更高位是确定好的了 \[ \_\_\_\_\_\_\_01111111\\ \_\_\_\_\_\_\_00000000 \] 这是\(c\)的上界和下界,分别减去\(b\)后,得到\(a\)需要满足的…
「SCOI2016」萌萌哒 这思路厉害啊.. 容易发现有个暴力是并查集 然后我想了半天线段树优化无果 然后正解是倍增优化并查集 有这个思路就简单了,就是开一个并查集代表每个开头\(i\)每个长\(2^j\)的区间的归属 然后合并就随便合并 最后需要\(2^0\)的信息,从上面把信息分裂传下来就好了 Code: #include <cstdio> #include <cctype> const int N=1e5+10; template <class T> void r…
「TJOI2015」概率论 令\(f_i\)代表\(i\)个点树形态数量,\(g_i\)代表\(i\)个点叶子个数 然后列一个dp \[ f_i=\sum_{j=0}^{i-1} f_j f_{i-j-1}\\ g_i=2\sum_{j=0}^{i-1} f_j g_{i-j-1} \] 然后显然可以卷,但没有1e5的部分分 然后打表 \[ \frac{1}{1} \ \ \frac{3}{3} \ \ \frac{6}{5} \ \ \frac{10}{7} \ \ \frac{15}{9}.…
「TJOI2015」旅游 LCT沙比题 考虑我们其实是在维护一条链的\(\max\limits_{i<j} v_j-v_i\) 每次直接拿左右子树更新一下就可以了 写的时候把两个方向都维护一下,方便翻转 Code: #include <cstdio> #include <cctype> #include <algorithm> template <class T> void read(T &x) { x=0;char c=getchar();…
「TJOI2015」组合数学 这不是个贪心吗? 怎么都最小链覆盖=最大点独立集去了 注意到一个点出度最多只有2,可以贪心一下出度的去向 按读入顺序处理就可以,维护一个\(res_i\)数组,表示上一行第\(i\)列可以流给下面那个格子的次数,然后如果当前这个格子不够用,从右往左把所有的还有次数的\(res\)拿过来给当前格子用就可以了. 考虑这样的正确性,每个格子已经用了上面的,当然继续从左边的用啦 Code: #include <cstdio> #include <cctype>…
「TJOI2015」线性代数 和牛客某题很像 在和里面有\(B_{i,j}\)要求是\(A_i,A_j\)都为\(1\),和里面减去\(C_i\)要求\(A_i\)为\(1\),然后先把贡献也就是\(B_{i,j}\)加上,然后建图跑最小割,建图方法和牛客那题一样 另外1e6条边为什么也可以跑过去啊,还很快.. Code: #include <cstdio> #include <cctype> #include <cstring> const int N=510; co…
「NOI2014」购票 写完了后发现写的做法是假的...然后居然过了,然后就懒得管正解了. 发现需要维护凸包,动态加点,询问区间,强制在线 可以二进制分组搞,然后你发现在树上需要资瓷撤回,然后暴力撤回(雾 然后就被卡了 卡法,在\(2^k-1\)位置搞一朵菊花 先留坑,以后要是会了一些神奇的姿势就来搞 这题叉积会爆ll,坑 Code: #include <cstdio> #include <cctype> #include <vector> #include <a…
「SDOI2014」重建 题意 给一个图\(G\),两点\((u,v)\)有边的概率是\(p_{u,v}\),求有\(n-1\)条边通行且组成了一颗树的概率是多少. 抄了几个矩阵树定理有趣的感性说法 矩阵树定理的度数矩阵记录的是每个点的边权和,邻接矩阵记录的是边权,求的则是所有生成树的边权乘积和 考虑Kirchhoff矩阵的意义:\(K[G]=D[G]−A[G]=B[G]B^T[G]\),之所以能够进行生成树计数是对于其伴随矩阵在计数\(n−1\)条边的集合时,当\(n−1\)条边中存在环就会产…
「SDOI2014」Lis 题目描述 给定序列 \(A\),序列中的每一项 \(A_i\) 有删除代价 \(B_i\) 和附加属性 \(C_i\). 请删除若干项,使得 \(A\) 的最长上升子序列长度减少至少 \(1\),且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性排序之后,字典序最小的一种. \(T\le 5,1\le n\le 700,1\le A_i,B_i,C_i\le 10^9\) 上午想这个题的时候,有一种迷之直觉,让我去做网络流24题的最长不下降子…
#2205. 「HNOI2014」画框 最小乘积生成树+KM二分图带权匹配 维护一个\((\sum A,\sum B)\)的匹配下凸包,答案在这些点中产生. 具体的,凸包两端可以直接跑单独的\(A\)权与\(B\)权的最小带权匹配 然后进行分治,每次找离线段的最远点加入匹配 用叉积推一下式子可以得到进行匹配的图的边权,然后继续跑KM就可以了 Code: #include <cstdio> #include <cstring> #include <algorithm> #…
「NOI2017」蔬菜 首先考虑流 可以从 \(s\) 流入表示得到蔬菜,流出到 \(t\) 表示卖出蔬菜,给每个蔬菜拆点,并给它它每天应得的蔬菜. 但是我们没办法直接给,注意到如果把变质看成得到并可以留给上一天,我们每天就可以得到变质的蔬菜并获得从后一天没用完的蔬菜,这就是建图的大体思路. 然后你发现这个东西需要对询问天数动态加点,加点后发现需要退流,可以暴力退 \(m\) 的流,复杂度是正确的. 期望得分 \(60\) 分 然后研究一下,发现退流是没有必要的,也就是说第 \(i\) 天选择的…
「NOI2017」游戏 \(d\)这么小,你考虑直接对\(d\)个东西暴力 枚举\(x\)为\(a\)或\(b\)(\(c\)就不用了,因为\(a,b\)已经包含\(c\))了,剩下的就是个\(2-sat\)问题了 但是你发现有个情况是,在若\(A\)即\(B\)时,如果\(B\)被\(ban\)了,那么\(A\)也要被\(ban\) 我们记录一下被\(ban\)的点,然后在球方案的时候判一下(不得不用topo排序了.. 但是其实也可以\(A\)连\(\lnot A\),就可以直接比较SCC编号…
「NOI2017」整数 有一些比较简单的\(\log^2n\)做法 比如暴力在动态开点线段树上维护每个位置为\(0\)还是\(1\),我们发现涉及到某一位加上\(1\)或者减去\(1\)实际上对其他位的影响只有区间覆盖,通过线段树上二分可以得到区间覆盖的位置,然后暴力区间覆盖即可. 反正我这种菜鸡大常数写法只得到了68分.. 考虑利用势能,注意到如果同时改变加法和减法,势能很容易被\(b\)搞掉 如果分开维护加法和减法,把位置上的\(1\)的个数当做势能,可以发现,暴力修改是均摊\(O(n\lo…
「NOI2016」网格 容易注意到,答案最多为2,也就是说答案为-\(1,0,1,2\)四种,考虑逐个判断. 无解的情况比较简单 如果\(nm\le c+1\),显然无解 如果\(nm=c+2\),判断2个跳蚤(如无说明,以下白点指跳蚤)是否四联通(如无说明,以下联通均指四联通),如果是,无解. 先不考虑复杂度 \(0\)的情况,就是白点有两个以上联通块,可以直接bfs判断 \(1\)的情况,就是白点存在割点,可以通过tarjan判断 \(2\)的情况,就是其他情况 这样的复杂度是\(O(Tnm…
「NOI2016」区间 最近思维好僵硬啊... 一上来就觉得先把区间拆成两个端点进行差分,然后扫描位置序列,在每个位置维护答案,用数据结构维护当前位置的区间序列,但是不会维护. 于是想研究性质,想到为什么要拿区间长度做权值呢,难道是有一些性质吗 于是思考了很久区间长度的性质,猜了一些sb结论,比如什么一个区间只有加入时和删除时的贡献算一下就可以了之类的... 全错了然后就自闭了... 然后想什么钦定最大值,然后询问位置区间,然后我发现线段树每个点要挂一个单调队列(事实上把单调队列从线段树上拿下来…
「ZJOI2019」语言 3个\(\log\)做法比较简单,但是写起来还是有点麻烦的. 大概就是树剖把链划分为\(\log\)段,然后任意两段可以组成一个矩形,就是个矩形面积并,听说卡卡就过去了. 好像这个可以被优化到两个\(\log\),算了,估计挺麻烦的. 一个\(\log\)的做法看起来还挺厉害的. 考虑钦定某个点算它的贡献,于是我们要算的是所有经过它的链的并的大小. 但是染色这个东西看起来就很不可搞,我们可以挖掘一下这个并的简单性质. 注意到,这个并是联通的,可以看做是一个生成子树,然后…
题面 传送门 思路: 离散化.hash 对于这样一个明显的统计排序的题目,当然轻而易举啦~ 但是!看!语言的编号 a数组和 b数组的值最大在\(10^9\)的级别,所以开个数组来存---That's impossible! 所以我们可以用上离散化(也就是hash) 离散化,我们有两种写法 第一种是自己手码代码 先排序,然后去重,接着用二分一一对应,达到离散化的目的 板子: sort(b+1,b+n+1,cmp); n=unique(b+1,b+n+1)-b-1; for(i=1;i<=n;i++…
UVA1328 Period 其他链接:luogu UVA1328 POJ1961 For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (\(2 \le i…
English题面 题意: 给你一个长度为n的字符串,依次取字符串前i个(前缀),如果前缀由k(k>0)个相同真子串构成,那么输出i和k 直到n为0结束,每组数据后要有一行空白 思路: KMP+一点点判断 其实这道题并不是很难 可以先用KMP求出最长的 是s[1~i]的前缀和后缀的真子串的长度j 话说的有点复杂,分开来理 1.真子串: 不是字符串本身的子串 2.是s[1~i]的前缀和后缀: 以aabaab为例 aabaab aabaab aab是aabaab的前缀,又是后缀 j=3 两种条件下:…
题面 看不懂?! 大概的意思就是: 给出一个长度为n的序列,然后每次只能交换相邻的两个数,问最小需要几次使序列严格上升 不断读入n,直到n=0结束 思路: 交换相邻的两个数,这不就类似冒泡排序吗?但是n<500000 算了吧,我回去颓A+B 于是我们就发现用冒泡排序直接计算次数是行不通的 但我们要知道: 冒泡排序的交换次数就是序列的逆序对数!!! 所以--就简单了吧~ 如何求逆序对? 较easy版的逆序对 1.归并排序 思想是分治法 不断划分为两小段 然后依次由小序列合并为大序列,同时求出逆序数…
「九省联考 2018」IIIDX 这什么鬼题,送的55分要拿稳,实测有60? 考虑把数值从大到小摆好,每个位置\(i\)维护一个\(f_i\),表示\(i\)左边比它大的(包括自己)还有几个数可以选 这个最开始直接处理好,就是>=数值\(i\)的数字个数 如果我们从小到大安排,发现我们需要给当前数安排一个数值,根据贪心,这个数值要尽可能大,但又要满足一个条件,就是这个数值右边的\(\min \{f_i\}\ge siz_{now}\) 安排完了以后,需要给子树再安排一下,就把右边区间的\(f_i…