05 2019 档案

摘要:给出的模型很难搞,所以转换一下,记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 阅读(193) 评论(0) 推荐(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 阅读(143) 评论(0) 推荐(0)
摘要:把回文串的相等关系连一下,发现最后要求的是一笔画问题 注意到奇数长度的中间有一个单独没有连线的,所以a数组至多有两个奇数值 如果没有奇数,那么b在最前面放一个1,然后把a[1]~a[m 1]放上去,这样就是错位着一笔画了,然后剩下一个奇数值连成若干2中间一个1的样子; 如果一个奇数,那么把奇数放到最 阅读全文
posted @ 2019-05-24 23:30 lokiii 阅读(202) 评论(0) 推荐(0)
摘要:一开始没看到要保证最后是树……所以一定要从叶子开始删 枚举重心,如果k是偶数,那么按当前重心提起来deep大于k/2的全都要切掉,这样枚举重心然后取min即可 奇数的话就是枚举直径中间的边,然后从两边的点分别dfs删点 cpp include include using namespace std; 阅读全文
posted @ 2019-05-22 19:36 lokiii 阅读(229) 评论(0) 推荐(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 阅读(233) 评论(0) 推荐(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 阅读(293) 评论(0) 推荐(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 阅读(161) 评论(0) 推荐(0)
摘要:把有单点修改和查询的点离散进一个数组,然后单点修改直接改,记录一个修改时间t,维护一个sm表示这些离散的点的和,val表示出了离散点其他点的值,因为都是一样的所以只记录这一个值即可,记录ljlc为加法乘法的lazytag,整体加整体乘的时候像线段树一样改smljlc,还有修改val,整体赋值的时候把 阅读全文
posted @ 2019-05-09 15:56 lokiii 阅读(210) 评论(0) 推荐(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 阅读(234) 评论(0) 推荐(0)
摘要:这个告诉gcd的操作实际上就是告诉一个因数是否选,最坏情况是1,判断掉所有因数才能选 然后肯定是用猜不重复质数积比较划算,问题就变成若干个质数,分成数量尽量小每组乘积 include using namespace std; const int N=10005; int n,p[N],tot,ans 阅读全文
posted @ 2019-05-08 19:53 lokiii 阅读(178) 评论(0) 推荐(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 阅读(164) 评论(0) 推荐(0)
摘要:降智好题 前面随机部分按照题意模拟,然后字典序贪心,也就是记录每个值的位置从1~nm依次看能不能取,能取的话更新行的取值范围(它上面的行一定取的列小于等于这个数取的列,下面行大于等于) cpp include include using namespace std; const int N=5005 阅读全文
posted @ 2019-05-08 17:33 lokiii 阅读(130) 评论(0) 推荐(0)
摘要:把期望改成方案数最后除一下,设h[i]为最大值恰好是i的方案数,那么要求的就是Σh[i]\ i 首先包含其他区间的区间是没有意义的,用单调栈去掉 然后恰好不好求,就改成h[i]表示最大值最大是i的方案数,求Σ(h[i] h[i 1])\ i即可 然后考虑h怎么求,\\( h[i]=\sum_{j=1 阅读全文
posted @ 2019-05-08 16:29 lokiii 阅读(176) 评论(0) 推荐(0)
摘要:妙啊,是一个逼近(?)的做法 把两个值最为平面上的点坐标,然后答案也是一个点。 首先求出可能是答案的点xy分别是按照c和t排序做最小生成树的答案,然后考虑比这两个点的答案小的答案,一定在xy连线靠近原电一侧(不过这部分并不全都能更新答案),然后最小的一定是距离xy连线最远的,设为点z,也就是三角形x 阅读全文
posted @ 2019-05-08 10:30 lokiii 阅读(206) 评论(0) 推荐(0)
摘要:求出支配树输出到father的和即可 支配树见:https://blog.csdn.net/a710128/article/details/49913553 cpp include include include include using namespace std; const int N=30 阅读全文
posted @ 2019-05-07 11:01 lokiii 阅读(213) 评论(0) 推荐(0)
摘要:首先平面图转对偶图,大概思路是每条边存正反,每个点存出边按极角排序,然后找每条边在它到达点的出边中极角排序的下一个,这样一定是这条边所属最小多边形的临边,然后根据next边找出所有多边形,用三角剖分计算面积 然后就比较妙了,把对偶图随便搞一个生成树出来,然后对于每个询问,如果一条边是树边,那么如果这 阅读全文
posted @ 2019-05-05 21:06 lokiii 阅读(214) 评论(0) 推荐(0)
摘要:传送:https://vjudge.net/problem/TopCoder 14084 只是利用了笛卡尔树的性质,设f[i][j]为区间[i,j]的贡献,然后枚举中间最大的点k来转移,首先是两侧小区间贡献的,f[i][k 1]\ fac[j k]+f[k+1][j]\ fac[k i],大概是方案 阅读全文
posted @ 2019-05-03 20:33 lokiii 阅读(217) 评论(0) 推荐(0)
摘要:枚举起点,然后设f[i][j]为上凸壳上一个点是i当前点是j的最大面积,g是下凸壳,然后合并的时候枚举结束点t合并上下凸壳即可 这样的好处是每次转移都是往凸多边形里加一个三角形(s,i,j),所以判断转移合法只要预处理出所有三角形是否合法即可,同时预处理出三角形面积,转移就是f[j][k]=max( 阅读全文
posted @ 2019-05-03 16:59 lokiii 阅读(311) 评论(0) 推荐(0)
摘要:传送:https://dmoj.ca/problem/ioi17p3 参考:https://blog.csdn.net/qq_27327327/article/details/80711824 妙啊……首先题意就是走到一个包含充电点的环里就能赢 因为出度至少是1,所以如果所有点都能到充电点那么全部是 阅读全文
posted @ 2019-05-03 12:09 lokiii 阅读(245) 评论(0) 推荐(0)
摘要:读题两小时系列…… 在读懂题意之后,发现M(c)就是c这块最大权割边也就是的最小生成树的最大权边的权值,所以整个问题都可以在MST的过程中解决(M和c都是跟着并查集变的) 不过不是真的最小生成树,是合并了所有a[i].w include include include using namespace 阅读全文
posted @ 2019-05-02 21:39 lokiii 阅读(298) 评论(0) 推荐(0)
摘要:首先考虑分割线能分割一条线当且仅当分割线一个端点在这条线的ab中间,另一端点在外面,也就是分割线对应的一条弧不能同时有这条线的两个端点 每条线的两端点都染同色,然后分段,一段里面颜色互不相同,分割线就是一段的开始连到结尾,割掉这段里的颜色的线,求最小的段数ans,答案就是(ans+1)/2 暴力是要 阅读全文
posted @ 2019-05-02 20:09 lokiii 阅读(338) 评论(0) 推荐(1)
摘要:妙啊,很容易想到连(s,a1,an)(s,b1,bn)(a2,t,an)(b2,t,bn),这样,但是可能会发生a1流到b2或者b1流到a2这种不合法情况 考虑跑两次,第二次交换b1b2,如果两次都合法就是合法 证明是假设a1流到b2了x的流量,然后交换b1b2之后依然满足条件,那么一定可以有a1流 阅读全文
posted @ 2019-05-02 18:54 lokiii 阅读(144) 评论(0) 推荐(0)
摘要:首先最直观的,列一排是罪犯一排不是罪犯,对于一个条件u说v(0是1否)f罪犯,如果u不是,那么vf罪犯;如果u是,枚举他说谎的一条wg罪犯,令w(g^1)罪犯连其他条的vf 但是这样有个电度数方,会炸 考虑前缀和优化建图,在原来两排下面再接上两排表示这个人说这条以及这条之前没有/有说过谎,pr[u] 阅读全文
posted @ 2019-05-01 21:29 lokiii 阅读(336) 评论(0) 推荐(0)
摘要:洛谷上有个点死活卡不过去,不知道是哪里写丑了orz 参考:https://www.cnblogs.com/ditoly/p/BZOJ4200.html 从上往下dp,设f为不向左右走直接上去的值,g为先向左右走一步再上去,至于找每个方向上的点,分别按x,y,x+y,x y排序然后二分即可 然后建出左 阅读全文
posted @ 2019-05-01 13:36 lokiii 阅读(197) 评论(0) 推荐(0)