Codeforces 1149 题解

A

特判全是 \(2\),对于有 \(1\) 的情况把 \(1\) 放到第二个和最后。

时间复杂度 \(O(n)\).

代码: 76492031

B

考虑只有一次询问的情况,有一个 \(O(n^3)\) 的 DP,设 \(f[i][j][k]\) 表示三个串分别匹配到 \(i,j,k\),大串最短匹配到哪。转移形如 \((i,j,k)\rightarrow (i+1,j,k),(i,j+1,k),(i,j,k+1)\).

有修改相当于给某一维 \(+1\) 或 \(-1\),显然影响到的 \((i,j,k)\) 只有 \(O(L^2)\) 个,直接改即可。(\(L\) 为 \(A,B,C\) 串长度)

时间复杂度 \(O(n|\Sigma|+qL^2)\).

代码: 76579067

C

显然问题就相当于选择三个数 \(i,j,k\) 满足 \(0\le i\le j\le k\le n\),最大化 \(s_i-2s_j+s_k\) (\(s\) 为前缀和),修改的形式为区间加或减 \(2\).

线段树经典题。直接线段树维护 \(s_i\), \(-s_j\), \(s_i-2s_j\), \(-2s_j+s_k\), \(s_i-2s_j+s_k\) 的 \(\max\) 即可。

时间复杂度 \(O(n+q\log n)\).

代码: 76672305

D

由于边权只有两种,我们需要考察的状态显然是仅加入 \(a\) 边之后的连通状态。

考虑一条从 \(1\) 到 \(p\) 的路径,为了满足最小生成树的限制,我们仅仅需要满足路径上不出现“从某个连通块出来又重新进去”这种事情。

有一个显然的状压 DP,设 \(f[s][u]\) 表示经过的连通块集合为 \(s\),现在处于点 \(u\). 其实严格来讲这是一张图,需要在上面跑最短路(因为需要处理 \(s\) 相同 \(u\) 在同一连通块内的转移)。

问题是连通块个数太多了。一个很自然的想法是大小为 \(1\) 的连通块可以用一些手段缩去,但这还不够。事实上,大小不超过 \(3\) 的连通块都是不需要记录进 \(s\) 中的。因为如果从这个连通块里出去再回来至少要花费 \(2b\) 的代价,而这个连通块内任何两点的距离不超过 \(2a\).

因此 \(s\) 只需要记录大小 \(\ge 4\) 的连通块是否经过过的状态。这样的连通块最多只有 \(\frac{n}{4}\) 个。

时间复杂度 \(O(2^{\frac{n}{4}}m)\).

代码: 76698798

E

结论:设 \(f(u)=\text{mex}_{v\in out[u]}f(v)\),则可以把每个点表示为 \(a_k\omega^{f_k}\),就相当于一个只有第 \(f_k\) 个位置为 \(a_i\) 其余都为 \(0\) 的数组(这里的 \(\omega\) 在博弈论里还有一些其他的神奇意义),则先手胜当且仅当对于每个位置,所有的点的异或和均为 \(0\) (即 \(\forall i,\bigoplus_{f[u]=i}=0\)).

证明详见官方题解。

代码: 76707873

原文地址:https://www.cnblogs.com/suncongbo/p/12702242.html

时间: 2024-10-11 08:13:39

Codeforces 1149 题解的相关文章

CodeForces Dubstep 题解

Vasya works as a DJ in the best Berland nightclub, and he often uses dubstep music in his performance. Recently, he has decided to take a couple of old songs and make dubstep remixes from them. Let's assume that a song consists of some number of word

codeforces Towers 题解

Little Vasya has received a young builder's kit. The kit consists of several wooden bars, the lengths of all of them are known. The bars can be put one on the top of the other if their lengths are the same. Vasya wants to construct the minimal number

codeforces 1296 题解(更新中)

codeforces 1296 题解 A. Array with Odd Sum 想要数组加和为奇数,可以从数组长度是奇数还是偶数着手 若数组长度为偶数,则数组全奇或全偶必定不能构造满足题目要求的数列 若数组长度为奇数,则数组全偶必定不能构造满足题目要求的数列 #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; #define _for(i,a,b) for(int i =

codeforces 1303 题解(更新中)

codeforces 1303 题解 A. Erasing Zeroes 想让字符串中的 \(1\) 连续,而我们能做的只有删 \(0\) ,则需要删去除开头以及结尾外的 所有 \(0\) 块.所以从头扫一遍统计开头 \(0\) 块,从尾扫一遍统计结尾 \(0\) 块,再用 \(0\) 的数量减去这两部分即可,可能为负所以跟 \(0\) 取最大值. 时间复杂度 \(O(n)\) #include <bits/stdc++.h> using namespace std; typedef long

codeforces#536题解

CodeForces#536 A. Lunar New Year and Cross Counting Description: Lunar New Year is approaching, and you bought a matrix with lots of "crosses". This matrix \(M\) of size \(n \times n\) contains only 'X' and '.' (without quotes). The element in t

CodeForces 281 题解

A题: 题意:给出按照时间顺序的比赛记录,比赛记录了哪一分钟有哪位球员得到了黄牌或红牌,输出罚下的人的序列. 题解:直接按照时间读入模拟就可..注意坑在有可能一位球员罚下后又得到黄牌或红牌,这时候不应再输出这个人了. B题: 题意:给出两个摔跤选手每个动作的得分,正数为第一个人得分负数为第二个人得分,总分高者胜,若相同则“字典序”较大的获胜,再相同则最后得分的人获胜. 题解:直接模拟就可..要用long long.. C题: 题意:两个队伍篮球比赛,给出每个队伍投进的每个球距离球框的距离,现在要

codeforces - 448C 题解

题意:给定一个栅栏,每次涂一行或者一列,问最少几次能够涂完 题解:分治算法+DP思想,每次的状态从竖着涂和横着涂中选择,同时向更高的部分递归计算. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<climits> 5 using namespace std; 6 int a[5001]; 7 int f[5001][5001]; 8 void cal(int l

codeforces - 148E 题解

题目大意:一个公主有一个摆满瓷器的架子,她生气的时候就要打碎m个瓷器.这个架子有n层,每层的瓷器每次只能从最左边拿或者从最右边拿,问打碎的瓷器的最大价值. 题解:这是一个泛化物品+分组背包的DP,首先将每一层上拿出瓷器的方案作为一个物品,拿出瓷器的方案的代价是瓷器数量,价值是这一层上所有方案中最大的价值. 首先为了计算方案的时候可以快速计算,我们在读入的时候就计算出前缀和sum,然后在计算方案的时候,每一层上打碎的数量对应一个物品,然后枚举总数量分配到两侧打碎的价格,得到最大价值.最后使用分组背

Codeforces 985B 题解

题意 有$n$个开关和$m$盏灯,给定一个矩阵$a(a_{i,j}\in [0,1])$,若$a_{i,j}=1$则说明开关$i$与第$j$盏灯连接.初始时所有灯都是关闭的.按下某开关后,所有与这个开关连接的灯将会打开,已经打开的不会关闭. 现在你需要去掉一个开关,使得按下剩余$n-1$个开关后,所有灯都可以打开.若存在方案,则输出YES,否则输出NO. 题解 直观的想法为,枚举去掉的开关$i$,然后枚举每个与开关$i$相连的灯$j$,若存在一个$j$只能靠开关$i$打开(即矩阵第$j$列只有第