0%

思路讲解

$(x+k) + (y+k) = (x+k)\oplus (y+k) $ 等价于 $ (x+k)&(y+k)=0,其实就是不允许,其实就是不允许x+k$和 y+ky+k 这位都是 11 的情况。

image

然后呢,这种题虽然主要的思想是按位分析,但是还是需要构造的,而且不要试图构造一些不特殊的,而是构造一些特殊的(如上所示)。

AC代码

https://codeforces.com/contest/2085/submission/318796295

心路历程(WA,TLE,MLE……)

之前陷入了错误思路中,认为是要按位分析,然后通过给每位+1避免出现11现象,其实这是很难的,因为进位会互相影响。

思路讲解

题意就是所有点只能经过一次(选择一次),构造出字典序最大的 (dis,u,v)(dis,u,v) 序列,输出这个序列。

注意到,距离是放在第一位的,所以我们肯定优先选择距离最大的。那在树上路径距离最大的是什么?树的直径呗。不过这个树的直径的取法需要优先选择大的起始点和终止点。

然后删除直径后,这张图就不联通了,只要在每个子图中我们遵循这种删除规律即可,最后形成的 ans 数组根据字典序规则排序即可。

以下是样例五的图示展示,第一层删完后,变为了两个子图,这两个子图仍然按照规则选择直径,删除直径上的点,整张图被删完后程序结束。

image

时间复杂度分析

枚举总量为 n+(nl1)+(nl1l2)++(nlclil1)n+(n-l_1)+(n-l_1-l_2)+\cdots+(n-l_c-\cdots-l_i-\cdots l_1),即 n×cl1×cl2×(c1)lcn\times c -l_1 \times c-l_2 \times (c-1)-\cdots-l_c,也就是,其中 nn 为点的数量,lil_i 为第 i 层的直径总数,c 为总层数。枚举总量在逐层下降是因为每层选择的直径上的点会被删除。

n 是给定的,那么我们假设 c 最大,那么 c 最大的情况是什么呢?

c 最大的情况,就是我们每层只能删除一条直径,也就是说该图在删除直径的过程中一直保持着联通状态。把层数卡满的图可以这样构造,注意到,分枝直径的点的数量直径的点的数量/2分枝直径的点的数量≤\lfloor直径的点的数量/2\rfloor,如果大于这个限制,该分枝就要被删除了。

image

那么近似的,我们可以得到。

x+x2+x22++x2c=nx+\frac{x}{2}+\frac{x}{2^2}+\cdots+\frac{x}{2^c}=n

由于x2c\lfloor\frac{x}{2^c}\rfloor必须大于 00,我们知道 2cx<2c+12^c≤x<2^{c+1}

那么不妨令 x=2c+1x=2^{c+1}

2c+1+2c++2=n2^{c+1}+2^c+\cdots+2=n

运用等比数列求和公式。

2×(2c+11)=n2\times(2^{c+1}-1)=n

因此,clog(n)c\approx \log(n)

故该算法的总体时间复杂度为O(nlogn)O(nlogn)

AC代码

https://codeforces.com/contest/2107/submission/318737306

心路历程(WA,TLE,MLE……)

思路讲解

唉,dp,你说没想到吧,也想到了一点,但没往下深想。

唉,主要想错了,这个行和列是相互独立的。

其实就是出现两者之间相差一的情况,那么这个比较小的列就无法加一了。

image

但其实上面这个说法不全面,导致我的算法设计有瑕疵,比如说下面这个例子

1
2
3
4
5
6
7
8
9
1
4
3 1 1 3 3 2 4 2
4 5 4 5 -> 4 6 -> 5 6
3 1 3 5 3 2 4 2
4 3 2 1 4 4 5 4
5 1 5 2
4 9 1 9

不难发现,上面这个例子还有可能传递,如第 nn 列需要 +1+1 但是和第 n1n-1 列相同了,所以第 n1n-1 列也需要 +1+1 ,但 n1n-1 列和第 n2n-2 列相同了……。

当然,上面说了这么多,其实意思只有一个,就是不能以需要操作的行和列为主体,而应该以所有列为主体,因为操作行和列的操作可能导致其他行和列也需要操作。

不过,我们也发现行和列能怎么操作也只和相邻的行和列相关,那么如果按顺序转移也是可以的。

状态定义如下所列。

1
2
3
// dpC[i][0] 表示保留第i列所需的最小花费
// dpC[i][1] 表示对第i列+1所需的最小花费
ll dpC[MAXN][2],dpR[MAXN][2];

转移只要确定是否合法其实就很简单了。

AC代码

https://codeforces.com/contest/2096/submission/318683142

心路历程(WA,TLE,MLE……)

思路讲解

赛时差一点想到AC,主要是needVal为负数的情况没有想到(减着减着变负数了)

其实只改一个数就行,其他数全部赋为-INF。

AC代码

https://codeforces.com/contest/2107/submission/318579760

心路历程(WA,TLE,MLE……)

思路讲解

1
2
3
4
// 要求你构造一个数组,符合A中的要求,如果A[1]=1,那么就说明这个
// 构造数组中的这个元素需要于第一次操作时去除。A[2]=-1,说明第二个元素被剩下了。
// 奇数次操作只留下局部最小值,偶数次操作只留下局部最大值(严格)。

AC代码

https://codeforces.com/contest/2103/submission/318747498

心路历程(WA,TLE,MLE……)