[Atcoder Regular Contest 061] Tutorial】的更多相关文章

Link: ARC061 传送门 C: 暴力$dfs$就好了 #include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,res=; ],cnt; void dfs(int dep,ll sum) { if(dep==cnt){res+=sum;return;} ;i<=cnt;i++) { ll t=; ;j<=i;j++) t=t*+dgt[j]; dfs(i,sum+t); } } int…
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有方案的数字和. 思路 \(2^{|S|-1}\)枚举加号的放置状态 代码 Many Formulas D.Snuke's Coloring 题意 在一个\(H \times W(3 \le H,W \le 10^9)\)的棋盘上,有\(N(N \le 10^5)\)个格子被染成黑色,其余格子为白色.…
http://arc061.contest.atcoder.jp/tasks/arc061_b 题意: H行W列的矩阵中,然后挖了n个洞,输出j(0-9)行,对于第i行输出,有多少个3*3区域中有i个洞: 思路: 对于一个黑色的格子,只有9个3*3的矩阵才能包含他. 所以只有处理m个黑格子就行了. 对于每个黑格子,我默认把3*3的左上角代表这个矩阵. 这样还不够,因为没有那么大的矩阵表示方法,所以换一个表示就是把矩阵中每个格子标记: 处理一下,最后输出就好了: #include <bits/st…
Link: ARC060 传送门 C: 由于难以维护和更新平均数的值: $Average->Sum/Num$ 这样我们只要用$dp[i][j][sum]$维护前$i$个数中取$j$个,且和为$sum$的个数 最后统计$dp[n][k][k*a]$即可 这样就得到了$O(n^4)$的解法 #include <bits/stdc++.h> using namespace std; typedef long long ll; ; int n,a,sum,dat[MAXN]; ll dp[MAX…
洛谷题面传送门 & Atcoder 题面传送门 首先考虑合法的排列长什么样,我们考虑将每次操作者的编号记录下来形成一个序列(第一次 A 操作不计入序列),那么显然这个序列中必须恰好含有 \(n\) 个 A,且最后一个必须是 A.那么显然一个合法的取卡片方案唯一对应一个操作序列,而一个长度为 \(l\) 的操作序列恰好对应 \(3^{n+m+k-l}\) 个合法的取卡片方案(证明?就每次下一轮执行操作的人是谁就在对应的操作者所取的卡片上写啥,那么显然对于长度为 \(l\) 的操作序列而言,在原卡片…
Link: ARC065 传送门 C: 最好采取逆序贪心,否则要多考虑好几种情况 (从前往后贪心的话不能无脑选“dreamer”,"er"可能为"erase"/"eraser"的前缀) #include <bits/stdc++.h> using namespace std; string s; int main() { cin>>s; for(int cur=s.size();cur;) &&s.subs…
Link: ARC064 传送门 C: 贪心+对边界的特殊处理 #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ll res=; int n,x,dat[MAXN]; int main() { scanf("%d%d",&n,&x); ;i<=n;i++) scanf("%d",&dat[i]); ]>x) res+=dat[]…
Link: ARC063 传送门 C: 将每种颜色的连续出现称为一段,寻找总段数即可 #include <bits/stdc++.h> using namespace std; ,len; ]; int main() { scanf();len=strlen(s+); ;i<=len;i++) ]) cnt++; printf(); ; } Problem C D: 可以发现对于每一个点的最优解$res_i$为: $max(w_j)-w_i(j>i)$ 找到最小的$res_i$的个…
Link: ARC 062 传送门 C: 每次判断增加a/b哪个合法即可 并不用判断两个都合法时哪个更优,因为此时两者答案必定相同 #include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,a,b,x,y; int main() { scanf("%lld%lld%lld",&n,&a,&b); ;i<=n-;i++) { scanf("%lld%…
具体题解又要搬大哥的了,嘿嘿~ 请点击:G点我 这道题目的难点就是同一家公司的路直接走不需要再花费,然后多了一个公司这个东西,这个不像是边的副权值(瞎说的)之类的东西,这是对于路来说的,路的属性... 其实稀里哗啦说了那么多,真的觉得这个方法实在是太棒了: 将点和公司组合构造新点,然后新点的路我们可以构造,根据题意,同一家公司的路不需要花费即(u,c)<=>(v,c)之间距离=0: 然后u到(u,c)是1,v到(v,c)是1,建双向边. 这可以解决的是同一家公司的路不花费,把点边点根据题意拆分…