ABC339 A-G

Japan Registry Services (JPRS) Programming Contest 2024 (AtCoder Beginner Contest 339) - AtCoder

离AK ABC最近的一集,写完F还剩十分钟聊天去了,赛后一看题一眼主席树贴板子改一改十分钟过了...前几题感觉真的阅读理解...

A - TLD

题意:

给出一个由小写英文字符和'.'构成的字符串,输出该字符串中最后一个'.'之后的部分

代码:

char ch[N];
void solve()
{scanf("%s", ch + 1);int p = 1;for (int i = 1; ch[i]; ++i){if (ch[i] == '.')p = i + 1;}printf("%s", ch + p);
}

B - Langton's Takahashi

题意:

有一张H*W的矩阵,刚开始矩阵的每个格子都是白色的,这个矩阵上下左右是成环的(也就是说每一行的第w个格子右边是这行的第一个格子,列上同理)

你刚开始位于(1, 1)且面朝上,你将进行以下操作N次:

1、若当前格子是白色的,将这个格子染成黑色,右转(顺时针)90°,向前走一格

2、若当前格子是黑色的,将这个格子染成白色,左转(逆时针)90°,向前走一格

输出经过所有操作后的矩阵

题解:

若至阅读理解题,模拟即可

int dx[] = { -1,0,1,0 }, dy[] = { 0,1,0,-1 }, mp[N][N];
void solve()
{int h, w, n, x = 1, y = 1, op = 0;scanf("%d%d%d", &h, &w, &n);while (n--){if (!mp[x][y])mp[x][y] = 1, op = (op + 1) % 4;elsemp[x][y] = 0, op = (op + 3) % 4;x += dx[op], y += dy[op];x = (x - 1 + h) % h + 1, y = (y - 1 + w) % w + 1;}for (int i = 1; i <= h; ++i){for (int j = 1; j <= w; ++j){if (mp[i][j])printf("#");else printf(".");}printf("\n");}
}

C - Perfect Bus

题意:

有辆公交车,你不知道初始时它装了多少乘客人,接下来这两公交车经过了N站,每一站乘客的人数变化为Ai(为正则为上车人数,为负则为下车人数),问经过这N站之后车上乘客数量的最小值

题解:

设初始人数为0,模拟一下,设模拟过程中的最小值为mn,则-mn为最小的初始乘客数

void solve()
{LL n, s = 0, mn = 0, mx = 0;scanf("%lld", &n);for (int i = 1, x; i <= n; ++i){scanf("%d", &x);s += x;mn = min(mn, s);}printf("%lld\n", -mn + s);
}

D - Synchronized Players

题意:

给出一张N*N的地图,'.'为能走的道路,'#'为不能走的墙壁,'P'为两个玩家,你可以对两名玩家进行以下操作任意次:让两名玩家同时尝试向上/下/左/右移动一格,若能移动则移动,不能在站在原地。问最少多少步使两名玩家位置重合,不能输出-1

题解:

考虑到N很小,设dp[x1][y1][x2][y2]为使得玩家1在(x1, y1)位置,玩家2在(x2, y2)位置的最小操作数,bfs转移一下即可,数据极限情况挺极限的,用map存T了一发...

const LL N = 6e1 + 10;
char mp[N][N];
int dp[N][N][N][N];
queue<pair<PII, PII>>q;
int dx[] = { 0,0,1,-1 }, dy[] = { 1,-1,0,0 };
PII op(PII p, int t)
{int tx = p.first + dx[t], ty = p.second + dy[t];if (mp[tx][ty] != '#')return { tx,ty };return p;
}
void solve()
{int n;scanf("%d", &n);vector<PII>s;for (int i = 0; i <= n + 1; ++i){for (int j = 0; j <= n + 1; ++j)mp[i][j] = '#';}for (int i = 1; i <= n; ++i){getchar();for (int j = 1; j <= n; ++j){mp[i][j] = getchar();if (mp[i][j] == 'P')s.push_back({ i,j });}}q.push({ s[0],s[1] });dp[s[0].first][s[0].second][s[1].first][s[1].second] = 1;while (q.size()){PII a = q.front().first, b = q.front().second;if (a == b){printf("%d\n", dp[a.first][a.second][b.first][b.second] - 1);return;}q.pop();for (int i = 0; i < 4; ++i){PII ta = op(a, i), tb = op(b, i);if (!dp[ta.first][ta.second][tb.first][tb.second]){dp[ta.first][ta.second][tb.first][tb.second] = dp[a.first][a.second][b.first][b.second ]+ 1;q.push({ ta,tb });}}}printf("-1\n");
}

