2022 Hangzhou Normal U Summer Trials
Subarrays
给定一个长度为
n的由正整数组成的序列,请你输出该序列中子段和能被\(k\)整除的所有符合要求的子段数量
题解:组合计数 + 前缀和 + 思维
\[sum[l,r]\ \ mod\ \ k = 0\\
(sum[r]-sum[l-1]) \ \ mod \ \ k = 0\\
sum[r] \ \ mod\ \ k \equiv sum[l-1]\ \ mod \ \ k
\]根据上面的推导我们可以得到:如果某个下标下的前缀和与前面某个下标下的前缀和在模\(k\)下同余,就说明两个下标之间的子段和能被\(k\)整除
所以我们只需要先计算一遍前缀和,然后对于每个下标下的前缀和利用
map记录一下每个下标下的前缀和对\(k\)的模数即可,最后组合计数,比如说对\(k\)取模的前缀和状态一共有\(m\)个,那么我们只需要在这\(m\)个状态中任意取两个即可,即\(C_{m}^{2}\),其余的状态以此类推
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define debug(x) cerr << #x << '=' << x << endl
#define all(x) (x).begin(), (x).end()
#define rson id << 1 | 1
#define lson id << 1
#define int long long
#define mpk make_pair
#define endl '\n'
using namespace std;
typedef unsigned long long ULL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 1e5 + 10, M = 4e5 + 10;
int n, k;
int a[N];
int pre[N];
unordered_map<int, int> mp;
void solve()
{
cin >> n >> k;
for (int i = 1; i <= n; ++i)
cin >> a[i];
for (int i = 1; i <= n; ++i)
{
pre[i] = (pre[i - 1] + a[i]) % k;
mp[pre[i] % k]++;
}
int ans = 0;
ans += mp[0];
for (auto [x, y] : mp)
{
ans += (y * (y - 1)) / 2;
}
cout << ans << endl;
}
signed main(void)
{
Zeoy;
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}
Easy Problem
在一个\(n \times n\)地图上,包含了障碍
*,玩家a,玩家b,你现在需要控制两个玩家同时上下左右移动,如果遇到障碍或者边界无法移动,请你计算出两个玩家能够遇到的最短时间,如果两个玩家无法遇到,输出no solution\(2 \le n \le 50\)
题解:BFS
\(vis[ax][ay]][bx][by]\)代表玩家\(a\)从起点运动到\((ax,ay)\)并且玩家\(b\)从起点运动到\((bx,by)\)的最小步数
在BFS过程中,如果某个玩家遇到障碍或者边界,我们保持其坐标不变即可
最后当\((ax,ay)=(bx,by)\)时,说明两个玩家遇到了,我们直接退出广搜,输出最小步数
如果广搜结束两个玩家都没有相遇,说明无法相遇,直接输出
no solution
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define debug(x) cerr << #x << '=' << x << endl
#define all(x) (x).begin(), (x).end()
#define rson id << 1 | 1
#define lson id << 1
#define int long long
#define mpk make_pair
#define endl '\n'
using namespace std;
typedef unsigned long long ULL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 50 + 5, M = 4e5 + 10;
int n;
char g[N][N];
int dis[N][N][N][N];
bool vis[N][N][N][N];
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
struct node
{
int ax, ay, bx, by;
};
void bfs(int ax, int ay, int bx, int by)
{
queue<node> q;
q.push({ax, ay, bx, by});
dis[ax][ay][bx][by] = 0;
vis[ax][ay][bx][by] = true;
while (q.size())
{
node u = q.front();
q.pop();
if (u.ax == u.bx && u.ay == u.by)
{
cout << dis[u.ax][u.ay][u.bx][u.by] << endl;
return;
}
for (int i = 0; i < 4; ++i)
{
int nax = u.ax + dir[i][0];
int nay = u.ay + dir[i][1];
int nbx = u.bx + dir[i][0];
int nby = u.by + dir[i][1];
if (nax < 1 || nax > n || nay < 1 || nay > n || g[nax][nay] == '*')
nax = u.ax, nay = u.ay;
if (nbx < 1 || nbx > n || nby < 1 || nby > n || g[nbx][nby] == '*')
nbx = u.bx, nby = u.by;
if (vis[nax][nay][nbx][nby] == true)
continue;
vis[nax][nay][nbx][nby] = true;
dis[nax][nay][nbx][nby] = dis[u.ax][u.ay][u.bx][u.by] + 1;
q.push({nax, nay, nbx, nby});
}
}
cout << "no solution" << endl;
}
void solve()
{
cin >> n;
int ax, ay, bx, by;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
{
cin >> g[i][j];
if (g[i][j] == 'a')
ax = i, ay = j;
if (g[i][j] == 'b')
bx = i, by = j;
}
bfs(ax, ay, bx, by);
}
signed main(void)
{
Zeoy;
int T = 1;
while (T--)
{
solve();
}
return 0;
}
Optimal Biking Strategy
一个人需要从起点到达距离其
p距离远的终点,他可以选择步行或者骑车,路上有n个自行车停靠站,他只能在自行车停靠站上车或者下车骑车需要花钱,
1元允许骑行最多s米,也就是说如果两个自行车站距离为x,那么需要花费\(\lceil \frac{x}{s} \rceil\)元现在他有
k元,他到终点最少的步行距离\(1≤n≤10^6,1≤p≤10^9,1≤s≤10^9,1≤k≤5\)
\(a_i<a_j\)
题解:线性DP + 贪心 \(O(n*k^2 + nk*logn)\)
- 状态表示:\(O(nk)\)
\(f[i][j]\)代表从起点到第\(i\)个自行车站,花了\(j\)元后的最小步行距离
状态属性:\(MIN\)
状态计算:按照从上一个站点到第\(i\)个站点花费了多少钱对集合进行划分 \(O(k)\)
- 不花钱,即从第\(i-1\)个站点步行到第\(i\)个站点:\(f[i-1][j] + a[i] - a[i-1]\)
- 花
1元,从距离站点\(i\)最远的可以用1元骑行到站点\(i\)的站点\(k\)骑行到站点\(i\):\(f[k][j-1]\)- 花
2元,从距离站点\(i\)最远的可以用2元骑行到站点\(i\)的站点\(k\)骑行到站点\(i\):\(f[k][j-2]\)- ......
注意我们需要提前预处理\(L[i][j]\):代表距离站点\(i\)最远的可以用\(j\)元骑行到站点\(i\)的站点,因为站点序列a递增,我们直接二分即可,预处理复杂度:\(O(nk*logn)\)
状态初始:\(f[i][0] = a[i]\)
答案呈现:\(f[n][k] + p - a[n]\)
const int N = 1e6 + 10, M = 8;
int n, p, s, k;
int a[N];
int f[N][M];
int L[N][M];
void solve()
{
cin >> n >> p >> s;
for (int i = 1; i <= n; ++i)
cin >> a[i];
cin >> k;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= k; ++j)
f[i][j] = INF;
for (int i = 1; i <= n; ++i)
f[i][0] = a[i];
for (int i = 1; i <= n; ++i) //二分预处理
for (int j = 1; j <= k; ++j)
L[i][j] = lower_bound(a + 1, a + n + 1, a[i] - j * s) - a;
for (int i = 1; i <= n; ++i) //DP
for (int j = 1; j <= k; ++j)
{
f[i][j] = min(f[i][j], f[i - 1][j] + a[i] - a[i - 1]);
for (int m = 1; m <= j; ++m)
f[i][j] = min(f[i][j], f[L[i][m]][j - m]);
}
cout << f[n][k] + p - a[n] << endl;
}
IHI's Magic String
现在给定一个空串,你可以对该串操作
q次,每次操作可能是一下的情况:
- 将一个字符添加到字符串的末尾
- 删除字符串末尾的一个字符
- 将现在字符串中所有字符
x替换成字符y那么问你在经过题目给定的
q次操作后,输出最后的字符串,如果最后字符串为空,输出The final string is empty
题解:思维 + 模拟 \(O(n)\)
我们思考操作\(3\)如果字符\(x\)先被字符\(y\)替换,然后字符\(y\)被字符\(z\)替换,那么实际上就等价于字符\(x\)被字符\(z\)替换,也就是操作3是存在覆盖性的,所以我们可以考虑从后往前做
我们首先设定\(f[x]\)代表字符\(x\)最后在字符串中变成的字符,初始状态下\(f[x]=x\)
对于每一个操作3给定的\(x\)和\(y\),我们可以令\(f[x] = f[y]\)
对于每一个操作1来说,我们模拟后发现,倒着做的时候我们需要在字符串前面添加字符\(f[x]\),但是问题是字符\(f[x]\)应不应该被添加,因为该字符有可能被操作2删除了,所以我们可以先按题意模拟,预处理出在每个操作1添加的字符是否被操作2删除
时间复杂度:\(O(n)\)
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define debug(x) cerr << #x << '=' << x << endl
#define all(x) (x).begin(), (x).end()
#define rson id << 1 | 1
#define lson id << 1
#define int long long
#define mpk make_pair
#define endl '\n'
using namespace std;
typedef unsigned long long ULL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 1e5 + 10, M = 4e5 + 10;
struct node
{
int op;
char x;
char y;
};
int n;
node qry[N];
stack<int> stk;
bool st[N];
void solve()
{
cin >> n;
string s;
for (int i = 1; i <= n; ++i)
{
int op;
char x, y;
cin >> op;
if (op == 1)
{
cin >> x;
qry[i].op = op;
qry[i].x = x;
s += x;
stk.push(i);
}
else if (op == 2)
{
qry[i].op = op;
if (s.size())
{
st[stk.top()] = true;
stk.pop();
s.pop_back();
}
}
else
{
cin >> x >> y;
qry[i].op = op;
qry[i].x = x;
qry[i].y = y;
}
}
if (s.empty())
{
cout << "The final string is empty" << endl;
return;
}
s = "";
char f[26];
for (int i = 0; i < 26; ++i)
f[i] = char(i + 'a');
int cnt = 0;
for (int i = n; i >= 1; i--)
{
int op = qry[i].op;
if (op == 3)
{
char x = qry[i].x, y = qry[i].y;
f[x - 'a'] = f[y - 'a'];
}
else if (op == 1)
{
if (!st[i])
{
char x = qry[i].x;
s = f[x - 'a'] + s;
}
}
}
cout << s << endl;
}
signed main(void)
{
Zeoy;
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}
2022 Hangzhou Normal U Summer Trials的更多相关文章
- 【补题】The 2022 SDUT Summer Trials
比赛链接 The 2022 SDUT Summer Trials A. Ginger's number 样例恶臭(恼) 签到题 简单分解因数就会发现要求的就是\(gcd\),直接算即可,时间复杂度\( ...
- 2022 年最受瞩目的新特性 CSS @layer 到底是个啥?
步入 2022,CSS 的新特性层出不穷,而最近在 CSS 圈最受瞩目的新特性,非 CSS @layer 莫属. 本文,将用最简洁的语言,快速让读者们搞懂,到底什么是 CSS @layer 新规范. ...
- CesiumJS 2022^ 原理[5] - 着色器相关的封装设计
目录 1. 对 WebGL 接口的封装 1.1. 缓冲对象封装 1.2. 纹理与采样参数封装 1.3. 着色器封装 1.4. 上下文对象与渲染通道 1.5. 统一值(uniform)封装 1.6. 渲 ...
- 【CS231n assignment 2022】Assignment 2 - Part 2,优化器,批归一化以及层归一化
前言 博客主页:睡晚不猿序程 首发时间:2022.7.23 最近更新时间:2022.7.23 本文由 睡晚不猿序程 原创 作者是蒻蒟本蒟,如果文章里有任何错误或者表述不清,请 tt 我,万分感谢!or ...
- 【CS231n assignment 2022】Assignment2 - Part 1,全连接网络的初始化以及正反向传播
文章目录 前言 FullyConnectedNets 网络初始化 代码注意事项 1. W 的尺寸怎么知道? 2. np.random.norml() 3. batchnorm loss(self, X ...
- CSharpGL(14)用geometry shader渲染模型的法线(normal)
+BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(14)用geometry shader渲染模型的法线(normal) +BIT祝威+悄悄在此留下版了个权的信息说: 2016-08-13 ...
- 一张图看懂normal,static,sealed,abstract 的 区别
+-------------------------+---+--------+--------+--------+----------+ | Class Type | | normal | stat ...
- 前端必须了解的布局常识:普通流(normal flow)
目录 一.概述 二.块级元素和内联元素 常见的块级元素 BFC 常见的行内元素 IFC 三.哪些情况会脱离普通流 浮动 绝对定位 固定定位 display:none 四.总结 五.参考资料 一.概述 ...
- What is a RaycastHit normal?
The normal is the direction pointing away from the collider it hits. http://answers.unity3d.com/ques ...
- Mysql索引PRIMARY、NORMAL、UNIQUE、FULLTEXT 区别和使用场合
索引 数据库的索引就像一本书的目录,能够加快数据库的查询速度. MYSQL索引有四种PRIMARY.INDEX.UNIQUE.FULLTEXT, 其中PRIMARY.INDEX.UNIQUE是一类,F ...
随机推荐
- 快速结束 git 输出行
在使用git命令查看操作记录等时,内容很多,想要输出内容快速结束 英文 Q 备注:通过英文Q快速结束
- OpenAI GPT-4发布总结
OpenAI官方发布了GPT-4模型,GPT-4是一个大型多模态模型,支持输入文本+图片,输出还是文字形式,GPT-4比任何 GPT-3.5 模型都更强大,能够执行更复杂的任务,并针对聊天进行了优化. ...
- 巧用PDF转Markdown插件,在扣子(Coze)手搓一个有趣好玩的AI Bot
近期,TextIn团队开发的PDF转Markdown插件已经上架Coze平台. 短短的时间内,已经有不少朋友愉快地和我们的工具开始玩耍.今天我们抛砖引玉,介(an)绍(li)几种PDF转Markdow ...
- Angular 18+ 高级教程 – 关于本教程
版本声明 本教程写于 Angular v17,但往后的所有新功能,API 都有更新到相关文章里头,所以教程总是最新的,大家可以安心学习. 前言 光阴飞逝,一转眼,我尽然已经有两年多的时间完全没有接触 ...
- Java!!冲
开始学习Java!!!
- Blazor开发框架Known-V2.0.11
Known今天发布了V2.0.11版本,本次版本添加了系统WebApi在线测试,系统菜单样式配置,表格支持用户设置栏位显隐和顺序,系统上下文支持静态组件与后端交互,以及对PgSQL进行了详细的测试,修 ...
- AD域下,环境下办公机系统时间不准确
事件起因: 某部门一同事电脑时间和AD域控时间相差3分钟,虽然说时间相差5分钟内问题不大,但是本着有问题就解决的原则,还是花了点时间去查资料解决. (小小吐槽一下,在我看来域控机是掌管下面所有的办公机 ...
- P9118 [春季测试 2023] 幂次
二诊前愉快的一次测试,关键是还有奶茶喝 第二题,本来直接暴力去重枚举可以的六十分的,但是.......花了30分钟优化剪纸,优化空间后,惨变35分. [春季测试 2023] 幂次 题目描述 小 Ω 在 ...
- Java日期时间API系列16-----Jdk8中java.time包中的新的日期时间API类,java日期计算3,日期中年月日时分秒的属性值修改等
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...
- 墨天轮沙龙 | 亚马逊云科技李君:见微知著 - Serverless云原生数据库概览
导读 以业务为导向的数据库需要满足现代化应用的需要,以 Serverless 数据库为代表,云数据库正在迅速发展成熟,并带来更好的可访问性和高可用性,还有高扩展性与可迁移性. [墨天轮数据库沙龙-Se ...