ARC 170_A 题解】的更多相关文章

ARC 122 简要题解 传送门 A - Many Formulae 考虑对于每个数分别算其贡献. 通过枚举该数前面的符号,借助一个非常简单的 \(\mathrm{DP}\)(\(f_{i,0/1}\) 表示 \(i\) 个符号,最后一个符号为 \(+/-\) 的方案数),我们可以很轻松的求出一个数对最终答案的贡献. 总时间复杂度为 \(O(n)\). /*---Author:HenryHuang---*/ #include<bits/stdc++.h> using namespace std…
首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次数为 \(x\),表示节点实际上被选择的次数是父亲被选择的次数 \(+x\).显然,这个 \(x\) 是小于等于 \(D\) 的.分析这样我们发现,选择了一个节点实际上对应子树内的所有节点的选择次数均增加,所以我们重新定义选择一个节点的价值为子树内(含自身)节点的个数,而代价则是子树内所有代价的总和…
再次膜拜此强题!神级性质之不可能发现系列收藏++:首先,对于长度<=3的情况,我们采取爆搜答案(代码当中是打表).对于长度>=4的情况,则有如下几条玄妙的性质: 首先我们将 a, b, c 三个字母看做 0, 1, 2.发现(不知道怎么发现的)当我们做出一次变换之后,数列的和在模意义下是不改变的.(*启示:很多关系好像都和取模之后的某些东西有关,例如食物链,此题,and so on). 那么:当一个序列 T 可以由 S 转化过来时,T必须满足如下几条性质: 1.T的各位字母之和与S的各位字母之…
点我看题 题目质量一言难尽(至少对我来说 所以我不写D的题解了 A - mod M 发现如果把M选成2,就可以把答案压到至多2.所以答案只能是1或2,只要判断答案能不能是1即可.如果答案是1,那么M必须是所有任意两个数的差的GCD的因子,只要检查这个GCD是否是1即可.实现的话之间取所有相邻两个数的GCD就行了. 时间复杂度\(O(nloga_i)\). 点击查看代码 #include <bits/stdc++.h> #define rep(i,n) for(int i=0;i<n;++…
点我看题 A - Max Mod Min 非常诈骗.一开始以为要观察什么神奇的性质,后来发现直接模拟就行了.可以证明总操作次数是\(O(nlog a_i)\)的.具体就是,每次操作都会有一个数a被b取模,然后变成a%b.注意到a%b是\(\leq \frac a2\)的,并且a被操作之后会变成整个数据最小的数,作为下一轮的b.所以把原数组排序后,最小值的位置是不断往左移的,每次移动1个位置,直接模拟即可. 时间复杂度\(O(nlog a_i)\). 点击查看代码 #include <bits/s…
题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据的节点集合不可能相同,因为在这两种走法中,节点i必有两个子树中的棋子数量不同.所以,题目中的"被占据的集合唯一"等价于"每个棋子走向的节点唯一". 根据题意,一个初始状态合法当且仅当这个状态可以进行任意次操作,且进行k步操作后,接下来一步操作唯一(不管这样走之后,是否还…
点我看题 昨天刚打的ARC,题目质量还是不错的. A - Equal Hamming Distances 对于一个位置i,如果\(S_i=T_i\),那么不管\(U\)的这个位置填什么,对到\(S\)和\(T\)的海明距离增量都是相同的,所以这种位置一定填\(0\)更好:否则,这个位置填\(0\)或\(1\)分别可以给到\(S\)或到\(T\)的海明距离增加1,所以满足\(S_i=T_i\)的i的个数必须是偶数,否则一定无解.令这样的i的个数为x.从左到右遍历所有这样的i,尽量把\(U_i\)填…
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: 为什么加椅子?我们可以在最左边或最右边一直加直到人人都有座位. 首先这道题目抽象成二分图很简单,然后我们可以只要求解出人与座位的最大匹配是多少,总人数减去即可,但跑二分图最大匹配显然会超时,我们就可以往霍尔定理方面想. 然后你还需要知道一个霍尔定理推论:假设某个人的集合为\(X\),这个集合所对应的…
觉得我的解法好简单,好优美啊QAQ 首先想想暴力怎么办.暴力的话,我们就枚举左右端点,然后显然每张购物券都取最大的值.这样的复杂度是 \(O(n ^{2} m)\) 的.但是这样明显能够感觉到我们重复计算了很多东西,因为区间 \((l, r)\) 的答案与区间 \((l + 1, r)\) 的答案并不是独立的. 我们可以考虑一下扫描线的做法.用一根扫描线从右往左扫左端点,同步维护所有以 \(l\) 为左端点的区间.由于我们现已经求出了所有以 \(l + 1\) 为左端点的区间答案(这里的答案指从…
……没啥可说的.最大权闭合子图,跑下dinic就好了…… #include <bits/stdc++.h> using namespace std; #define maxn 500000 #define int long long #define INF 99999999999LL int n, sum, S, T, lev[maxn]; int read() { , k = ; char c; c = getchar(); ; c = getchar(); } + c - ', c = g…