E - Smooth Subsequence

题意:

给出一个长度为N的数组A,求一个最长的子序列使得相邻元素之间差值的绝对值不大于D

题解:

线段树优化DP,设dp[x]为以值x结尾时最长的子序列长度,转移为dp[x]=max({dp[i], x - d <= i <= x + d}) + 1,处理一下两边界然后线段树优化即可

const LL N = 5e5 + 10;
#define ls(i) (i<<1)
#define rs(i) (i<<1|1)
int a[N], tr[N << 2];
void updata(int pos, int data, int l, int r, int i)
{if (l == r){tr[i] = data;return;}int mid = l + r >> 1;if (pos <= mid)updata(pos, data, l, mid, ls(i));else updata(pos, data, mid + 1, r, rs(i));tr[i] = max(tr[ls(i)], tr[rs(i)]);
}
int query(int ql, int qr, int l, int r, int i)
{if (ql <= l && r <= qr)return tr[i];int mid = l + r >> 1, res = 0;if (mid >= ql)res = max(res, query(ql, qr, l, mid, ls(i)));if (mid < qr)res = max(res, query(ql, qr, mid + 1, r, rs(i)));return res;
}
void solve()
{int n, d;scanf("%d%d", &n, &d);for (int i = 1, x; i <= n; ++i){scanf("%d", &x);int l = max(1, x - d), r = min((int)N, x + d);updata(x, query(l, r, 1, N, 1) + 1, 1, N, 1);}printf("%d\n", query(1, N, 1, N, 1));
}

F - Product Equality

题意:

给出一个长度为N的大数数组,求符合以下条件的三元组(i , j, k)数量:

1 <= i, j, k <= n,Ai * Aj = Ak

题解:

随机化哈希,刚好前段时间做过一道随机化哈希的题...

显然用高精度是做不了的,然后这题要求啊Ai * Aj = Ak显然在取模意义下也是成立的,那就可以对每个数都取模,这样问题就变成了1e3个普通32(或64)位整数之间的问题,枚举i, j然后查询符合条件的Ak数量(比如说存进map)即可,取模数建议生成随机数取,还可以多模,这样多能降低被卡的概率

const LL N = 1e3 + 10;
string s[N];
array<int, 6>a[N];
map<array<int, 6>, int>mp;
int mod[10] = { 998244353,51646229,68861641,91815541,91815541,(int)1e9 + 7 };
//atc没有hack这里就随便取几个数了(随机生成高质量随机数还不会用...)
//有点抽象的六模的哈希
array<int, 6> make_ar(string& t)
{array<int, 6>res = { 0,0,0,0,0,0 };for (auto& c : t){int f = c - '0';for (int i = 0; i < 6; ++i)res[i] = ((LL)res[i] * 10 + f) % mod[i];}return res;
}
array<int, 6> operator*(array<int, 6>x, array<int, 6>y)
{array<int, 6>res;for (int i = 0; i < 6; ++i)res[i] = (LL)x[i] * y[i] % mod[i];return res;
}
void solve()
{int n;scanf("%d", &n);for (int i = 1; i <= n; ++i){cin >> s[i];a[i] = make_ar(s[i]);++mp[a[i]];}int ans = 0;for (int i = 1; i <= n; ++i){for (int j = 1; j <= n; ++j){array<int, 6>res = a[i] * a[j];if (mp.find(res) != mp.end())ans += mp[res];}}printf("%d\n", ans);
}

G - Smaller Sum

题意:

给出一个长度为N的数组A,有Q个询问,每个询问要求求出从子串Li, Ri中所有不小于Xi的元素之和(强制在线)

题解:

一眼看着像主席树,然后对主席树改一改,维护的东西多加个维护sum就行了

