Z Z Z Z^{Z^Z} ZZZ
场上T1 20,T2 51,T3 10
stO myd 150
BZOJ3482&JZOJ3238
可变最短路,求所有最短路之和
对所有点v求经过可变边i次的最短路
那么有
d i s v , i = m i n ( d i s f r o m , i − 1 , d i s f r o m , i + w e d g e ) dis_{v,i}=min(dis_{from,i-1},dis_{from,i}+w_{edge}) disv,i=min(disfrom,i−1,disfrom,i+wedge)
接下来得到关于单次询问的终点 t t t的 p + 1 p+1 p+1个函数 f i f_i fi
f i = i ∗ x + d i s t , i f_{i}=i*x+dis_{t,i} fi=i∗x+dist,i
所有一次函数构成的凸包可以快速求解问题
JZOJ1669
n个任务,每个任务可以在[l,r]之间一个时刻完成,可以获得v的贡献
最大化贡献
那么先忽略v,由简单贪心可知任务最多只能放在一定的位置,称为关键点
接下来可以对任务与关键点做最大权匹配
具体来说任务先按v从大到小排序
然后直接匹配
JZOJ1895
n个单词按字典序给出,2人轮流说单词,不能是已经出现过单词的前缀,无话可说者败
求先手必胜的所有第一步选择
单词长度<=100
新建一个虚点然后按前缀关系建树
由于按字典序给出所以可以通过跳fa的方式O(n)建树
接下来计算每棵子树的SG值
显然叶子SG值是1
接下来由叶子向根转移
对于一个子树我们直接暴力删链然后求mex计算SG值
最后输出删链后可以让SG归0的单词
JZOJ1656
每个点向父亲和儿子连1权值的边,再向树下方 d e p i + a i + 1 dep_i+a_i+1 depi+ai+1连1权值的边,接下来BFS即可
问题在于第二种边连边过多,考虑按BFS序存点,那么第二类边相当于是点连向一个区间
接下来要降低复杂度就需要避免访问未访问的点
可以用并查集,一旦访问一个点就把它的fa置为i-1
那么在一个区间内只需要一直跳fa直到越界就可以近似O(1)访问
AJ动物园的动物自费前往XC马戏团学习钻火圈
Z Z Z Z_{Z_Z} ZZZ
出过T1,会做T4,就是没过被蠢哭.jpg
JZOJ3057
n+m个数,n个+1,m个-1,要求前缀和全部>=0,求方案数
出过,不讲。
有
( n + 1 − m ) ∗ ( n + m ) ! ( n + 1 ) ! m ! \frac{(n+1-m)*(n+m)!}{(n+1)!m!} (n+1)!m!(n+1−m)∗(n+m)!
JZOJ3373
N行M列的矩阵,可填0/1
要求全1列少于Q,每一行不能有连续P个1
求方案数,1<=N<=8,1<=P,Q<=3,1<=M<=1e18
1e18=矩阵快速幂
考虑用 f i , j , k f_{i,j,k} fi,j,k表示当前已经有i行是连续的0个1,j行是连续的1个1,已经有k列是全1列的方案数
最多的(即N=8,P=Q=3)合法的状态f仅180个,可以写个搜索把180*180的转移矩阵填上然后快速幂
JZOJ3360
有根树,节点有颜色,多次询问路径颜色个数,每次询问会考虑混淆2种颜色(互不影响)
树上莫队模板,考虑把点映射到dfs序,按dfs序正常莫队
每次莫队把指针到询问端点的路径(LCA暴力枚举)的节点状态取反(被记入的改不被记入,反之同理)
然后注意这样是重复取反了2个询问端点的LCA的,所以统计答案时先改为正确,计算后再改回去
因为所有莫队都会重复取反,所以还是需要改回来的
然后对于混淆颜色要注意,题目可以混淆同一种颜色
JZOJ3362
最长1e9的区间,求[l,r]的区间中有几个好的数字
定义好的数字为:所有位可以被分成2个和相同的集合
可以直接分段打表,是 O ( lg N ) O(\lg N) O(lgN),而且,大概跑挺快,比正解快
正解是数位dp
把[l,r]的区间分解成[1.r+1)去掉[1.l)
然后做[1,n]
从高位到低位枚举数字,用一个tag表示是否接下来需要控制下一位严格
如果需要就继续枚举,不需要就开始计算,这部分枚举大概是 O ( ( lg N ) ! ) O((\lg N)!) O((lgN)!)
设剩下没填(不确定的)位数为x
因为这时没有把前面全部填满,所以这x位都可以用0~9填
接下来就可以利用背包计数,这部分计数是 O ( lg N ) 的 O(\lg N)的 O(lgN)的
而且因为某些卡常原因(有的卡常方法只有打表才可以用,而且这方法非常快)实际使用dp确实不如打表
南无高精度菩萨,大慈大悲渡世人
Z Z Z Z Z Z Z_{Z_Z}Z_{Z_Z} ZZZZZZ
过T1T3
T2就我一个暴力被卡精度到没分
T4神仙题场上没写
来2年头一回场上过题
JZOJ1381
给3行n列的数组,要求删去最少列,使得剩余部分每一行排序后完全相同
给定第一行必定是1~n的排列,2,3行编号在[1,n]范围内
做法很多,暴力枚举答案然后check是能过的,但可以被满数据卡
我这边是先忽略第3行对答案的限制,然后剩下2行可以把第x列第二行的数字在第一行中所在的位置连向第x列
然后tarjan缩点,这时如果一个点有入度就意味着这一列的第二行没有办法让它存在于合法方案中,故去掉
然后把第三行限制加上,也就是对缩点后的图重现刚才的操作
复杂度是O(n)
JZOJ1897
求 m ∑ i = 1 n 1 i 2 \frac{m\sum_{i=1}^{n}\frac{1}{i}}{2} 2m∑i=1ni1向下取整,若原式为整数需-1
这里有一个调和数,没有通项式,但随n增大有一些非常好的近似公式,比如 0.577 + log n 0.577+\log n 0.577+logn,这个的误差不会超过 1 2 n \frac{1}{2n} 2n1
然后对比较小的部分跑暴力,大一点(误差小)的跑这个式子就行了
JZOJ2643
一个6边形坐标系,从原点按顺序一圈一圈向外绕填1~5的数字
不能和已经填过的一样,如果有多个可选就填出现次数最少的,如果还有多个就最小的
求某个点的编号
建立6边形坐标系然后直接模拟
JZOJ1898
N位B进制数φ,满足 φ ≡ V ( m o d M ) φ≡V (\bmod M) φ≡V(modM),将所有模M为V的N位B进制数,按照各数位构成的集合分类,求每一类数各有多少个。
要求按集合递减顺序输出
先枚举数位的集合S, O ( 2 B ) O(2^B) O(2B)
对每个集合下设dp方程, f i , j f_{i,j} fi,j表示 m o d \bmod modM余i,长度为j且集合为S的子集的合法个数,得到方程: f i , j = ∑ i ′ + i ′ ′ = i , i ′ B j ′ + i ′ ′ m o d M = i f i ′ , j − j ′ f i ′ ′ , j ′ f_{i,j}=\sum_{i'+i''=i,i'B^{j'}+i''\bmod M=i}f_{i',j-j'}f_{i'',j'} fi,j=i′+i′′=i,i′Bj′+i′′modM=i∑fi′,j−j′fi′′,j′
这个方程第一维可以快速幂优化,复杂度就是 O ( M 2 log M ) O(M^2\log M) O(M2logM)
把 f N − 1 , V f_{N-1,V} fN−1,V作为S的子集合法解个数
接下来用容斥把S的子集的合法个数变成恰好为S的合法个数,需要枚举子集,是 O ( 3 B ) O(3^B) O(3B)或 O ( 4 B ) O(4^B) O(4B)
都可以过,但是 O ( 4 B ) O(4^B) O(4B)更加好写
今儿个三国杀反贼互刀,主公和忠臣反目,好不热闹
Z Z Z Z Z Z Z^{Z^Z}Z^{Z^Z} ZZZZZZ
和B组一起打同一场比赛
没想到B组这么水
3题A俩
所以以前一道题过不了一定是题目太难了(确信)
JZOJ3403
一个1~n的有序(从小到大)排列A,定义一次操作V(i,S)为把S分为长度为i的段(有剩余的算做一段),把每一段循环左移一位
求 V ( n , V ( n − 1 , ⋯ V ( 2 , A ) ) ) V(n,V(n-1,\cdots V(2,A))) V(n,V(n−1,⋯V(2,A)))。
循环位移相当于把一部分向左一个,另一部分当成一个链表整体右移
第一部分是 O ( n ) O(n) O(n)的,第二部分是 O ( H n ) O(H_n) O(Hn)的
所以可以把第一部分的位移变成数组下标整体右移1,然后跑暴力就是 O ( n H n ) O(nH_n) O(nHn)的正解
JZOJ3404
小Y 有n 张卡牌,小X 有m 张卡牌。已知小X 的卡牌全是攻击型的。
游戏的每一轮都由小X 进行操作,首先从自己手上选择一张没有使用过的卡牌X。如果小Y 手上没有卡牌,受到的伤害为X 的力量值,否则小X 要从小Y 的手上选择一张卡牌Y。
若Y 是攻击型(当X 的力量值>=Y 的力量值时才可选择),此轮结束后Y 消失,小Y 受到的伤害为X 的力量值与Y 的力量值的差;若Y 是防御型(当X 的力量值>Y 的力量值时才可选择),此轮结束后Y 消失,小Y 不受到伤害。
求小X可造成的最大伤害
考虑分类讨论,如果可以把小Y的牌全部打掉,那就优先用最小的合法牌打掉小Y的盾
再用最小的合法牌打掉小Y的攻
然后所有剩余牌全部打出
如果打不掉全部牌,就考虑不打盾只打攻,可以按小Y的从小到大,小X的从大到小排序,然后前缀和求解
2者取max就是答案
JZOJ6271
有这样一种武器:1把0级武器a元,若要一把i级的武器,需要把一把max(i-1)级的武器强化,需要消耗一把max(i-2,0)级的武器
强化有 m i n ( b m a x ( i − 2 , 0 ) , c m a x ( i − 1 , 0 ) ) c m a x ( i − 1 , 0 ) \frac{min(b_{max(i-2,0),c_{max(i-1,0)})}}{c_{max(i-1,0)}} cmax(i−1,0)min(bmax(i−2,0),cmax(i−1,0))的概率成功,否则失败,消耗武器不返还,强化失败武器下降一级,最低0级
求期望需要多少元才可以强化出一把n级武器,结果对998244353取模
设一把x级武器期望需要 f x f_x fx元
那么x级武器的花费至少 f m a x ( x − 1 , 0 ) + f m a x ( x − 2 , 0 ) f_{max(x-1,0)}+f_{max(x-2,0)} fmax(x−1,0)+fmax(x−2,0)(直接成功)
如果不成功会获得一把 m a x ( x − 2 , 0 ) max(x-2,0) max(x−2,0)的武器,可以作为支付再次强化的武器
所以不成功的费用应该是一把x级武器的费用去掉一把 m a x ( x − 2 , 0 ) max(x-2,0) max(x−2,0)武器的费用
故有
f x = ( 1 − m i n ( b m a x ( i − 2 , 0 ) , c m a x ( i − 1 , 0 ) ) c m a x ( i − 1 , 0 ) ) ( f x + f m a x ( x − 2 , 0 ) ) + f m a x ( x − 1 , 0 ) + f m a x ( x − 2 , 0 ) f_x=(1-\frac{min(b_{max(i-2,0),c_{max(i-1,0)})}}{c_{max(i-1,0)}})(f_x+f_{max(x-2,0)})+f_{max(x-1,0)}+f_{max(x-2,0)} fx=(1−cmax(i−1,0)min(bmax(i−2,0),cmax(i−1,0)))(fx+fmax(x−2,0))+fmax(x−1,0)+fmax(x−2,0)
池塘里的水为什么不能喝啊?因为鱼还没熟吗?
z z z z^{z^z} zzz
T1没删调试-90pts
T450pts做法没开o2-20pts
T2没时间做-30pts
T3算法对了没来得及加优化-50pts
属于蚌住
JZOJ1434
n个点m条无向边,第一天1号向所有连边的点流出1单位水,接下来每一天每个点都会向周围的点出1~2单位水,出的是1单位还是2单位取决于这个点在上一天流入的水是奇数还是偶数
一共是H天
求所有边上流过的水之和
n<=20,H<=1e8
先考虑暴力,复杂度是 O ( m H ) O(mH) O(mH)的
但是n很小,而且手玩一些大数据以后会发现这种方式是有循环的
所以先暴力找循环节,然后利用循环节快速计算,最后剩下几天可以直接暴力计算,因为点只有2种状态,所以所有局面最多是 2 n 2^n 2n个, 2 n 2^n 2n之后必出循环节,复杂度就是 O ( 2 n m ) O(2^nm) O(2nm)的
JZOJ3405&&P2254
题面可以戳此
还是先考虑暴力怎么做,暴力可以设 f i , j f_{i,j} fi,j表示第i行第j个最远可以走多远,复杂度是 O ( T n m ) O(Tnm) O(Tnm)
T的复杂度太大,肯定是要优化成k的
那么就设 f i , j , l f_{i,j,l} fi,j,l表示在第1~i个区间,第j行第l列的点最远走多远,复杂度是 O ( k n 3 ) O(kn^3) O(kn3)(n,m同阶)
有 f i , j , l = m a x 1 < = v 1 + v 2 < = l e n ( f i , j − v 1 , l − v 2 + 1 ) f_{i,j,l}=max_{1<=v1+v2<=len}(f_{i,j-v_1,l-v_2}+1) fi,j,l=max1<=v1+v2<=len(fi,j−v1,l−v2+1)
其中v1,v2是指代移动距离和移动方向
然后在某个区间内的更新可以利用单调队列去掉一个n,然后复杂度就是对的了( O ( k n 2 ) O(kn^2) O(kn2))
JZOJ2867
有 N 个关卡,初始有 Q 条命。
每通过一个关卡,会得到 u 分和1条命,生命上限为 Q。其中 u=min(最近一次连续通过的关数,R)。
若没有通过这个关卡,将会失去1条命,并进入下一个关卡。
当没有生命或没有未挑战过的关卡时,游戏结束,得到的分数为每关得到的分数的总和。
期望题要注意方案数,概率,和期望直接的关系,这3者可以互相转化,所以直接设期望dp不行时可以考虑计数或者计算概率
设 g i , j , k g_{i,j,k} gi,j,k表示第i关连胜j次血量为k的概率
有
g i , j , k ∗ p = > g i + 1 , m i n ( j + 1 , R ) , m i n ( k + 1 , Q ) ] g_{i,j,k}*p=>g_{i+1,min(j+1,R),min(k+1,Q)]} gi,j,k∗p=>gi+1,min(j+1,R),min(k+1,Q)] g i , j , k ∗ ( 1 − p ) = > g i + 1 , 0 , k − 1 g_{i,j,k}*(1-p)=>g_{i+1,0,k-1} gi,j,k∗(1−p)=>gi+1,0,k−1
以上可以矩阵快速幂,但直接矩阵快速幂的矩阵阶大概是100+,需要卡常,所以可以考虑优化
直接跑dp然后输出g可知,
连胜比血量上限大时,那么血量必定是满的,所以可以把阶降到大概30左右
JZOJ2866
n个点,求任意3个点直接两两曼哈顿距离和的最大值和最小值
画图可知3个点直接两两曼哈顿距离和与恰好包含3个点的矩形周长等价
所以可以推出3个点直接两两曼哈顿距离和的定义方式是如下2种2选1
一个点确定了一个 X 和一个 Y,另外两个点分别确定了一个 X 和一个 Y。
一个点确定了一个 X 和一个 Y,另一个点同样确定了一个 X 和一个 Y,还有一个点什么都没有确定(但必须存在这个点)。
最大值的求解很容易,可以把点集缩小,选取的点只有可能来自Xmax+Ymax,-Xmin+Ymax,-Xmin-Ymin,Xmax-Ymin,Xmin,Xmax,Ymin,Ymax的8个点中
这部分就可以暴力求解
接下来求最小值,分上述2种情况讨论
对第一种情况:
首先可以写出 O ( n 3 ) O(n^3) O(n3)的暴力,然后利用前缀和的思想可以写出 O ( n 2 ) O(n^2) O(n2)(据说这个加上优化可以过),接下来无法压掉n,但可以写一个 O ( n log n ) O(n\log n) O(nlogn)复杂度的做法
先钦定左下角的点(要把旋转带上)
一般来说带log的做法都会带数据结构,而且大概率是线段树,所以扫描线(从右到左)做x轴,离散化y轴,然后在y轴上做一个线段树
线段树的节点就相当于是一些行的映射
用线段树维护最小的x和距离当前行最近的y,相当于是对一个矩形构建了2条射线边
那么每次扫到一个点,我们就在线段树上求出钦定它作为左下角的点的答案。
第二种可以直接枚举一个点然后求周围最近的点,有个排序,所以也是 O ( n log n ) O(n\log n) O(nlogn)
如果一个人一天做了5次人格测试,那这个人要么是人格分裂,要么就是太闲了
z z z z_{z_z} zzz
打的还行,场切2题
JZOJ6277
注意到每一行每一列都是等差数列,可以 O ( n + m ) O(n+m) O(n+m)快速求和只有行或只有列的情况
对称地,不妨先做行,然后把列的影响加进来,就先把列当成普通的等差数列处理
然后需要把行列之间的交点拎出来去掉错误统计改回正确统计,是 O ( k 2 ) O(k^2) O(k2)的,80pts
现在优化这个算法,把所有交点拎出来以后行与行之间的错误统计和正确统计可以递推,这样是 O ( n + m + k ) O(n+m+k) O(n+m+k)的,可以AC
JZOJ1385
二维平面坐标系中有N个点。
从N个点选择3个点,问有多少选法使得这3个点形成直角三角形。
直角三角形2条直角边的斜率乘积为-1,简单勾股定理可证
题目时限4s,N只有1500,那么可以 O ( N 2 log N ) O(N^2\log N) O(N2logN)
先枚举直角顶点,然后把其余所有点和这个点的连线的斜率用最简分数表示,接下来用map开桶可以统计
JZOJ6273
n个点,动态加边,保证任意时刻是有向树,儿子连向父亲,多次询问路径最小边权,强制在线
最小边权一般来说3种求法:倍增,LCT,树剖
这里是动态,树剖不可做
路径最小边权可以边换点转点权然后LCT维护,不过这个有点难写
也可以倍增做,带权并查集维护深度,懒惰修改LCA的倍增数组即可,2种算法复杂度均为 O ( n log n ) O(n\log n) O(nlogn)
JZOJ1896
给n个点构成的折线
求一个点,使得这个点到每个折线的直线都不被其他点所遮挡,而且最小化这个点在竖直方向上到折线的距离(不能在折线下方)
再求一个点,使得这个点到每个折线的直线都不被其他点所遮挡,最小化这个点的纵坐标值(不能在折线下方)
使得这个点到每个折线的直线都不被其他点所遮挡这个条件
等价于所有折线从左到右改成向量,然后求左半平面交,所有左半平面交之内的点都满足这个条件
接下来第二个点相当于是求左半平面交之内纵坐标最小的点
第一问发现一下性质就会发现答案一定是左半平面交的顶点或者是折线顶点贡献出的
然后可以枚举,使用双指针做
卡常,卡精度,卡空间非常严重,不保证可以在不重构代码情况下通过,不保证可以在不特判数据情况下通过,但算法的时空复杂度均正确,AC与否看具体实现能力
看电影的时候有人领着鼓掌?为什么演员话都没说完就要鼓掌啊?
放假时间!
上午把昨天的T4切掉就回去打牌
然后吃午饭,睡觉到3点 直到起不来为止
然后继续打牌,连输10把,心态崩了
4点回机房写题,写到吃饭,交了5发都不过
吃顿饭过了
晚上ABC
找WJ要translate时差点ctrl X
Z Z Z Z Z Z^ZZ_ZZ ZZZZZ
昨晚ABC切到E,D用半h……不过rk680+,上分140+
比赛会一道,结果忘记写了……
JZ的枣子相当的酸,深刻教训(但是大家都说不酸??我的嘴有问题??)
OK吃到后面就甜了
吃JZ的香蕉会拉稀(连吃3天一天4根,你不拉谁拉)
JZ的葡萄不太干净(感觉有层灰,可能是我没洗的问题)
JZ的油桃不太甜(可能是我不会买?)
但JZ只卖这4个……
JZOJ6275
首先明确一点:暴力不可做
然后可以统计前k项的贡献
发现取对数以后就可以把次方用矩阵快速幂形式表达以统计贡献
JZOJ1388&&P6335
题面见luogu
据说可以圆方树,不过这里有一个更妙(个人认为)的做法
先边双联通分量,把所有的简单环标记到dfs序最小的节点上
那么剩下的边都是割边
然后设x的子图是所有和x相连的割边以及所有被标记在x上的简单环及环上节点的子图
接下来设dp方程, f x , 0 / 1 f_{x,0/1} fx,0/1表示始于x终于x/始于x终于x子图中任意节点的最长路径长度
第二维为0的很好转移,是x子图中所有环的长度和+x子图中环部分所有点的 f t o x , 0 f_{to_x,0} ftox,0
第二维为1的可以先钦定终止节点所在子图y,然后就是x剩下子图中环部分长度之和+从x到y最长路+ f y , 1 f_{y,1} fy,1
JZOJ6263
求
∑ d = 1 2 ∑ i 1 = 1 m 1 . . . ∑ i n = 1 m n [ g c d ( i 1 , . . . , i n ) = = d ] \sum_{d=1}^2\sum_{i_1=1}^{m_1}...\sum_{i_n=1}^{m_n}[gcd(i_1,...,i_n)==d] d=1∑2i1=1∑m1...in=1∑mn[gcd(i1,...,in)==d]
经典莫反式子套进去:
∑ d = 1 2 ∑ d ∣ e m i n ( m j ) ∏ i = 1 n ⌊ m i e ⌋ \sum_{d=1}^2\sum_{d|e}^{min(m_j)}\prod_{i=1}^n\lfloor\frac{m_i}{e}\rfloor d=1∑2d∣e∑min(mj)i=1∏n⌊emi⌋
接下来整除分块即可
JZOJ6279
从左到右枚举优美区间的右端点
设 c n t l , r cnt_{l,r} cntl,r表示区间[l,r]内相差为1的数对个数
设当前枚举到r,有区间[l,r]为优美区间当且仅当 l + c n t l , r = r l+cnt_{l,r}=r l+cntl,r=r
可以枚举答案右端点r’
显然这时 l + c n t l , r < = r ( 1 < = l < = r ) l+cnt_{l,r}<=r(1<=l<=r) l+cntl,r<=r(1<=l<=r)恒成立
l不会变,所以要让 c n t l , r cnt_{l,r} cntl,r尽量大以使得上式尽量成立
用堆维护询问,按l从大到小排序
每次r’++都要把结尾端点为r的加入堆
接下来cnt可以把第二维滚动去掉
对 c n t l cnt_{l} cntl更新 ( a r , a r ± 1 ) (a_r,a_r±1) (ar,ar±1)的数对,如果没有超过区间范围[1,r]就可以更新
这部分可以用一颗区间加区间max的线段树维护
对于询问(l,r),查询[1,l]的 m a x ( c n t l ′ , r ′ + l ′ ) max(cnt_{l',r'}+l') max(cntl′,r′+l′)(此处l’指答案的左端点),若有多个求l’最大的一个,若此值与r’相等,弹出此询问(解已经出来了),否则r’++,继续枚举
实际上是一种双指针,复杂度应该是 O ( m log n + n log n ) O(m\log n+n\log n) O(mlogn+nlogn)
每一题的做法都沾点正解,简称多少沾点
Z Z Z Z Z Z_ZZ^ZZ ZZZZZ
讲座是贪心和构造,结果是贪心和拟阵
听不太清,不如自己看ppt
比赛开始后1h才发现有比赛
比赛被卡了空间……暴扣100~70pts
只剩65pts的暴力分
T2考场上是正解,而且是爆标那种(如果标是 O ( n log n ) O(n\log n) O(nlogn)),但是不会证,所以改了暴力……
但是满分是300
完蛋
JZOJ1901
一个平面直角坐标系上,有N个点,标号为1到N,其中第i个点的坐标为( x i , y i x_i,y_i xi,yi)。
求满足以下两个条件的点列 p i {p_i} pi的数目(假设 p i {p_i} pi的长度为M):
求满足条件的非空序列 p i {p_i} pi的数目,结果对一个整数Q取模。
人话翻译就是n个点构成的折线计数
计数题,模数任意,一般是dp
观察性质可知一个点列的一些显著特征:点列中相邻的2个点框定剩下的点x的取值
对x的限制显然比y难处理,所以先按x排序
设dp方程转移,有 f i , 0 / 1 f_{i,0/1} fi,0/1表示以按x从大到小第i个作为点列里最左的点/最右的点且作为开头(在按x排序的所有点的区间[1,r]中,区间[1,r]称为求解区间)的方案数
顺序枚举r
现在需要更新的是前面的所有点i( i ∈ [ 1 , r − 1 ] i∈[1,r-1] i∈[1,r−1])的 f i , 0 f_{i,0} fi,0,以及现在这个点的 f r , 0 , f r , 1 f_{r,0},f_{r,1} fr,0,fr,1
因为目前的求解区间是[1,r],而以r为左端点,只可能是这一个点本身,所以 f r , 0 = 1 f_{r,0}=1 fr,0=1
接下来再枚举一个j(从i-1到1)以转移
需要对 f j , 0 f_{j,0} fj,0求解区间[1,r],而它原来存储了求解区间[1,r-1],只需要把以r为右端点的部分也加进来即可
求解 f r , 1 f_{r,1} fr,1就把以j为左端点的部分加进来就好,注意最后要+1,因为单点也符合dp的定义
最后把所有的f全部求和,注意到单点都多计了一次,最后要-n
JZOJ6288
设旋转子段是[l,r],则一个点x在旋转后归位当且仅当 a x + x = l + r a_x+x=l+r ax+x=l+r
其中 a x + x a_x+x ax+x可以用桶维护
发现最优的旋转选择[l,r]一定会让l或r归位
证明:
如果不会让l或r归位,把这个旋转选择缩小到会可以严格不劣于原旋转选择(因为多转的部分要么都不中,要么把不中的改成中)
直接枚举x
如果x是[1,x]某个点的目标位置,可以把这个点入桶
如果x的目标位置在[1,x]中,也可以把这个点入桶
然后可以直接维护了
JZOJ6293
是个ddp
是CF413E的加强版,n只有5
用线段树节点i表示从l列到r列的最短距离
不同的是这里的节点i实质上是一个n*n的矩阵,矩阵第x行第y列表示第l列第x个到第r列第y个的距离
线段树信息上传就是类似于矩阵乘法
然后在线段树上做单点修改和区间查询
极致n皇后:
这样随机 O(n) 次后如果还是找不到,那么我 们就暴力找这一行是否有合法位置。这样既可以使效率大大提高,又可 以保证时间复杂度不会更劣。
我们在 O(n log n + kn) 的时间内解决了这题。
n<=1e7
z z z z z z^zz_zz zzzzz
t1居然是LSQ在小五给的trick?果断切了
t3读错题50pts,t2被误导100pts->20pts
JZOJ6294
从小到大排序,然后对每个点暴力扩展,扩展过的点不再扩展
因为一个点最多被记录2次,所以是 O ( n ) O(n) O(n)
排序复杂度 O ( n log n ) O(n\log n) O(nlogn),相当优秀
JZOJ6287
二叉查找树对于一个有序序列上的区间,可以联想到区间dp
设 f l , r , 0 / 1 f_{l,r,0/1} fl,r,0/1表示区间[l,r]以区间左/右边的点为根,易得dp方程:
f l , r , 0 / 1 = f l , x − 1 , 0 + f x + 1 , r , 1 f_{l,r,0/1}=f_{l,x-1,0}+f_{x+1,r,1} fl,r,0/1=fl,x−1,0+fx+1,r,1
注意边界情况,二叉查找树可以让某个点无左/右儿子
JZOJ6286&&P4442
建图跑dij,每个点到周围4连通的格子的距离为1,然后预处理出所有点向上下左右的传送门去到的点以及这个点最短需要走多远才可以进入一堵墙(开传送门)
这部分可以bfs实现(即墙到点的距离)
然后dij
JZOJ1537
求环上最大子段和,单点修改,多次查询,要求不能全选
最大子段和的经典维护就是线段树,这是支持单点修改的,但是查询在环上是个问题
最大子段和其实也是总和去掉最小子段和,一整个环的和去掉最小子段和刚好可以满足环的条件
所以把环当做序列去做,然后再处理一下最小子段和的部分即可
搬宿舍的时候有人问为什么t3的传送门没有发明出来……
上午140mins拿300pts
然后开睡,补觉
新宿舍是有史以来最烂的,空调坏了,风扇的电路走的是灯的,一熄灯就停一个
JZOJ3425
一颗树上n个点,只能从父亲指向儿子,每个点有e的流量费用来提供1的贡献,边有流量限制,问最多贡献是多少
根不能贡献
可以直接分组背包,设 f i , j f_{i,j} fi,j表示第i个节点获得j的流量,在i的子树内产生的贡献
JZOJ3504
有 f n , k = f n − 1 , k ∗ f n , k − 1 f_{n,k}=f_{n-1,k}*f_{n,k-1} fn,k=fn−1,k∗fn,k−1
其中, f n , 0 = n , f 0 , k = 1 f_{n,0}=n,f_{0,k}=1 fn,0=n,f0,k=1
求 f n , k f_{n,k} fn,k因子个数
把图画出来,发现是格路径计数, f x , 0 f_{x,0} fx,0会造成 C n − i + k − 1 k − 1 C_{n-i+k-1}^{k-1} Cn−i+k−1k−1的贡献
因子个数可以质因数分解统计贡献,然后用公式 ∏ p i c n t i \prod_{p_i}cnt_i ∏picnti(表示 p i p_i pi的次方)
有一棵n个节点的无根树,给出其中的m对点对
问有多少条树上的简单路径满足该路径上不存在任何一对给出的点对
这里我们认为路径和
并且对于题目中给出的点对
把dfs序跑出来,钦定1为根
对一组
若2个点没有祖先关系,则不合法的是从x的子树到y的子树的点对
若有祖先关系,则不合法的是深度大的子树到全部点去掉深度大的所在的x的子树
子树在dfs序上是一段区间
一组不合法的点对在dfs序上是二维平面是1~2个矩形
然后扫描线二维数点
JZOJ6310
给定整数 n 和 x,以及一个大小为 n 的序列 a。
你可以选择一个区间 [l,r],然后令 a[i]+=d(l<=i<=r),其中 d 满足 |d|<=x。
要求最大化 a 的最长上升子序列的长度,并输出该值
发现性质:若增加一个区间[l,r],那增加区间[l,n]一定不更劣,减少同理
进一步地,有减少和增加等价(减少[1,x]等价于增加[x+1,n])
再有,如果要加,一定要加到最大,不然一定不优于加到最大
所以点的取值只有2n个,可以离散化后树状数组维护LCS,讨论加与不加只需再开一个树状数组,复杂度是 O ( n log n ) O(n\log n) O(nlogn)
下午HDU比赛
我们的目标是:有效罚时15发,某人单人3题+,无效罚时多多益善,尽量在最后一刻AC
只达成最后一个战役目标
结果排名是185,还行
上午1道原题,还是上次来的时候做的……结果手残没过100->0……
T3过了,T2算法对了MLE爆0,T4神仙题根本没写
讲题人讲T4的时候满脸艰辛……
JZOJ3410
最小方差生成树
值域只有100,可以枚举平均数然后直接生成树
JZOJ6313
蜜蜂 Maja 到了一片草地,草地可以被描述成 N 行 M 列的网格图,在第 i 行第 j 列的位置上有 C i , j C_{i,j} Ci,j 朵未授粉的花。
Maja 会从第 A 行第 B 列出发,每次只能移动到与当前位置四相邻的格子上,且不能移动到草地以外。每到达一个格子,她会把此处所有未授粉的花都授粉。
然而,当 Maja 离开一个格子,此处又会长出 C i , j C_{i,j} Ci,j 朵未授粉的花。
Maja 想知道,如果她从第 A 行第 B 列出发,选择一条长度恰好为 K 的路径,最后又回到第 A 行第 B 列,最多能为多少朵花授粉。
有结论是最优方案一定是起点到某个点然后来回跑最后原路返回
然后可以dp计算起点到某个点长度为i的最优解然后直接求
发现空间开不下,所以滚动一下
JZOJ3230
给定一棵N个节点的树,去掉这棵树的一条边需要消耗值1,为这个图的两个点加上一条边也需要消耗值1。树的节点编号从1开始。在这个问题中,你需要使用最小的消耗值(加边和删边操作)将这棵树转化为环,不允许有重边。
是来jz之前的原题呢
设dp方程直接做
设 f i , 0 / 1 / 2 f_{i,0/1/2} fi,0/1/2表示i号子树向下连0/1/2条边的答案是多少
然后dp就行
JZOJ6278
建一颗线段树维护第l列的所有点会跑到第r+1列的哪些点
然后修改的复杂度就是 n log m n \log m nlogm而已
接下来处理询问,k很大但n,m相当小,所以可以做循环节优化它,然后复杂度大概是 n log m n\log m nlogm的
所以就可以了
myd:这里的乳白色悬浊液饮用水真好喝,就是有点酸,可以当饮料
九江 w z h \color{red}w\color{black}{zh} wzh:hhhh笑出鹅叫
实际上jz的水资源除了宿舍的饮水机和机房厕所还有2个湖都是一副被污染的样子……