09 2021 档案
摘要:传送门 解题思路 概括一下题意:求min(sumw/sumn),其中sumw表示一个环上的边权和,sumn表示一个环上点的数量。 这种分数规划问题很常见的一个套路为二分答案,然后转化成01分数规划。 即二分一个比值k,判断有无环满足sumw/sumn<=k,也就是sumw-sumn*k<=0。进一步
阅读全文
摘要:传送门 解题思路 先吐槽一下某谷翻译能不能把输入格式也翻译一下,感觉输入格式比题目描述都长。。 观察到p非常小,于是考虑状态压缩,将当前能打的怪物压缩成一个二进制数。 按照每个二进制数分层,一共分得 2^13=8192 层。 边全部存下会MLE,所以考虑在转移的时候判断一下,只有出边的状态是现在状态
阅读全文
摘要:传送门 什么是分层图 在一个图上,按照某种限制,进行分层,在相邻两层之间按照某种联系进行连边。 如何实现 一般有两种方法:二维数组法和状态压缩法。 二维数组法:a[i][j]表示第i层的节点j。 状态压缩法:a[j*k+i]表示第i层的节点j,其中k表示层数。(相当于把二维坐标压成一维。) 应用 在
阅读全文
摘要:众所周知,spfa已死。 我们能做到的,只是尽可能的优化一点,减少被卡死的情况。 SLF优化 SLF:即 Small Label First,就是每次进队元素跟队首比较,若dis大于队首元素,则将其插到队尾,否则插到队首。 LLL优化 LLL:即 Large Label Last,每次进队元素的di
阅读全文
摘要:传送门 解题思路 关于spfa,他死了 显然是差分约束。每日背规律: 小于等于最短路,求出上界最大值; 大于等于最长路,求出下界最小值。 于是建立大于等于的关系,spfa跑一遍最长路,判断有无正环,最后答案就是各个dis之和。 为保证都为正整数,需要从超级源点0向其他所有点建立一条边权为0的边。 ~
阅读全文
摘要:传送门 解题思路 分数规划问题:最大化比值。 可以枚举流量,再dijkstra跑最短路求出费用,更新答案。 AC代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #
阅读全文
摘要:传送门 解题思路 概括一下题意: 求所有点两两之间最短路的条数和经过k点的最短路的条数。 可以用Floyd边求边维护。 和Floyd本身一样不是很好感性理解,越深想越感觉可能落下或者多算。 要注意最短路条数f[i][i]不能初始化为1.否则当k==i松弛时会多算。 AC代码 #include<ios
阅读全文
摘要:传送门 解题思路 传递闭包板子题。 直接建边然后Floyd即可。 最后对于每一个点,若比他小的(ma[i][j])加上比他大的(ma[j][i])等于n-1,则他可以确定排名。 AC代码 #include<iostream> #include<cstdio> #include<cstring> #i
阅读全文
摘要:传送门 解题思路 感觉还是蛮有难度的。 设dp[i][j]表示释放编号在区间i..j的犯人所需要的肉的数量。 一开始枚举最后一个释放的人k进行转移,结果发现wa了,为什么? 深入分析一下,发现不满足无后效性,即未来的决策会影响现在的答案。 因为k左右两边的转移是相互影响的。 而当我们枚举的k的意义变
阅读全文
摘要:传送门 总结 被D题卡了卡好久。。 做了ABCDF,E题到最后也没推出来,唉还是太菜了呜呜呜。 A-F题解 A可以直接暴力枚举。 B题进制转换注意开long long。 C题注意是大于还是大于等于。 D题记忆化搜索或者dp即可。 E题从根节点向下分治+分类讨论+数学推导。 F题换根dp板子。 GH题
阅读全文
摘要:传送门 解题思路 我们发现到某一位时,前面擦去那些数字并不影响当前位,影响的只有前面擦去的数量。 设dp[i][j]表示到第i个数共擦去j个数的答案。 则dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]+(i-j==a[i])); 最后答案就是max(dp[n][j])。 A
阅读全文
摘要:传送门 解题思路 本题从暴力dfs入手,推出dp转移方程。 先进行排序,速度越大编号越大。 假设齐王从最大开始的出马,dfs(now,l,r)表示齐王出到编号为now的马,田忌还剩下l-r之间的马(因为田忌一定是要么出最大的马,要么出最小的马)。 分类讨论,当田忌最大的马大于齐王,则一定拿下这场比赛
阅读全文
摘要:今天拿下好几发最优解,对卡常有了很大的感悟。 尽量少用数组访问地址不连续的值,尽可能用单个变量在求解的for循环中读入并求解。 stl不开O2是真的慢,手写封装的数据结构也是蛮好看的。 取模运算非常慢,如果开long long可以少取几次模,那非常划算。
阅读全文
摘要:洛谷传送门 解题思路 把有馅的面包的数量看做ai/ci,就转化成了多重背包的板子。 为了练习熟练度,于是使用单调队列优化多重背包。 本以为肯定是最优解,没想到竟被一个直接暴力拆成01背包的干翻了。。 不能放弃,于是就手写双端队列,再交了一遍,把它干翻了,拿到了最优解。 AC代码 #include<c
阅读全文
摘要:传送门 解题思路 首先可以发现,无论怎么变,字母的和是不变的。 而且每个位置是多少都行(只要和别超)。 用dp[i][j]表示前i位的和为j的方案数。 然后枚举第j位可能情况(0~25),从dp[i-1][j-k]转移过来即可。 一种思路是先预处理这个dp数组,然后回答询问。 另一种思路是离线处理,
阅读全文
摘要:洛谷传送门 解题思路 先用类似dp预处理出is[l][r]表示l到r这个区间是不是回文串。 然后在把is数组放到二维平面上,每次询问l,r实际上就是询问(l,l)到(r,r)这样一个矩阵的点的数量。 可以用二维前缀和处理出来,O(1)查询。 AC代码 #include<cstdio> #includ
阅读全文
摘要:洛谷传送门 解题思路 最朴素的 dp 为: 为前 个数选 个方案数。 的时空复杂度,很显然会炸,所以需要优化。 先考虑空间,第一维可以滚动数组滚掉,因为选的第 个数与上一个数是什么没关系。 再考虑时间上,尝试对于每个
阅读全文
摘要:偶然学到了对拍的正确打开方式。 当然不只限于对拍,也可以偷懒用来测试样例。 首先应该写一个对拍程序: for(int i=1;i<=300;i++){ system("数据生成.exe > data.txt"); system("正解.exe < data.txt > ans.txt"); syst
阅读全文
摘要:传送门 总述 比赛中过了4/6,rank26。 罚时感觉还是蛮多的~~(跟我一个oier有什么关系)~~。 最后一个题贪心贪错了,貌似如果是oi赛制会有60分。 A.牛牛吃米粒 考虑按二进制位拆分。 只要有一位不能满足要求,则输出NO。 #include<cstdio> #include<iostr
阅读全文
摘要:传送门 解题思路 不得不说,这题恶心到我了,调了一个多小时。 第一次高精度把运算等写在struct里面,感觉良好。但是一定要注意初始化。 再就是高精乘高精最后的位数是两个位数相加,而不是相乘。 AC代码 #include<iostream> #include<cstdio> #include<cst
阅读全文
摘要:传送门 解题思路 我们发现若一个原数i经过若干次op操作后能变成另一个原数j,则i没有存在的必要了(因为j更优)。 于是对于每一个ai,就能找到最小的一个原数(这个也是“性价比”最高的原数)。 因为原数数量很少,所以可以用二进制位来表示,假设消灭一个数字用到的是第i个原数,则将这个数字的值赋为2^i
阅读全文
摘要://第300篇博客祭QAQ 传送门 解题思路 挺好的一道题。 首先可以观察到,若按照水流方向建边,则整张图是个DAG。 第一步:建图。 令水池(0号店)为根。先用单调递减栈求出每个圆盘下面第一个比他大的圆盘,很显然水就往那里流,将这两个点之间连边,最后0号店向栈中剩下元素连边。 第二步:预处理ST表
阅读全文
摘要:传送门 解题思路 从前往后维护一个严格单调递减栈,在弹出元素和入栈的时候更新答案。 但是要注意两人身高相等的情况,所以要记下某元素的个数。 细节还是蛮多的。 AC代码 #include<iostream> #include<cstdio> #include<cstring> #include<cma
阅读全文
摘要:传送门 解题思路 和上一道题基本相同。 但是这个题题面是真的复杂,读了好久才读懂。 关键在于如何建图。 将在第0列可以看做第0个点,第n列可以看做第m+1个点。 这两个特殊的点到其他点的距离为点线垂直距离,其他的点之间的距离为点点距。 还有不同的地方就是两个信号塔之间的距离是两个半径,而0点和m+1
阅读全文
摘要:传送门 解题思路 两种方法: 方法一: 直接按照Kruskal的方法求最小生成树,求的过程中s和t刚刚联通时加的边的大小即为答案。 方法二: 先二分答案,然后跑一遍最短路,要求只能走边权小于二分值的边。 AC代码 #include<cstdio> #include<iostream> #includ
阅读全文
摘要:传送门 解题思路 其实很简单的一个单调栈就可以解决的题,题解里的做法都写的很麻烦。 建立一个强制不为空的单调递减栈,然后运用扫描线的思想可以快速求出面积。 强制不为空是为了保证最左端一定要有柱子。单调递减是因为受到影响某个区域能否存储水的是左面和右面最高的柱子中的最小值。 可以借助下图进行理解: 分
阅读全文
摘要:洛谷传送门 解题思路 方法一: 发现l和r特别大,但是a特别小。 于是令 ,算出一个sum。 然后发现若l和r同时加上一个数x,最后的sum也加上了x。 所以只要我们算出原来的sum与a的差,然后l和r同时加上这个差就完成了。 sum怎么算? 0~9每个数字出
阅读全文
摘要:洛谷传送门 解题思路 按mask二进制位,把物品分类。 设sum[i]为mask共有i位的物品的val的和。 因为若答案的第i位为1,对mask小于i位的物品是没有影响的。 于是我们从低位向高位枚举,这样就保证了后面的决策不会影响前面已经决定了的状态。 因为只要求答案变成相反数,所以只要每一个sum
阅读全文
摘要:##传送门 //别问我为什么现在才发,刚刚翻存库发现了这坑还留着E题没填,懒得填了所以就改成A到D题发上了。。。 ##总结 感觉还好,赛场上A了ABCD题,E题想出来了思路但没来得及实现。 ABCD感觉全是思维题,用不到什么高级算法。 ##A. Contest Start(数学) 洛谷传送门 模拟一
阅读全文
摘要:洛谷传送门 解题思路 在图上很难做这种构造题,所以一种常用的方法是求出其生成树。 在生成树上做就容易很多。 于是这个题就按照 dfs 序建立一颗生成树,记录下每个节点的返祖边。 于是第一问可以根据树的深度判断是否符合要求,符合的话直接输出。 若没有,则易证第二问一定成立: 因为第一问不成立,所以叶子
阅读全文
摘要:洛谷传送门 解题思路 很经典的一个构造题。 从异或的性质入手:a^a^b=b。 于是我们就有了将其变成同一个数的一个策略: 若原来能化成aabbccc这样的一个数列,则可以在345、123位置依次进行一次操作,将其全部变为c。 而这个数列的形式也很容易达到。 从前往后以此在123、345、567进行
阅读全文
摘要:洛谷传送门 解题思路 这个数字很特殊,因为有一个特殊的性质: 走三步一定不会到达深度奇偶性相同的点。 也就是假设原来深度为偶数,与之距离为3的点深度一定为奇数。 于是整张图就按照深度奇偶性划分成了两部分。 第一反应就是相当于二分图染色,把两部分分别染上%3余数为1和2的颜色。 因为余数为
阅读全文
摘要:传送门 解题思路 不合法的情况只有中间有个地方相等而后面不相等。 换句话说就是中间凭空出现了Z。 其他的随便设数字就行。 AC代码 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cma
阅读全文
摘要:传送门 解题思路 对于一个数x,以在第一个排列中的位置作为关键值x,以在第二个排列中的位置作为关键值y,以值本身作为第三个关键值z。 将每个数都用一个三元组(x,y,z)表示出来。 最后答案就是满足 \(x_i<x_j,y_i>y_j,\left\vert {z_i-z_j} \right\vert
阅读全文
摘要:传送门 解题思路 数据范围很小,可以直接暴力,但是为了练习而练习,将数据范围自动扩大十倍处理。 公式不好直接求,想办法将其化作可以直接求的公式。 首先把每头奶牛按照v从小到大排序,这样保证了v这一维是有序的,从前向后枚举时,。 再去掉x这一维就需要
阅读全文
摘要:传送门 解题思路 乍一看像是构造题。 我们从简单开始想。 当有一个2*2的方格,很显然可以直接铺上。 于是我们发现,当一个矩形的1/4已经铺好后,剩下的也可以铺。 就像下图一样:(图片来源:洛谷网校) 突破点:在已经铺好的1/4的矩形正对着的位置铺一个。 就像这样: 所以可以分治处理,判断已经填好的
阅读全文
摘要:Day 0 考虑到第二天早上可以晚起并且在车上可以睡觉,我就熬到一点。。 Day 1 困死。 困死。 困死。 去的时候太乱了,睡觉失败。 到考场发现厕所水龙头都没水。 洗不了脸了。。 进考场了。 困死。 困死。 困死。 我是前几个进考场的。 发现wzm大佬竟也在我们考场! 没错,就是那个今年noi
阅读全文
摘要:传送门 解题思路 前置知识:错排问题 令 表示 个元素的错排数。则: 组合数用维护前缀和+逆元求得,错排提前预处理。 AC代码 #include<cstdio> #include<iostream> #include
阅读全文
摘要:初赛知识点整理(选择题)& 听课笔记 一、计算机基础 第一台计算机 埃尼阿克 1946 第一个程序员 Ada(女) 菲尔兹奖(数学) IEEE:美国电气与电子工程师协会 图灵奖 华人只有姚期智 艾伦·麦席森·图灵(英)ACM设立 冯诺依曼结构: 计算机组成: 主频:处理速度 内存:临时存放的东西(R
阅读全文
摘要:传送门 解题思路 分别从a、b、c三个点求单源最短路。 然后枚举两条道路相交的节点(i,j),因为是点权,所以答案为 。 注意用set进行的堆优化,要防止set丢失元素,所以要对pair的第二维(存点
阅读全文
摘要:传送门 解题思路 这题考察的实际上是对Floyd的深入了解。 我们知道,Floyd求最短路是先枚举中间点k,在枚举起点终点i和j,代表的意义实际上是从i点到j点只允许经过前k个点的最短路。 在回到这个题,T秒前只允许经过T秒前重建完的村庄,完全符合Floyd的思想。 所以做法就是T不断往后推进,然后
阅读全文
摘要:传送门 解题思路 水题一个。 数据范围可以Floyd水过去。 但是苏轼告诉我们: 守其初心,始终不变。 屈原告诉我们: 虽九死其犹未悔。 所以我用了O(n+m)的搜索。 其实这叫做双端队列广搜,碰到边权为0放到队列首,边权为1放到队列尾。 但我没学过,就用了dfs+bfs结合体水过去了。 AC代码
阅读全文
摘要:传送门 解题思路 调了一晚上。。紫题果然不是我现在能做的。。 首先考虑如何把多个deep的和转化成可以快速求出来的东西: 我们可以对于每个[l,r],把每个点到根节点的路径上的点权++(初始为0),这样对于每个询问(l,r,z),答案即为z到根节点的路径上的点权和。 操作1 但是对于每个询问都操作一
阅读全文
摘要:传送门 解题思路 和这个题几乎一样。 这里是开方,比取模进行次数更少。次数k大约为 。 AC代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algor
阅读全文
摘要:传送门 解题思路 直接用线段树维护取模是不好维护的。 而且我们发现一个数x最多取模logx次(每次大小减半),所以可以暴力取模。 维护的信息除了区间和,还有区间最大值,因为当区间最大值<模数时,此操作是无效的。 AC代码 #include<iostream> #include<cstdio> #in
阅读全文
摘要:传送门 解题思路 其实很板子。 但是我因为一开始写麻烦了又懒得修改所以出现了bug调了一节课。。。 线段树里存区间max,lmax,rmax,sum,意义跟变量名一样。 深刻体会到了pushup里采用取地址符调用的重要性。 AC代码 #include<iostream> #include<cstdi
阅读全文
摘要:传送门 解题思路 逆序对升级版。 考虑每个逆序对对答案的贡献为多少。 假设这个逆序对的坐标为(i,j),则显然有i*(n-j+1)个区间包含这个逆序对,所以对答案的贡献就是i*(n-j+1)。 和以前一样用树状数组求逆序对,需要改动的地方是新加的节点不再是+1,而是+i。 估计ans最大可能在n^4
阅读全文
摘要:传送门 解题思路 首先很显然的一种O(nlogn)做法是st表:st[i][j][0/1/2]分别存从i开始向上走2^j步到达的节点编号/有没有H奶牛/有没有G奶牛。 代码量比较复杂。 还有一种很巧妙的做法是用top[i]表示i号点的奶牛种类从i向上最高可以到达的位置。 很显然假设读入询问的为x,y
阅读全文
摘要:传送门 解题思路 每次删边复杂度太高,所以可以倒序加边。 注意在对方占领后,这个点就不参与连通块数量的计算了。 AC代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm>
阅读全文
摘要:传送门 解题思路 注意有个条件为ai互不相同。 尝试应用lxl教的套路: 第一步,将一维问题放到二维平面上:把好的配对(x,y)看做二维平面上的点。于是问题就变成了求出矩形所包含的点的个数。 第二步,利用数据结构将二维平面问题降到一维解决:离线,把询问按照右端点排序,同时把好的配对按照右端点排序,保
阅读全文
摘要:传送门 解题思路 首先判断false的情况:。 而如果i+1到j之间有没有未知降雨量的年份,则答案是maybe。 否则答案即为true。 离散化放到ST表或线段树上操作一下就行了。 情况太多了细节太多了懒得在这里写了那就说一个吧 我们常常会说
阅读全文
摘要:传送门 解题思路 直接算逆元太麻烦。 可以用线段树维护区间乘积。 需要进行单点修改和查询整个区间的乘积。 每次1操作,就把当前点修改为m; 每次2操作,就把m点修改为1。 AC代码 #include<iostream> #include<cstdio> #include<cstring> #incl
阅读全文
摘要:传送门 解题思路 单点修改区间查询最大值。 lazy标记都不需要。 总范围为读入的m的范围。 注意有负值。 AC代码 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #in
阅读全文
摘要:0.前言 谨以此记录oi生涯中最美好的时光,并以此自勉自督。 1.正文 九月 Day 1 早上终于等到了大帅(班主任)的谈话。 终于决定可以开始停课了。 虽然跟我想的有所出入(每个周要把课补上,不要落下),但还是很好啦。 快考试的时候不补课应该问题不大 完成了我的最后一项英语作业后,大约七点多来到了
阅读全文
摘要:传送门 扫描线 什么是扫描线? 在一个二维平面上有许多的点,那一根水平或者竖直的直线将其切割。 用途? 降维。 可以把二维问题转变成一维处理。 解决许多数据结构问题。 lxl的重要思路:一维问题 >二维平面 >扫描线降维。 应用条件? 离线。 实现? 线段树或者树状数组。 树状数组常数比较小所以:区
阅读全文
摘要:传送门 解题思路 经典题的加强版。 根据数据范围得出需要O(n)解决这个问题。 至少要进行一次排序,而且数字<=1e5,所以很显然可以桶排。 然后用两个队列(注意不是优先队列),一个是存原数,一个存和。 每次取出两个队列中前二的两个数字,然后加起来放到第二个队列的队尾即可。 易证两个队列里面的数都满
阅读全文
摘要:传送门 解题思路 设dp[i][j]为吃掉派[i,j]的最大收益。 枚举中间点k进行转移,表示k这个派没被吃掉。 dp[i][j]=max(dp[i][k-1]+dp[k+1][j]+maxx[k][i][j]); 其中maxx[k][i][j]表示奶牛的喜欢吃的区间[l,r]符合i<=l<=k<=
阅读全文
摘要:传送门 解题思路 dp[i][j][k]表示从第i秒开始走走j秒从k工厂开始走的收益 maxx[i][j]表示从第i秒开始走j秒的最大收益。 则转移方程为: dp[i][j][k]=dp[i+1][j-1][(k+1)%n]+value[k][i]; maxx[i][j]=max(dp[i][j][
阅读全文
摘要:传送门 解题思路 很经典的区间dp问题。 我们可以发现删除和添加本质上是一样的。 所以可以直接对删除费用和添加费用取min。 跑一遍区间dp即可。 注意在读入string时,不能一位一位读,会RE。 正确的处理方法是直接cin>>S,或者用char数组代替string。 AC代码 #include<
阅读全文
摘要:传送门 解题思路 第一步,求出从每个墙壁开始刷是否合法。 第二步,合法的墙壁位置作为每个区间的左端点,变成区间覆盖问题。 第二步很显然是个贪心,重点是第一步如何解决。 我们设dp[i][j]表示从第i个墙壁第j个承包商开始刷能刷的墙壁的数量。 那么 当第j个承包商能刷第i个墙的时候,dp[i][j]
阅读全文
摘要:传送门 解题思路 重要思想:求 相当于是取两遍球,取出来的序列相同的方案数。 于是设dp[i][j][l][r]表示第一次取上下分别取i/j个,第二次取上下分别取l/r个,两次取出相同序列的方案数。 转移就判断s1[i]/s2[j]和s1[l]/s2[r]之间的相等关
阅读全文
摘要:传送门 斜率优化 当求dp[i]最小值时,满足一次函数 其中 y=dp[j] ,k 与 i 有关,x 与 j 有关,b中包含 dp[i]。 这时问题就可以转化为 在众多点(x,y)中找到一个点使得用斜率为k的直线切这个点时得到的截距b最小。很显然这时dp[i]从这个点转移过来最
阅读全文
摘要:传送门 解题思路 设dp[i][j]表示用前i个数,第一段山脉的高度为j,且j为山峰的方案数。 首先发现,dp[i][j]=dp[i][i-j+1],相当于把每个数取了个相反数,原来的山峰变山谷,山谷变山峰,方案数不变。 然后状态转移: j和j-1不相邻时:dp[i][j]=dp[i][j-1] 因
阅读全文
摘要:传送门 解题思路 设dp[i][j][k]为到前i行,有j列放了1个炮,k列放了两个炮的方案数。 显然讨论各种情况,从i-1进行转移即可。 可以滚动数组,但没必要。 一个不放:方案数等于dp[i-1][j][k]。 放一个,放在原来一个没有的列上:方案数等于dp[i-1][j-1][k]*(m-(j
阅读全文
摘要:传送门 解题思路 洛谷第一篇题解写的非常清楚 总结一下关键点,在图上求类似的期望步数,通常设计状态为dp[i]表示从i号点走到i+1号点的期望步数。 AC代码 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip
阅读全文
摘要:传送门 解题思路 题意很简单,就是一个有特殊条件的01背包: 物品的体积很大,并且可以写成 的形式。 肯定是从这种特殊限制入手考虑,而且很容易想到按照二进制位分开做。 我们设 表示对体积表示为 的物品进行01背包
阅读全文
摘要:传送门 多重背包 学了这么多年oi竟然只知道二进制拆分做法,白学了 多重背包就是每个物品有个数限制的01背包。 怎么做呢? 最暴力的是把每个物品拆成m[i]个物品,做01背包。 这样时间显然会爆炸。 二进制拆分优化 于是可以利用二进制性质,拆的时候打个包。 对于每种物品来说,每 \(1,2,4…2^
阅读全文
摘要:传送门 解题思路 对每一段时间进行操作,dp[i][j][k]表示在第k次操作结束时在位置(i,j)上的最大收益。 首先k这一维可以滚动数组优化掉。 然后对每个方向进行分类讨论,再对每一行/列加上一个单调队列优化即可。 注意碰到障碍就把队列清空,单调队列里的权值是dp值加(或者减)行数(或者列数)。
阅读全文
摘要:传送门 解题思路 很显然的一个线性dp,设dp[i][j]为到第i行第j列的最大power。 可以从前一行dp[i-1][j-t]~dp[i-1][j+t]转移过来。 用单调队列优化一下即可。 防止MLE可以用滚动数组优化,然后k个P点用二维map存一下。 注意: 不能直接 dp[j][now^1]
阅读全文