const LL N = 2e5 + 10, M = 1e9 + 10;
#define ls(x) (tr[x].ls)
#define rs(x) (tr[x].rs)
#define s(x) tr[x].s
#define sum(x) tr[x].sum
struct node
{int ls, rs, s;LL sum;
}tr[32 * N];//logM * N
int root[N], tot;
void push_up(int i)
{s(i) = s(ls(i)) + s(rs(i));sum(i) = sum(ls(i)) + sum(rs(i));
}
void updata(int pos, int data, int l, int r, int last, int now)
{if (l == r){s(now) = s(last) + data;sum(now) = sum(last) + (LL)data * pos;return;}ls(now) = ls(last), rs(now) = rs(last);int mid = l + r - 1 >> 1;if (pos <= mid)updata(pos, data, l, mid, ls(last), ls(now) = ++tot);elseupdata(pos, data, mid + 1, r, rs(last), rs(now) = ++tot);push_up(now);
}
void updata(int pos, int data, int last, int now)
{updata(pos, data, -M, M, last, now);
}
LL query_range_sum(int ql, int qr, int l, int r, int last, int now)
{if (ql <= l && r <= qr)return sum(now) - sum(last);LL mid = l + r - 1 >> 1, res = 0;if (ql <= mid)res += query_range_sum(ql, qr, l, mid, ls(last), ls(now));if (qr > mid)res += query_range_sum(ql, qr, mid + 1, r, rs(last), rs(now));return res;
}
LL query_range_sum(int ql, int qr, int last, int now)
{return query_range_sum(ql, qr, -M, M, last, now);
}
void solve()
{int n;scanf("%d", &n);for (int i = 1, x; i <= n; ++i){scanf("%d", &x);root[i] = ++tot;updata(x, 1, root[i - 1], root[i]);}int q;scanf("%d", &q);LL ans = 0;while (q--){LL l, r, x;scanf("%lld%lld%lld", &l, &r, &x);l ^= ans, r ^= ans, x ^= ans;ans = query_range_sum(1, x, root[l - 1], root[r]);printf("%lld\n", ans);}
}

看完题意感觉像是主席树,然后一想不对好像可以离线,再一看离线被ban了,再想想主席树做法发现完全能做...板子改改一发过了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流畅的Python(七)-函数装饰器和闭包

一、核心要义 主要解释函数装饰器的工作原理&#xff0c;包括最简单的注册装饰器和较复杂的参数化装饰器。同时&#xff0c;因为装饰器的实现依赖于闭包&#xff0c;因此会首先介绍闭包存在的原因和工作原理。 二、代码示例 1、变量作用域规则 #!/usr/bin/env python # -*-…

前端学习笔记 | HTML5+CSS3静态网页制作的技巧(持续更新)

注&#xff1a;本文的css样式均使用less写法 1、字体居中 &#xff08;1&#xff09;先text-align:center;行内元素水平居中 &#xff08;2&#xff09;再line-heigh:(盒子高度);行内元素垂直居中 text-align: center;line-height: ( 30 / vw ); 2、盒子居中 情景1&#…

【课程作业_01】国科大2023模式识别与机器学习实践作业

国科大2023模式识别与机器学习实践作业 作业内容 从四类方法中选三类方法&#xff0c;从选定的每类方法中 &#xff0c;各选一种具体的方法&#xff0c;从给定的数据集中选一 个数据集&#xff08;MNIST&#xff0c;CIFAR-10&#xff0c;电信用户流失数据集 &#xff09;对这…

【大数据技术攻关专题】「Apache-Flink零基础入门」手把手+零基础带你玩转大数据流式处理引擎Flink(基础加强+运行原理)

手把手零基础带你玩转大数据流式处理引擎Flink&#xff08;运行机制原理加深&#xff09; 前提介绍运行Flink应用运行机制Flink的两大核心组件JobManagerTaskManagerTaskSlot Flink分层架构Stateful Stream ProcessingDataStream和DataSetDataStream&#xff08;数据流&#xf…

GPIO中断

1.EXTI简介 EXTI是External Interrupt的缩写&#xff0c;指外部中断。在嵌入式系统中&#xff0c;外部中断是一种用于处理外部事件的机制。当外部事件发生时&#xff08;比如按下按钮、传感器信号变化等&#xff09;&#xff0c;外部中断可以立即打断正在执行的程序&#xff0…

Qt 数据库操作V1.0

1、pro文件 QT sql2、h文件 #ifndef DATABASEOPERATION_H #define DATABASEOPERATION_H#include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QSqlRecord> #include <QDebug> #include <QVariant>clas…

大红喜庆版UI猜灯谜小程序源码/猜字谜微信小程序源码

今天给大家带来一款UI比较喜庆的猜灯谜小程序&#xff0c;大家看演示图的时候当然也是可以看得到那界面是多么的喜庆&#xff0c;而且新的一年也很快就来了,所以种种的界面可能都比较往喜庆方面去变吧。 这款小程序搭建是免服务器和域名的&#xff0c;只需要使用微信开发者工具…

