摘要:我非常、非常后悔坚持到现在,后悔留级的决定,最最后悔的是当时满腔热血的开始学OI 最可怕的是没有自知之明,想当然的以为自己有足够的天分和努力,想当然的以为可能有些微的好运 现在满盘皆输,连学OI前原本有的一些优势也没了 而且责任全在我,在“坚持”这条路上没有任何人给我阻碍,这个结果完全是我一手造成的 阅读全文
posted @ 2019-07-17 18:55 lokiii 阅读 (238) 评论 (3) 编辑
摘要:从本质入手,这个东西影响取值的就是相邻两个哪个先取 设f[i][0/1]为前i个(i 1,i)中先取i/i 1的值(这里不算上i的贡献 转移就显然了,注意要先复制 inf cpp include include using namespace std; const int N=3005; int n 阅读全文
posted @ 2019-06-17 21:14 lokiii 阅读 (37) 评论 (0) 编辑
摘要:首先看这样做的特点,就是分到最后小块里的点合并上去的时候相对顺序不变,所以先加上块内逆序对的期望 合并的时候一定是一边卡住一个大值,另一边跳指针,所以把一个值向右直到有大于它的值位置的一段区间看作一段 当前合并两块合并到第i个和第j个,如果i和j都是块的开头就一定不会构成逆序对,因为双指针的时候会直 阅读全文
posted @ 2019-06-17 17:00 lokiii 阅读 (44) 评论 (0) 编辑
摘要:设f[i]为i个积木能堆出来的种类,g[i]为i个积木能堆出来的种类和 $$ f[n]=\sum_{i=1}^{n}C_{n}^{i}g[n i] $$ $$ g[n]=\sum_{i=1}^{n}C_{n}^{i}f[n i]+g[n] $$ 理解就是选出包含最后一个的块,然后剩下的按照之前的拼 阅读全文
posted @ 2019-06-17 09:33 lokiii 阅读 (25) 评论 (0) 编辑
摘要:区间不交叉,可以看出区间构成了树形结构,建出树之后,设f[u][i]为u这个区间最大值最多加i的概率,转移是\\( f[u][i]=p[u]\ \prod f[v][mxu mxv 1]+(1 p[u])\ \prod f[v][mxu mxv] \\) 注意要理性选择建树方式,扫描就行了,不要瞎二 阅读全文
posted @ 2019-06-16 17:28 lokiii 阅读 (37) 评论 (0) 编辑
该文被密码保护。
posted @ 2019-06-15 21:15 lokiii 阅读 (1) 评论 (0) 编辑
摘要:首先看这个范围很夸张但是其实有限制的也就在1e18\ n范围里(走完一圈的边权),然后限制一定是有负环 用Floyd传递闭包,然后设f[i][j][k]为从1走了i步到j并且有k个x的最短路,用B F处理,然后有负环就是kx+f[n][i][k] include include include in 阅读全文
posted @ 2019-06-14 20:26 lokiii 阅读 (54) 评论 (0) 编辑
摘要:首先恋人操作过一轮之后逆序对不会变多,所以设f[i]为把i个逆序对消掉的期望次数,f[i]=0.5f[i 2]+0.5f[i]+2,化简然后递推即可 cpp include include using namespace std; const int N=3005; int n,m,a[N]; do 阅读全文
posted @ 2019-06-14 11:15 lokiii 阅读 (35) 评论 (0) 编辑
摘要:有一种限制下界强制选的,但是也可以不用 把每个格点拆成两个,一个连s一个连t,对于不是必选的连中间连流量1费用0边表示不选,然后黑白染色,黑点连横着白点连竖着,边权就是这条水管的权值,然后跑最大费用最大流 然后判断不可能就是不满流 并且这样可以满足每个被选的格子都在一个环上,因为他一定唯一对应另一个 阅读全文
posted @ 2019-06-14 11:00 lokiii 阅读 (205) 评论 (0) 编辑
摘要:任意k个都可以,也可以看做把不行的都选了,再随便选一个可以的要选的数量 把区间和m个值都排序,区间按l一序r二序排,枚举m个值,小根堆维护能帮韩当前枚举值的区间的右端点,这样方便删除区间,然后剩下的就都不行,所以ans=max(n size+1) 注意枚举完要弹出一个区间,表示这个区间属于当前枚举值 阅读全文
posted @ 2019-06-13 17:20 lokiii 阅读 (66) 评论 (0) 编辑
摘要:先跑spfa求出最短路构成的DAG,然后在DAG上跑出支配树dfs出size取max即可 关于支配树,因为是DAG,支配点就是入点在支配树上的lca,所以一边拓扑一边预处理倍增,然后用倍增求lca cpp include include include include include using n 阅读全文
posted @ 2019-06-13 15:54 lokiii 阅读 (37) 评论 (0) 编辑
该文被密码保护。
posted @ 2019-06-13 11:08 lokiii 阅读 (1) 评论 (0) 编辑
摘要:容易看出是用质因数凑n 首先01个因数的情况可以特判,2个的情况就是ap1+bp2=n,b=n/p2(mod p1),这里的b是最小的特解,求出来看bp2 include include include using namespace std; const int N=200005,M=316000 阅读全文
posted @ 2019-06-11 19:35 lokiii 阅读 (52) 评论 (0) 编辑
摘要:考虑当前合法的一个点集s,如果他合法,那么一定有一个完备匹配的点集包含这个点集,也就是两边都满足hall定理的话这两边拼起来的点集也满足要求 所以分别状压两边点集用hall定理转移判断当前点集是否合法,然后分别对两边点集的权值和排个序2point扫一下计算答案即可 阅读全文
posted @ 2019-06-11 15:03 lokiii 阅读 (84) 评论 (0) 编辑
摘要:方案二选一,显然是最小割,朴素的想法就是一排人点一排边点,分别向st连流量1的边,然后人点向路径上的边点连流量inf的边跑最大流 但是路径可能很长,这样边数就爆了,所以考虑倍增,然后倍增后大区间向小区间连,这样路径只要连向log个区间就行了,然后跑最大流 输出方案是在残量网络上从s点沿着没满流的边b 阅读全文
posted @ 2019-06-11 09:37 lokiii 阅读 (28) 评论 (0) 编辑
摘要:分别给行和列hash建两排点,对(x,y)坐标连x行y列的点 设红色价格低,那么就要尽量多选红色 设一个点出度为s,要求最小的最大差值为d,又,假设有流量表示选红没流量表示选蓝,那么要求就变成了这个点的01边差至少为d,列一下式子就是这个点的流入(或者流出)流量可行区间为[(s d)/2,(s+d) 阅读全文
posted @ 2019-06-10 21:01 lokiii 阅读 (33) 评论 (0) 编辑
摘要:首先假设全睡觉,然后用费用流考虑平衡要求建立网络流 把1~n的点看作是i k+1~k这一段的和,连接(i,i+k,1,e[i] s[i]),表示把i改成吃饭,能对i~i+k 1这一段的点产生影响;然后连接(i,i+1,k ms me,0),这是除了限额外可以随便选的(i+k,i+1 n就连到t) 然 阅读全文
posted @ 2019-06-08 18:23 lokiii 阅读 (113) 评论 (0) 编辑
摘要:因为没有重复串,所以把有包含关系的串连边之后是个DAG,也就是二分图,就变成求二分图的最大独立集=n 最小点覆盖=n 最大匹配 关于包含关系,建出AC自动机,然后把串放上去找子串,但是如果每次都一路找到根就会T,所以每次只找最近的一个,并且对于没有结尾id的点承接father的id,这样就O(1)的 阅读全文
posted @ 2019-06-01 23:34 lokiii 阅读 (89) 评论 (0) 编辑
摘要:因为是字典序所以贪心选当前能选的最小的,所以问题就在于怎么快速计算当前这个位置能不能选枚举的字母 重排之后的序列是可以和原序列完美匹配的,而完美匹配需要满足hall定理,也就是左边任意k个集合一定和右边至少k个点相连 又一共6个字符,原序列中相同字符点连出的点集是一样的,所以只要2^6个字符集合满足 阅读全文
posted @ 2019-06-01 15:52 lokiii 阅读 (48) 评论 (0) 编辑
摘要:给出的模型很难搞,所以转换一下,记p[i]为i这个数的位置,然后相邻两个p值差 k的能交换,发现使原问题字典序最小也需要使这里的字典序最小 注意到p值差 include include using namespace std; const int N=3000005; int n,k,a[N],p[ 阅读全文
posted @ 2019-05-26 22:25 lokiii 阅读 (45) 评论 (0) 编辑
摘要:首先直接按要求列出式子是\\( \sum_{i=1}^{n}\sum_{j=i+1}^{n}C_{a_i+a_j+b_i+b_j}^{a_i+a_j} \\) 这样显然过不了,因为ab的数据范围比较小,所以从这里入手,注意到后面的组合数含义是从点(ai,bi)走到点( aj, bj)的方案数 把但是 阅读全文
posted @ 2019-05-25 16:16 lokiii 阅读 (31) 评论 (0) 编辑
摘要:把回文串的相等关系连一下,发现最后要求的是一笔画问题 注意到奇数长度的中间有一个单独没有连线的,所以a数组至多有两个奇数值 如果没有奇数,那么b在最前面放一个1,然后把a[1]~a[m 1]放上去,这样就是错位着一笔画了,然后剩下一个奇数值连成若干2中间一个1的样子; 如果一个奇数,那么把奇数放到最 阅读全文
posted @ 2019-05-24 23:30 lokiii 阅读 (45) 评论 (0) 编辑
摘要:一开始没看到要保证最后是树……所以一定要从叶子开始删 枚举重心,如果k是偶数,那么按当前重心提起来deep大于k/2的全都要切掉,这样枚举重心然后取min即可 奇数的话就是枚举直径中间的边,然后从两边的点分别dfs删点 cpp include include using namespace std; 阅读全文
posted @ 2019-05-22 19:36 lokiii 阅读 (41) 评论 (0) 编辑
摘要:首先把点权归到边上,设点权较小的一个点是v,也就是(u,v)的边权是log2(dis(u,v)) a[v]+a[v]+a[u] 然后还有一个性质就是这棵树按点权最小点提起来就是一个堆 暴力是n^2的MST,然后考虑优化,按照点权从小到大加入生成树,那么每个点加进去的时候会连到点权比他小的点上 因为l 阅读全文
posted @ 2019-05-11 17:38 lokiii 阅读 (37) 评论 (0) 编辑
摘要:如果枚举d来dp,那么就是设f[u][0/1]为u点不断/断掉和父亲的边,然后优先选取f[v][1]+w(u,v) include include include include using namespace std; const int N=300005; int n,du,v[N],d[N], 阅读全文
posted @ 2019-05-11 10:26 lokiii 阅读 (53) 评论 (0) 编辑
摘要:首先考虑只满足第一个条件,二分答案,把过期时间加上mid之后的2n个时间离散,老鼠拆成每个时间的,第i个时间第j个老鼠为id[i][j],连接(s,i,p[i]),对于离散后时间(g[j 1]~g[j])在i奶酪的时间区间里的ij,连接(i,id,老鼠速度\ 时间段长),然后连(id,t,inf), 阅读全文
posted @ 2019-05-09 21:30 lokiii 阅读 (31) 评论 (0) 编辑
摘要:把有单点修改和查询的点离散进一个数组,然后单点修改直接改,记录一个修改时间t,维护一个sm表示这些离散的点的和,val表示出了离散点其他点的值,因为都是一样的所以只记录这一个值即可,记录ljlc为加法乘法的lazytag,整体加整体乘的时候像线段树一样改smljlc,还有修改val,整体赋值的时候把 阅读全文
posted @ 2019-05-09 15:56 lokiii 阅读 (34) 评论 (0) 编辑
摘要:先把所有边可动设为r[i]又这些边不是l就是r(如果想一个方向改变能更优的话就尽量多的改变),每次跑dijsktra,对于可动边(x,y),如果dis1[x] include include include define ll long long using namespace std; const 阅读全文
posted @ 2019-05-08 21:44 lokiii 阅读 (51) 评论 (0) 编辑
摘要:这个告诉gcd的操作实际上就是告诉一个因数是否选,最坏情况是1,判断掉所有因数才能选 然后肯定是用猜不重复质数积比较划算,问题就变成若干个质数,分成数量尽量小每组乘积 include using namespace std; const int N=10005; int n,p[N],tot,ans 阅读全文
posted @ 2019-05-08 19:53 lokiii 阅读 (40) 评论 (0) 编辑
摘要:有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a b c d,ka=4,kb=2,kc=3,kd=4,按字典序就先选c然后b就不能合法了) 所以倒着来,建反图,然后按照n k[i]从大到小拓扑,因为是反图所以是 阅读全文
posted @ 2019-05-08 19:31 lokiii 阅读 (21) 评论 (0) 编辑