04 2019 档案

摘要:对于原有边,流区间是(1,inf),按着原边连,然后再连(s,i,(0,inf)),(i,t,(0,inf))表示任意位置进出雪场 按着这个建出新图 然后最小流的方法是先跑可行流,设ans为(t,s,(0,inf))的流量,然后取消这条边,跑从原来的t s的最大流为ans2,答案就是ans ans2 阅读全文
posted @ 2019-04-27 22:16 lokiii 阅读(150) 评论(0) 推荐(0)
摘要:据说正解是有上下界最小流,但是这种1e5的玩意问什么要跑网络流啊…… 贪心即可,注意一点是可以有多条路径经过一条边…… 以1为根,设d[u][0/1]为u到父亲的边是向下/向上,g记录这个点儿子中不能抵消且和它的d相同(同方向)的点个数,这里的抵消是一个0和一个1可以凑一条路径直接加进答案里,在df 阅读全文
posted @ 2019-04-27 21:28 lokiii 阅读(207) 评论(0) 推荐(0)
摘要:每条边流量有下界有费用,很显然是有上下界有源汇最小费用最大流 连边(s,1,(0,inf),0),(i,t,(0,inf),0),表示从1出发inf次从每个点结束inf次 连边(i,j,(1,inf),v[i][j]),表示ij之间有剧情的话就至少走一次,每次走花费v[i][j]时间 然后套有上下界 阅读全文
posted @ 2019-04-27 17:23 lokiii 阅读(387) 评论(0) 推荐(0)
摘要:连有上下界的边(ss,i,(0,m),0),(i',t,(0,m),0),表示从任意点开始和结束 连(i,j,(0,m),d[i][j]),表示可以买票飞过去 连(i,i',(v[i],v[i]),0),表示这条边会流固定v[i]个人 连(s,ss,(m,m),0),表示限制m个人 然后跑有上下界有 阅读全文
posted @ 2019-04-27 17:04 lokiii 阅读(171) 评论(0) 推荐(0)
摘要:最大值最小,所以考虑二分 |Σaij Σbij| include include include using namespace std; const int N=505; int n,m,ll,rr,a[N][N],sh[N],sl[N],h[N],cnt,le[N],d[N],s,t; stru 阅读全文
posted @ 2019-04-27 10:44 lokiii 阅读(155) 评论(0) 推荐(0)
摘要:有正负收益,考虑最小割 因为有依赖关系,所以考虑最大权闭合子图 首先对每个d[i][j]建个点,正权连(s,id[i][j],d[i][j])并加到ans上,负权连(id[i][j],t, d[i][j]) 然后选了大区间一定会选小区间,连这样的依赖关系:(id[i][j],id[i+1][j],i 阅读全文
posted @ 2019-04-26 21:09 lokiii 阅读(100) 评论(0) 推荐(0)
摘要:上来就跑3e5的最大流……脑子抽了 很容易看出,每个地方的海拔都是0或1因为再高了没有意义,又,上去下来再上去没有意义,所以最后一定是从s连着一片0,剩下连着t一片1,然后有贡献的就是01交接的那些边 跑个最小割就好了 然而跑不过,考虑建对偶图,也就是网格的空当成一个点,然后这些点之间互相连边的权值 阅读全文
posted @ 2019-04-26 17:18 lokiii 阅读(118) 评论(0) 推荐(0)
摘要:一开始在https://www.cnblogs.com/lokiii/p/10770919.html基础上连(i,j,b[i][j])建了个极丑的图T掉了……把dinic换成isap勉强能卡过 首先因为有正负收益所以考虑最小割,先ans=Σb,然后考虑负收益 把割完后和s相邻的视为不选,反之视为选, 阅读全文
posted @ 2019-04-26 10:30 lokiii 阅读(109) 评论(0) 推荐(0)
摘要:把转置矩阵看成逆矩阵吓傻了233 首先按照矩乘推一下式子: $$ D=\sum_{i=1}^n a[i] (\sum_{j=1}^n a[j] b[j][i]) c[i] $$ $$ D=(\sum_{i=1}^n \sum_{j=1}^n a[i] a[j] b[j][i]) (\sum_{i=1 阅读全文
posted @ 2019-04-25 20:57 lokiii 阅读(133) 评论(0) 推荐(0)
摘要:这个条件非常妙啊,奇数和奇数一定满足1,因为\\( (2a+1)^2+(2b+1)^2=4a^2+4a+4b^2+4b+2=2(2(a^2+a+b^2+b)+1) \\)里面这个一定不是平方数因为除二后是个奇数不能再分一个2出来;偶数和偶数一定满足2,因为gcd =2 考虑最小割,先加上所有收益然后 阅读全文
posted @ 2019-04-25 17:24 lokiii 阅读(123) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2019-04-25 15:44 lokiii 阅读(2) 评论(0) 推荐(0)
摘要:脑子不太清楚一个zz问题调了好久…… 首先正难则反,因为三元环好像没什么特点,就考虑让非三元环个数最小 考虑非三元环特点,就是环上一定有一个点的入度为2,联系整张图,三元环个数就是每个点C(入度,2)的和 把无向边看成点,这样的点会向两端点的一个贡献一个入度,所以建图,s连这些点流量1费用0,这些边 阅读全文
posted @ 2019-04-24 21:43 lokiii 阅读(114) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2019-04-23 21:48 lokiii 阅读(4) 评论(0) 推荐(0)
摘要:玄妙的建图…… 这种平衡度数的题按套路是先黑白染色然后分别连ST点,相邻格子连黑向白连费用1流量0的边,然后考虑费用怎么表示 把一个点拆成五个,上下左右中,中间点黑白染色连ST, 对于连S的点,中点连它不转时候的四边点(有哪个连哪个)流量1费用0的边。 然后考虑转的费用,因为这里已经拆点了,所以在里 阅读全文
posted @ 2019-04-23 15:22 lokiii 阅读(177) 评论(0) 推荐(0)
摘要:考虑b的两种情况,一种是p的祖先,这种点有min(k,de[p] 1)个,然后每个这种b都有si[p] 1个c点可选; 另一种是p的子孙,要求是在p的子树内且deep在de[p]+1~de[p]+k之间,然后一个这样的b点贡献是si[b] 1,也就是在他的子树内选c点,考虑怎么算这个,用dfs序维护 阅读全文
posted @ 2019-04-22 15:39 lokiii 阅读(136) 评论(0) 推荐(0)
摘要:第一、二问: 就是最小的最长公共长度+1,设f[i][j]为a匹配到i,b匹配到j,第一问的转移是f[i][j]=(a[i]==b[j]?f[i 1][j 1]+1:0),第二问的转移是f[i][j]=(a[i]==b[j]?f[i 1][j 1]+1:f[i][j 1]),注意这里更新最小公共长度 阅读全文
posted @ 2019-04-22 14:30 lokiii 阅读(174) 评论(0) 推荐(0)
摘要:整体二分: 对于每一个修改操作,标记为1,并且加一个标记为 1的这个位置原来值,并且对于a数列每个点都当成修改操作 然后整体二分,扫当前操作区间lr,把在值域区间标记为1和 1的操作都在树状数组对应位置上加/减出来,然后询问操作根据k和询问答案大小决定放在哪部分传下去 cpp include inc 阅读全文
posted @ 2019-04-22 10:27 lokiii 阅读(179) 评论(0) 推荐(0)
摘要:脑子一抽开始写主席树,敲了一会发现不对…… 整体二分,用二维树状数组维护值为当前区间的格子个数,然后根据k的大小和当前询问的子矩阵里的值和k的大小关系来决定这个询问放在哪一部分向下递归 cpp include include include using namespace std; const in 阅读全文
posted @ 2019-04-22 08:01 lokiii 阅读(174) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2019-04-21 20:34 lokiii 阅读(3) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2019-04-20 17:00 lokiii 阅读(4) 评论(0) 推荐(0)
摘要:如果没有环的话直接LCT 考虑有环怎么办,如果是静态的话就tarjan了,但是这里要动态的缩环 具体是link操作的时候看一下是否成环(两点已联通),成环的话就用并查集把这条链缩到一个点,把权值加给祖先,断开所有splay上儿子。不过父亲这里不用管,就先让他们连着 每次操作的时候都用并查集找到支配点 阅读全文
posted @ 2019-04-18 20:24 lokiii 阅读(182) 评论(0) 推荐(0)
摘要:新姿势,一般来讲LCT只能维护splay重边里的数据,而这里要求维护整颗子树的size 多维护一个sq表示当前点轻儿子的size和,si表示包括轻重边的整颗子树的大小 然后需要改sq的地方是link和access,link是因为给y下面挂了个连着虚边的x点,所以给y的sq加上x的size;acc是改 阅读全文
posted @ 2019-04-17 20:44 lokiii 阅读(152) 评论(0) 推荐(0)
摘要:脑洞题大概 首先处理出每个位置需要操作的次数c,假设第一次达到目标就不能再走,这样的操作次数是c差分后值的正数和,就想成分治每一段然后同减最小值然后从0处断开 然后考虑能一圈一圈走的情况,连续一段多走一圈在差分数组上的贡献是一个位置+4一个位置 4, 然后对于差分c后值为( 3,3)的一对位置,+4 阅读全文
posted @ 2019-04-17 16:06 lokiii 阅读(199) 评论(0) 推荐(0)
摘要:看着就像反演,所以先推式子(默认n include using namespace std; const int N=5000005,mod=1e9+7; int T,k,n,m,p[N],tot,s[N],f[N],sm[N],ans; bool v[N]; int read() { int r= 阅读全文
posted @ 2019-04-17 11:52 lokiii 阅读(132) 评论(0) 推荐(0)
摘要:SA的话t==0直接预处理出每个后缀的不同串贡献二分即可,然后t==1就按字典序枚举后缀,然后跳右端点计算和当前后缀的前缀相同的子串个数,直到第k个 不过bzoj上会T cpp include include include using namespace std; const int N=1000 阅读全文
posted @ 2019-04-16 18:30 lokiii 阅读(189) 评论(0) 推荐(0)
摘要:对第一个串建SAM,把剩下的串在上面跑,每次跑一个串的时候在SAM的端点上记录匹配到这的最大长度,然后对这些串跑的结果取min,然后从这些节点的min中取max就是答案 注意在一个点更新后它的祖先也会被更新,需要最后按拓扑序向上更新一边 其实二分+hash就行 cpp include include 阅读全文
posted @ 2019-04-15 20:08 lokiii 阅读(114) 评论(0) 推荐(0)
摘要:首先看两条链怎么合并,贪心可得是从大到小取max,多条链同理 所以dfs合并子树的大根堆即可,注意为了保证复杂度,合并的时候要合并到最长链上,证明见长链剖分 cpp include include include using namespace std; const int N=200005; in 阅读全文
posted @ 2019-04-15 18:59 lokiii 阅读(175) 评论(0) 推荐(0)
摘要:是个神仙dp…… 参考:https://www.luogu.org/blog/xzz 233/solution p5289 设f[i][j][k]是前i个有限制的城市,所有学校中选蓝色阵营有j人,有限制的学校中鸭派系有k人的方案数;g[i][j]是前i个没有限制的城市,蓝色阵营有j人的方案数;h[i 阅读全文
posted @ 2019-04-15 18:56 lokiii 阅读(251) 评论(0) 推荐(0)
摘要:有一个想法就是暴力建图,把每个A向有和他相连的B前缀的A,然后拓扑一下,这样的图是n^2的; 考虑优化建图,因为大部分数据结构都是处理后缀的,所以把串反过来,题目中要求的前缀B就变成了后缀B 建立SAM,发现在parent树中每个B能走到的A都在子树中,所以保留这个树结构,连边权为0的边; 然后在p 阅读全文
posted @ 2019-04-15 18:53 lokiii 阅读(189) 评论(0) 推荐(0)
摘要:和bzoj4504差不多,就是换了个数据结构 像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上 关于怎么快速求区间和,用一个可持久trie上维护最大xor值和对应的点即可 cpp include incl 阅读全文
posted @ 2019-04-15 18:20 lokiii 阅读(167) 评论(0) 推荐(0)
摘要:像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上 关于怎么快速求区间和,用可持久化线段树维护(主席树?)每个点到他root的区间和,这样每次右端点右移就是上一个的线段树在(la[a[i]]+1,i)加上a 阅读全文
posted @ 2019-04-05 18:46 lokiii 阅读(203) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2019-04-02 14:37 lokiii 阅读(8) 评论(0) 推荐(0)