Linux一键部署telegraf 实现Grafana Linux 图形展示

influxd2前言 influxd2 是 InfluxDB 2.x 版本的后台进程,是一个开源的时序数据库平台,用于存储、查询和可视化时间序列数据。它提供了一个强大的查询语言和 API,可以快速而轻松地处理大量的高性能时序数据。 telegraf 是一个开源的代理程序,它可以收集、处理和传输各种不…

Linux开发工具

前言&#xff1a;哈喽小伙伴们&#xff0c;经过前边的学习我们已经掌握了Linux的基本指令和权限&#xff0c;相信大家学完这些之后都会对Linux有一个更加深入的认识&#xff0c;但是Linux的学习可以说是从现在才刚刚开始。 这篇文章&#xff0c;我们将讲解若干个Linux的开发工…

Java基础数据结构之Map和Set

Map和Set接口 1.Set集合&#xff1a;独特性与无序性 Set是Java集合框架中的一种&#xff0c;它代表着一组无序且独特的元素。这意味着Set中的元素不会重复&#xff0c;且没有特定的顺序。Set接口有多个实现类&#xff0c;如HashSet、LinkedHashSet和TreeSet。 2.Map集合&…

Redis核心技术与实战【学习笔记】 - 19.Pika:基于SSD实现大容量“Redis”

前言 随着业务数据的增加&#xff08;比如电商业务中&#xff0c;随着用户规模和商品数量的增加&#xff09;&#xff0c;就需要 Redis 能保存更多的数据。你可能会想到使用 Redis 切片集群&#xff0c;把数据分散保存到不同的实例上。但是这样做的话&#xff0c;如果要保存的…

Redis为什么快?

前言 在当今的计算机应用领域&#xff0c;数据存储和高性能访问成为系统设计中至关重要的一环。Redis以其卓越的性能、简洁而强大的设计原则&#xff0c;成为众多开发者和企业首选的内存存储系统。本文将深入探讨Redis之所以能够如此快速的原因&#xff0c;从内存存储、单线程模…

利用牛顿方法求解非线性方程(MatLab)

一、算法原理 1. 牛顿方法的算法原理 牛顿方法&#xff08;Newton’s Method&#xff09;&#xff0c;也称为牛顿-拉弗森方法&#xff0c;是一种用于数值求解非线性方程的迭代方法。其基本思想是通过不断迭代来逼近方程的根&#xff0c;具体原理如下&#xff1a; 输入&#…

PCB笔记(二十三):allegro 标注长宽(一般用于测量板宽)时如何显示双单位

步骤&#xff1a;首先选择标注工具&#xff0c;然后右键→Parameters&#xff0c;在弹出来的窗口中√上如下图二所示选项 最终要达到显示单位的效果的话&#xff0c;需要在Text项键入%v%u。 今天就记录到这里啦O

Leetcode206:反转链表

一、题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 示例&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]输入&#xff1a;head [] 输出&#xff1…

[ESP32 IDF]web server

目录 通过web server控制LED 核心原理解析 分区表 web server的使用 错误Header fields are too long的解决 通过web server控制LED 通过网页控制LED灯的亮灭&#xff0c;一般的ESP32开发板都可以实现&#xff0c;下面这篇文章是国外开发者提供的一个通过web server控制…

速盾:香港轻量服务器网站如何接入cdn

香港轻量服务器网站接入 CDN&#xff08;内容分发网络&#xff09;有以下几个步骤&#xff1a; 选择 CDN 供应商&#xff1a;首先需要选择一家可靠的 CDN 供应商&#xff0c;如速盾、阿里云、腾讯云、百度云等。根据自己的需求和预算&#xff0c;选择适合的 CDN 供应商。 注册…

13.2K Star,12306 抢票助手帮你回家

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 马上过年了&#xff0c;今年你在哪里过年&#xff1f;回老家吗&#x…

前端入门第一天

目录 HTML超文本标记语言——Hyper Text Markup Language 标签语法&#xff1a; 双标签&#xff1a; 单标签——只有开始标签&#xff0c;没有结束标签 基本骨架&#xff1a; 标签的关系: 注释&#xff1a; 标题标签&#xff1a;&#xff08;新闻标题、文章标题、网页区域…