补题链接:Here

A - Keyboard

签到,S 为 Y 则输出大写 T,不然则原样输出 T

int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
char s, t;
cin >> s >> t;
cout << (char)(s == 'Y' ? toupper(t) : t);
return 0;
}

B - Futon

对于每个.我们只考虑向右和向下能不能放置即可,这样计数便不会重复。

int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int n, m;
cin >> n >> m;
vector<string> s(n);
for (auto &c : s) cin >> c;
int cnt = 0;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
if (s[i][j] == '.') {
if (i + 1 < n && s[i + 1][j] == '.') cnt++;
if (j + 1 < m && s[i][j + 1] == '.') cnt++;
}
cout << cnt << "\n";
return 0;
}

C - Neq Min

维护一个a[]和当前答案t,来一个数就添加一个数,答案输出当前 t 即可。

int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int n, t = 0;
cin >> n;
int a[200010] = {0};
for (int i = 1, x; i <= n; ++i) {
cin >> x;
a[x] = 1;
while (a[t]) t++;
cout << t << "\n";
}
return 0;
}

D - Squares

大佬题解另一位大佬的题解

方法非常巧妙投影,举体解释可以参考上述题解。

如果两个正方形在二维平面内相交,那么将两个正方形投影到x轴上会出现两条线段,这两条线段一定相交,同理投影到y轴也一定相交。

由上述性质不难看出我们只需要计算两条线段相交或者不相交的方案数,这个是非常容易的可以参考上述题解的方法。

那么最后答案一定是:X轴不相交的方案数(Y轴随意)+ X轴相交但是Y不相交的方案数

或者是:总方案数− X 轴相交且Y轴相交的方案数

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
using ll = long long;
int main() {
ios_base::sync_with_stdio(false), cin.tie(0);
int T = 1;
ll N, A, B;
for (cin >> T; T--;) {
cin >> N >> A >> B;
ll C = N - A + 1, D = N - B + 1, E = N - A - B;
ll f = E < 0 ? 0 : (E + 2) * (E + 1) / 2 % mod;
ll ans = 4 * f * (C * D % mod - f) % mod;
cout << (ans + mod) % mod << '\n';
}
return 0;
}

D题非常数学,这个投影的方法还是非常巧妙的,学习了

E - Lamps

这道题TLE了,然后虚拟赛后才发现做个预处理就能A了

不难想到要单独考虑每一个.点最答案的贡献

不妨设.的数量是cnt

如果 g[i][j]=='.'那么考虑什么情况下对答案有贡献?如果能够点亮该点的点数量是 w 那么最终这个点对答案的贡献即是 \((2^w-1)*2^{cnt-w}\) ,只要能点亮该点的一个点点亮即可,不能控制该点的随意。

然后预处理每个点能由多少个点点亮即可。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e3 + 10;
const ll mod = 1e9 + 7;
char g[N][N];
int n, m, w[N][N];
ll base[N * N];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> g[i] + 1; int cnt = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) cnt += (int)g[i][j] == '.';
base[0] = 1;
for (int i = 1; i <= cnt; i++) base[i] = base[i - 1] * 2 % mod;
// 预处理数组
for (int i = 1; i <= n; i++) {
int j = 1;
while (j <= m) {
while (g[i][j] == '#') j++;
int now = 1, k = 1;
while (j + k <= m && g[i][j + k] == '.') now++, k++;
for (int p = j; p < j + k; p++) w[i][p] += now;
j = j + k;
}
}
for (int i = 1; i <= m; i++) {
int j = 1;
while (j <= n) {
while (g[j][i] == '#') j++;
int now = 1, k = 1;
while (j + k <= n && g[j + k][i] == '.') now++, k++;
for (int p = j; p < j + k; p++) w[p][i] += now;
j = j + k;
}
}
// 计算答案
ll res = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (g[i][j] == '#') continue;
int now = w[i][j] - 1;
res = (res + (base[now] - 1) * base[cnt - now] % mod) % mod;
}
}
cout << (ll)(res + mod) % mod << '\n';
return 0;
}

F题随缘补...HHKB Programming Contest 2020

