两天炸掉了135分算法
指望得分:100+72+45函数
实际得分:100+21+31测试
T2有重边,关于邻接矩阵,它死了TAT,挂了记忆化搜索-39。 而后判c=0想到了1点没度,然而我判的mp[1][x]==1,-12优化
T3单调点,可增可减,然而我只判了增,挂了。ui
说出题人毒瘤,不如说本身太naive。spa
有相同质因子的必定不能分开,队列
质因数分解,并查集维护。it
2^20让任何算法的复杂度没法招架class
meet in the middle思想搜索
分红两部分,而后把状态接起来看是否可行,指数除以2。
mp0/1[i][j]邻接矩阵,[j]放bitset,缘由在后面。
设f[i][s][j]表示以i为起点,路径状态s,j为终点的路径是否存在。[j]一维放bitset里
固定一个i为起点,枚举状态s,枚举终点j,而后若是合法转移点用mp0[j]填装f[i][s<<1],1同理,这样复杂度/32
设bitset<>g[s][i]表示状态s在i开始,0/1表示不存在或存在。
而后2^20枚举,合并,bitset直接&看是否可行。
记得在高位放1,区分010和0010
$x_{i-1}<x_i<x_{i+1} or x_{i-1}>x_i>x_{i+1}$能够合并,这样能够将位移转化为左右横跳。
任意间隔>l,那么不能一次完成多个任务
化下式子发如今这种状况下答案是一次函数,能够O(1)
用链表维护位移,优先队列维护最小间隔。
以上是口胡,尚未改过。
指望得分:100+50+20
实际得分:45+35+20
T1快读没开long long挂成暴力分qwq
T2考试结束前10分钟发现部分分打炸(都不喜欢但廉价也能够将就,雾),而后没改完死了。
T3暴力打的很虚,稍优化还好
一眼线段树
看到1e18值域,想了下序列,发现信息必须分段维护。因而肯定线段树。
那只有离散化了,发现答案只可能在1,全部操做的l、r、r+1,把它们加到lsh[]里,这样就能在线段树上保留它们的信息。
支持区间覆盖,区间异或,区间最前0。
发现异或会将最前0和最前1交换,那么维护f0[],f1[]表示区间[l,r]中最靠前的0/1
懒标记lz01[],lzxr[],维护对子区间的覆盖,异或
注意:
区间异或 若是有lz01[]那么把本区间的lz01[]取反,若是没有把本区间的lzxr[]取反
保证覆盖在前,xor在后的正确性
下下传覆盖标记要将子区间的lzxr[]清掉。
保证xor在前,覆盖在后的正确性
down的时候先传覆盖,由于因为以上操做两个懒标记同时存在 必定是先覆盖再xor的操做
部分分的启示:当两我的喜欢的物品集合不存在交集,那么必定贪心选最小的装满k,而后再选剩下的最小的。
通常状况,若是有交集,那么优先考虑,由于加入一个会减小两个,剩下的选择多了,但交集部分的权值致使不单调。
因而咱们枚举交集大小设为r,必定会贪心地从小选。
只被一我的喜欢的部分都贪心选k-r个。
再线段树维护下“剩下的物品”,支持insert,delete,前k小值和。查询下m-p1-p2-i填满m
每次增大r,把选的在线段树中删掉,只被一我的喜欢的物品,可知是弹出最大的,加到线段树里。
最后必定要注意特判、边界。
神仙题:
对每一个点单独考虑。
逆推出若是我要让这个点存活那么要牺牲的点的集合。
答案就是能逆推回去而且牺牲集合没有交集的点对数。