随笔分类 -  1.————数据结构————

摘要:求所有可能联通块的第k大值的和,考虑枚举这个值: $ans=\sum\limits_{i=1}^{W}{i\sum\limits_{S}{[i是第K大]}}$ 设cnt[i]为连通块中值>=i的个数 $ans=\sum\limits_{i=1}^{W}{i\sum\limits_{S}{[cnt[i 阅读全文
posted @ 2019-03-10 13:00 Ressed 阅读(333) 评论(0) 推荐(0)
摘要:(并不能)发现29393不是质数,而是等于7*13*17*19 于是可以用四个线段树分别维护模意义下,对x进行一个区间的操作后的值 最后再把这四个的答案用crt拼起来 也可以不crt,而是预处理0~29392的每个情况 为了降低复杂度,预处理模7/13/17/19的幂 注意询问时,要把询问对7/13 阅读全文
posted @ 2018-12-08 21:42 Ressed 阅读(229) 评论(0) 推荐(0)
摘要:考虑计算每个位置的数作为最小值时有多少种情况 方便起见,以位置为第二关键字比较大小,这样就不会出现“相同的”数 可以方便地计算出以i位置为最小值的区间端点的可行位置:[A,i],[i,B] 这是我选的一个区间,那么另一个区间会有两种情况:在[A,B]的范围内或者不在 不妨只考虑另一个区间在i这个区间 阅读全文
posted @ 2018-12-04 19:49 Ressed 阅读(213) 评论(0) 推荐(0)
摘要:首先整体二分,问题变成是否存在经过一个点的满足条件的路径 那么我对于每个路径(a,b,lca),在树状数组的dfn[a]++,dfn[b]++,dfn[lca]--,dfn[fa[lca]--] 然后直接查那个点的子树和就行了 阅读全文
posted @ 2018-12-01 19:01 Ressed 阅读(178) 评论(0) 推荐(0)
摘要:设f[i][j]表示在第i个村庄建第j个基站的花费 那么有$f[i][j]=min\{f[k][j-1]+w[k,i]\}$,其中w[k,i]表示在k,i建基站,k,i中间的不能被满足的村庄的赔偿金之和 如果把每个村庄能被满足的区间处理出来,记做$[l_i,r_i]$,那么i,j不能满足的村庄,就是 阅读全文
posted @ 2018-12-01 18:56 Ressed 阅读(260) 评论(0) 推荐(0)
摘要:按照美味值从大到小排序,对于每个询问,我想二分找到一个前缀来满足条件 那么以单价为下标建主席树,维护区间的最大体积和 以及满足这个最大体积需要的价钱 然后二分答案,再在主席树上二分,找到恰好满足的那个位置(肯定是单价越小越好) 复杂度$O(nlog^2n)$ 阅读全文
posted @ 2018-12-01 18:46 Ressed 阅读(130) 评论(0) 推荐(0)
摘要:考虑整体二分,问题就变成了每个(水果)路径有多少个满足条件(权值)的(盘子)子路径 考虑一个盘子(a,b)表示两端点(不妨设dfn[a]<dfn[b]),那么他能接到的水果(u,v)一定满足(不妨设dfn[u]<dfn[v]): 1.如果a是b的祖先,则u在(a的在(b,a)链上的孩子)这个子树外, 阅读全文
posted @ 2018-12-01 18:42 Ressed 阅读(184) 评论(0) 推荐(0)
摘要:对于加减,用bitset维护当前每个数有没有 对于乘,暴力枚举约数 然后莫队 复杂度$O(m(\sqrt{n}+\frac{c}{64}))$ 阅读全文
posted @ 2018-11-27 19:29 Ressed 阅读(165) 评论(0) 推荐(0)
摘要:设f[i]是以i位置为结尾的最长满足条件子序列的长度 那么j能转移到i的条件是,$j<i , max[j]<=a[i] , a[j]<=min[i]$,其中max和min表示这个位置能变化出来的最大值或最小值 这个东西用一个cdq来做 具体来说,先做左半区间,然后左边按max排序,右边按a排序,把左 阅读全文
posted @ 2018-11-21 19:35 Ressed 阅读(348) 评论(0) 推荐(0)
摘要:交换的话,只有它们中间的书会对答案产生影响 树状数组记位置,套线段树记书的编号 它对应的页数和书的个数 然后就是减掉中间那些原来是逆序对的,再把交换以后是逆序对的加上 别忘了考虑这两个自己交换以后是不是逆序的 最重要的一步:开个O2 阅读全文
posted @ 2018-11-21 19:30 Ressed 阅读(162) 评论(0) 推荐(0)
摘要:逆序对数=0的时候,这个数列是有序的 然后交换相邻的,看哪个比较大,逆序对数会加1或减1 Jeff用的是最优策略所以他肯定让逆序对数-1 设f[i]表示Jeff操作前,逆序对数为i,最终的期望次数 那就有$f[i]=0.5f[i-2]+0.5f[i]+2$ 以及$f[1]=1,f[0]=0$ 可以得 阅读全文
posted @ 2018-11-19 21:28 Ressed 阅读(210) 评论(0) 推荐(0)
摘要:并查集维护每个联通块的直径和最小的最大深度,每次连得时候连的肯定是最大深度最小的那两个点 阅读全文
posted @ 2018-11-19 21:10 Ressed 阅读(292) 评论(0) 推荐(0)
摘要:我的做法: 给询问按$deep[v]+d$排序,每次做到某一深度的时候,先给这个深度所有点的值清0,然后直接改v的子树 官方做法比较妙妙: dfs,进入v的时候给$[deep[v],deep[v]+d]+=x$,出来的时候再减回来 日常忘开longlong,这回事变量开了输出没开 阅读全文
posted @ 2018-11-16 08:38 Ressed 阅读(287) 评论(0) 推荐(0)
摘要:求公共前缀的问题可以用hash+二分来解决,但这个是动态的,所以我们用平衡树来维护区间的hash值 复杂度$O(mlog^2n)$ 阅读全文
posted @ 2018-11-14 12:24 Ressed 阅读(163) 评论(0) 推荐(0)
摘要:开b组单调队列,分别维护此时某一列中的最大/最小值 然后我每次把它们的头取出来,塞到维护行的单调队列里,就是n*n的最大/最小值 阅读全文
posted @ 2018-11-13 08:17 Ressed 阅读(133) 评论(0) 推荐(0)
摘要:mulx的操作,其实就是给r+1的系数+=r的系数,然后删掉r,把l~r-1向右移一位,再插一个0到原来的位置 splay维护区间加和区间乘就好了 (一定要注意做事的顺序,一件事都做完了再去做别的,否则一splay就全乱套了..) 阅读全文
posted @ 2018-11-09 14:49 Ressed 阅读(294) 评论(0) 推荐(0)
摘要:如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x的位置去合并那个并查集,同时维护个数和大小 阅读全文
posted @ 2018-11-09 14:31 Ressed 阅读(177) 评论(0) 推荐(0)
摘要:这个东西和最长上升子序列很像 考虑如果已经知道每个位置为开头的LIS长度和个数 f[i],我可以扫一遍 判断这个个数和K的大小,找到第一个长度=len而且个数<K的,这个位置就是要选的 然后K-=个数,len--,再记下来我这次选的是这个位置(以后还要判断当前位置是否在上一个钦定住的范围内),然后接 阅读全文
posted @ 2018-11-05 21:42 Ressed 阅读(153) 评论(0) 推荐(0)
摘要:我当然想选最大的子段和啦 但要选M次 那不一定就是最好的 所以提供一个反悔的选项,我选了一段以后,就把它们乘个-1,然后再选最好的(类似于网络流的思路) 这个可以用线段树来维护,记一个区间包含左端点/右端点的最大值、最小值(因为要乘-1),还有它们的端点位置 然后一直找 直到最大值<=0 阅读全文
posted @ 2018-11-01 08:55 Ressed 阅读(187) 评论(0) 推荐(0)
摘要:我每次都想选那个最大的、或者是它旁边的两个一起选,如果这两个一起选会大于那个最大的的话 那我就先把那个最大的选了,再提供一个反悔的选项(类似于网络流的思路?),就是我可以再把种的树换成它旁边那两个,也是相当于又多种了一个,这个的权值是v[l]+v[r]-v[x] 所以用一个双向链表维护这个l、r,用 阅读全文
posted @ 2018-11-01 08:48 Ressed 阅读(148) 评论(0) 推荐(0)