HHKB Programming Contest 2020 补题记录(D题投影,E题预处理节省时间)的更多相关文章

  1. 2021.7.27--Benelux Algorithm Programming Contest 2020 补提

    I Jigsaw 题目内容: 链接:https://ac.nowcoder.com/acm/contest/18454/I 来源:牛客网 You have found an old jigsaw pu ...

  2. HHKB Programming Contest 2020【ABCE】

    比赛链接:https://atcoder.jp/contests/hhkb2020/tasks A - Keyboard 代码 #include <bits/stdc++.h> using ...

  3. HHKB Programming Contest 2020 D - Squares 题解(思维)

    题目链接 题目大意 给你一个边长为n的正方形和边长为a和b的正方形,要求把边长为a和b的正方形放在长度为n的正方形内,且没有覆盖(可以相邻)求有多少种放法(mod 1e9+7) 题目思路 这个思路不是 ...

  4. M-SOLUTIONS Programming Contest 2020 题解

    M-SOLUTIONS Programming Contest 2020 题解 目录 M-SOLUTIONS Programming Contest 2020 题解 A - Kyu in AtCode ...

  5. Atcoder Panasonic Programming Contest 2020

    前三题随便写,D题是一道dfs的水题,但当时没有找到规律,直接卡到结束 A - Kth Term /  Time Limit: 2 sec / Memory Limit: 1024 MB Score ...

  6. Yahoo Programming Contest 2019 补题记录(DEF)

    D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...

  7. Social Infrastructure Information Systems Division, Hitachi Programming Contest 2020 D题题解

    将题意转换为一开始\(t = 0\),第\(i\)个操作是令\(t \leftarrow (a_i + 1) t + (a_i + b_i + 1)\).记\(A_i = a_i + 1, B_i = ...

  8. Social Infrastructure Information Systems Division, Hitachi Programming Contest 2020 C题题解

    首先,我们将题目理解成若\(i\)与\(j\)距离恰好为\(3\),则不可能\(p_i \equiv p_j \equiv 1 \space or \space 2 (\bmod 3)\).这就相当于 ...

  9. The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored E.Sequence in the Pocket(思维题)

    传送门 题意: 给出一个序列,你可以将任意一个数移到最前面: 求最少需要移动多少次,可以是此序列变成非递减序列: 思路: 定义 (ai,aj) 为逆序对 ( i < j , ai > aj ...

  10. atcoder Keyence Programming Contest 2020 题解

    比赛地址 A 题意:给一个\(n*m\)的初始为白色的矩阵,一次操作可以将一行或一列染成 黑色,问至少染出\(k\)个黑点的最少操作次数. \(n\),\(m\)<=100,\(k\)<= ...

随机推荐

  1. sqlite数据库删除了数据,为什么文件不会变小?

    SQLite数据库文件的大小不会自动缩小,即使删除了其中的数据. 这是因为在SQLite中,当数据被删除时,它实际上并没有立即从磁盘上移除,而是被标记为[已删除], 这种处理机制,被删除的数据仍然占用 ...

  2. git可视化管理工具有哪些?

    在 Git 中,有许多可视化管理工具可供使用.以下是一些常见的 Git 可视化管理工具及其功能的详细介绍. GitHub Desktop: GitHub Desktop 是由 GitHub 官方推出的 ...

  3. C++ Qt开发:LineEdit单行输入组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍LineEdi ...

  4. CSP_J

  5. 从Redis读取.NET Core配置

    在本文中,我们将创建一个自定义的.NET Core应用配置源和提供程序,用于从Redis中读取配置.在此之前,您需要稍微了解一些.NET Core配置提供程序的工作原理,相关的内容可以在Microso ...

  6. Educational Codeforces Round 159 总结

    最失败的一集. C 开题顺序搞错,不小心先开了C,以为是A.还好C不难. 题意大概是在给定的数组最后添一个数(所有数两两不同),再自定义一个数 \(k\) ,数组中每个数可以加上若干个 \(k\) , ...

  7. ElasticSearch之Index modules

    索引的参数,分为两类: 静态参数,仅支持在创建索引时指定,或者关闭索引后指定. 动态参数,允许在索引工作期间指定或者修改. 静态参数 index.number_of_shards 默认值为1. 本参数 ...

  8. Python——Html(内联框架<iframe>)

    <iframe>(内联框架)是 HTML 中的一个标签,用于在当前文档中嵌入另一个文档.它提供了一种将一个 HTML 文档嵌套到另一个文档的方式,允许在一个页面中显示另一个页面的内容.以下 ...

  9. idea配置tomcat热部署

    idea配置tomcat热部署,点击+添加一个local的tomcat服务 点击部署tab 添加Artifact...选择 一定要选择exploded,否则没有热部署选项!!! 一定要选择explod ...

  10. Base64编码:数据传输的安全使者

    Base64编码是一种将二进制数据转换为可传输的文本表示形式的方法,它在全球范围内被广泛应用于网络通信.数据存储和传输等领域.本文将从多个方面介绍Base64编码的原理.应用及其在现实场景中的优势,帮 ...