HHKB Programming Contest 2020 补题记录(D题投影,E题预处理节省时间)
补题链接: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题预处理节省时间)的更多相关文章
- 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 ...
- HHKB Programming Contest 2020【ABCE】
比赛链接:https://atcoder.jp/contests/hhkb2020/tasks A - Keyboard 代码 #include <bits/stdc++.h> using ...
- HHKB Programming Contest 2020 D - Squares 题解(思维)
题目链接 题目大意 给你一个边长为n的正方形和边长为a和b的正方形,要求把边长为a和b的正方形放在长度为n的正方形内,且没有覆盖(可以相邻)求有多少种放法(mod 1e9+7) 题目思路 这个思路不是 ...
- M-SOLUTIONS Programming Contest 2020 题解
M-SOLUTIONS Programming Contest 2020 题解 目录 M-SOLUTIONS Programming Contest 2020 题解 A - Kyu in AtCode ...
- Atcoder Panasonic Programming Contest 2020
前三题随便写,D题是一道dfs的水题,但当时没有找到规律,直接卡到结束 A - Kth Term / Time Limit: 2 sec / Memory Limit: 1024 MB Score ...
- Yahoo Programming Contest 2019 补题记录(DEF)
D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...
- 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 = ...
- 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)\).这就相当于 ...
- The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored E.Sequence in the Pocket(思维题)
传送门 题意: 给出一个序列,你可以将任意一个数移到最前面: 求最少需要移动多少次,可以是此序列变成非递减序列: 思路: 定义 (ai,aj) 为逆序对 ( i < j , ai > aj ...
- atcoder Keyence Programming Contest 2020 题解
比赛地址 A 题意:给一个\(n*m\)的初始为白色的矩阵,一次操作可以将一行或一列染成 黑色,问至少染出\(k\)个黑点的最少操作次数. \(n\),\(m\)<=100,\(k\)<= ...
随机推荐
- Linux 运维人员最常用 150+命令汇总
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 目录 版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 命令帮助手册1 命令帮助手册2 ...
- c++算法练习day01【2022年蓝桥杯省赛B组题目】每天做一点、、、
这个练习目前来说就比较宽松,打算在寒假(基本也就是这一个月每天刷几道题吧) 题目一: 小明决定从下周一开始努力刷题准备蓝桥杯竞赛.他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目.请你 ...
- 明解Java第二章练习题答案
练习2-1 请对代码清单2-6的2处进行修改,将带有小数部分的实数值赋给x和y,查看结果如何? 答案:编译器会报错,因为小数的默认类型double是比int更大的类型.如果给double类型的变量赋值 ...
- jmeter--jsr223组件使用和功能详解
相比于BeanShell 取样器,JSR223取样器具有可大大提高性能的功能(编译)如果需要,一定要使用JSR223取样器编写脚本是更好的选择!!! 属性描述名称:显示的此取样器的描述性名称,可自定义 ...
- GOF23--23种设计模式(一)
一.什么是设计模式 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决一系列特定问题的套路. 它不是语法规定,而是一套用来提高代码复用性,可读性,可维护性,稳健性,安全性的 ...
- k8s~envoy上添加wasm插件
先查看这篇文章k8s~envoy的部署 当在Kubernetes中使用Envoy的WASM过滤器时,WASM过滤器会与Envoy一起部署在同一个Pod中,并与后端服务进行通信.以下是一个简单的关系图示 ...
- Linux笔记03: Linux常用命令_3.2目录操作命令
3.2 目录操作命令 3.2.1 ls命令 ●命令名称:ls. ●英文原意:list directory contents. ●所在路径:/usr/bin/ls. ●执行权限:所有用户. ●功能描述: ...
- 吉特日化MES & RabbitMQ 的基本配置
在吉特日化MES(日化配料系统)中涉及到大量的消息推送,其中针对设备数据的交互(读写) 大量使用了RabbitMQ来进行消息通讯以及程序上的解耦,其中包含使用PDA扫码登录到PLC控制程序,下发生产工 ...
- LeetCode190:颠倒二进制(位运算分治! 时间复杂度O(1))
解题思路:这道题很两种解法,常规的就是O(n),另一种就是巧妙的利用位运算实现分治,时间复杂度O(1),类似于归并排序.不过这个递归不是自顶向下,而是巧用位运算从自底向上实现. 比如01001000通 ...
- Spingboot整合Dubbo+zookeeper
前言: 2023-12-26 19:38:05 最近学习分布式技术:Dubbo+zookeeper,准备写一个demo用springboot整合dubbo和zookeeper.但是看了网上一些教程都是 ...