部分在标签里面
AGC012B
水题但居然没想出来,主要是没看全各变量的数据范围。
法1是以距离为阶段,进行 更新每个点对应扩张距离的最小时间戳。
法2时光倒流,每一步直接覆盖未覆盖点,dfs的轨迹可近似一棵叶子为未覆盖点的子树。
复杂度
ARC080E
最后操作即答案序列开头的两个数,一定一个下标在奇数另一个在偶数,贪心取值最小的位即可。
这样分成了三个子区间,然后不断迭代。具体用堆维护。
ARC080F
区间翻转,即区间异或,差分后相当于异或两个位置。
由于哥德巴赫猜想:任意大于二的偶数可以拆成两个质数的和。
可以分讨为:差为奇质数(),偶数(),奇非质数()。
从到贪心尽量多匹配。
ARC081E
建出子序列自动机,在上面按字典序bfs,找到第一处空节点即为答案。
当然从后往前dp也行。
ARC081F
一个矩形能翻转为全黑,取其中某点,将行和列上为的翻转,此后不能再操作,可求最大全矩形。
上面只是一种构造,总不能真的去翻转行列,转化为代数,最终值为 ,即矩形内每点满足 ,这四个量好似矩形的四个角,则每个子矩形四角异或和为,可以拆成若干小矩形异或和。因此判定就跟无关了。接着可用悬线法求最大矩形(每点往左最远,往右最远,往上最远,保证每个极大矩形被更新到)
ARC083E
由于是有关子树的信息,可以考虑儿子的 与之之间的关系,设表示子树内异色点权和。
注意是可以自由钦定的,所以对于一个子树固定,需要让尽量小。
这样就可以背包了,容积为,值最小,如果一个结点对应 更新不到那就impossible
。
ARC085F
设每个位置值从变对答案的贡献为,求前缀和为。
设最后一次覆盖区间的最小答案为。按右端点排序就可以求了,转移分不交和相交,线段树优化。
ARC086E
每层独立,且最后贡献为。每层点建虚树,在其上面dp,表示字数内点最后贡献为的方案数。
ABC082D
蓝题但没想出来。
考虑每次转向,如果T
个数为奇数垂直方向,否则水平方向走。
因此操作变为了若干步数和方向(x or y?),因此x和y轴相独立,dp会MLE,用bitset来优化。
ARC156D
两个字符串的限制很难处理,先退化为开头字符的大小关系。
按小到大连边,如果存在环,则一定有相等的位置,缩点。限制就往后移位继续连边。
ARC156E
第一步和ARC150D一样,在所在连通块 的点中选,扩张到在未删的所有点中选(选出来后再判断合法)和原问题结果等价。因为满足连通块 的有意义的每个点被选的概率等价,而其余无意义点选中也无影响。
ARC150D之后就利用期望线性性,答案为每个点被选中的期望次数求和。
这里求的是删点次数,而每个过程中存在的 的连通块都会被删一次 (贡献答案次),所以可以求 连通块出现概率和。
连通块出现要保证外圈必须要删的点(个),全都要在联通块内的点(个)之前出现,当然其它的点就一点也不影响了,所以概率是,由于是连通块信息求和,树上背包,解决。
ARC165F
结论:若 且 , 一定在 之前。否则包含关系,谁前谁后答案一样。
不会证明ing~
所以偏序建图,按字典序拓扑排序,复杂度 。
考虑线段树优化建图:按 从大到小扫描线,维护以 为下标的线段树,相当于连向 一段后缀区间,而新添加的 不能影响之前的连边,所以要可持久化一下。
ARC058E
,可以想到状压。从前往后加每个数且维护状态:初始为,每加入一个数,就在后面加上位的,只需要截取前位,这样也可以判断题目中的段是否出现过。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
ll f[45][1 << 17];
void Add(ll &x, ll y) {x = (x + y) % mod;}
ll ksm(ll a, ll b) {ll res(1); for(; b; b >>= 1, a = a * a % mod) if(b & 1) res = res * a % mod; return res;}
int main() {
int n, X, Y, Z, all, end;
scanf("%d%d%d%d", &n, &X, &Y, &Z);
end = (1 << (Z - 1)) | (1 << (Z + Y - 1)) | (1 << (X + Y + Z - 1));
all = (1 << (X + Y + Z)) - 1;
// printf("!end=%d all=%d\n", end, all);
f[0][0] = 1;
for(int i = 1; i <= n; i++) {
for(int s = 0; s <= all; s++) {
// printf("f(%d,%d)=%lld\n", i - 1, s, f[i - 1][s]);
if(!f[i - 1][s]) continue;
for(int j = 1; j <= 10; j++) {
int s_ = (s << 1 | 1) << (j - 1);
s_ &= all;
if((s_ & end) != end) {Add(f[i][s_], f[i - 1][s]);}
// printf("!f(%d,%d)=%lld %lld\n", i, s_, f[i][s_], f[i - 1][s]);
}
}
}
ll ans = 0;
for(int s = 0; s <= all; s++) {Add(ans, f[n][s]);}
printf("%lld", (ksm(10, n) - ans + mod) % mod);
return 0;
}
ARC093E
先求出 。所有染色的最小生成树:一定是原 或者原 加入一条新边,删去一条原边所得。
先令 同色,然后把其它非树边分为使值 ,,。
的部分一定与原 相同,的部分至少要存在一个与 原 不同,其余随便填色。
特别的 ,原 可存在两种颜色。
ARC094F
关键的转化:把 , , 看成 , , ,发现总和模 意义下不变,而且模 为定值的条件还是充分的,DP即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2021-08-16 kruskar重构树