『模拟赛』多校A层冲刺NOIP2024模拟赛17

Rank

一般

image

image

A. 网络

签不上的签到题。

首先考虑枚举路径的做法,如果先枚举再计算的话复杂度会是 \(\mathcal{O(\binom{n+m-2}{n-1}(n+m))}\) 的,稍微优化一点的过程中可以去掉后面的 \((n+m)\)。考虑此时我们要记什么,首先遇到加号其前面的值 \(z\) 就确定了,若上个符号为乘号那么需记录乘数 \(x\),同时显然还需记录当前的数 \(y\),可以得到 30pts。

迁移到 \(\mathcal{O(nm)}\) 的做法上,稍微改变一些定义,将记当前的数直接改为记当前的数与所记乘数的积。分讨三种转移:

  • 若当前位置为数字:\(y\leftarrow 10x+x\cdot a_{i,j}\)
  • 若当前位置为乘号:\(x\leftarrow y,\ y\leftarrow 0\)
  • 若当前位置为加号:\(z\leftarrow y+z,\ y\leftarrow 0,\ x\leftarrow 1\)

发现这样转移仍然是针对一个表达式的,优化也很简单,提前处理可能的 \(x\) 值,即到这个点一共有几种可能。感性理解就是:在这个点一共会进行棘刺这样的转移。然后就做完了,复杂度 \(\mathcal{O(nm)}\)

点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(register int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(register int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define lx ll
inline lx qr()
{char ch = getchar(); lx x = 0, f = 1;for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);return x * f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
#define pii pair<int, int>
#define P_B(x) push_back(x)
#define M_P(x, y) make_pair(x, y)
const int Ratio = 0;
const int N = 2000 + 5;
const int mod = 998244353;
int n, m;
string s[N];
ll z[N][N], x[N][N], y[N][N], zc[N][N];
namespace Wisadel
{short main(){freopen("grid.in", "r", stdin), freopen("grid.out", "w", stdout);n = qr, m = qr;fo(i, 1, n) cin >> s[i], s[i] = " " + s[i];zc[1][0] = 1;x[1][0] = 1;fo(i, 1, n) fo(j, 1, m){x[i][j] = (x[i - 1][j] + x[i][j - 1]) % mod;y[i][j] = (y[i - 1][j] + y[i][j - 1]) % mod;z[i][j] = (z[i - 1][j] + z[i][j - 1]) % mod;zc[i][j] = (zc[i - 1][j] + zc[i][j - 1]) % mod;if(s[i][j] == '+'){z[i][j] = (z[i][j] + y[i][j]) % mod;x[i][j] = zc[i][j];y[i][j] = 0;}else if(s[i][j] == '*'){x[i][j] = y[i][j];y[i][j] = 0;}else y[i][j] = (y[i][j] * 10 % mod + (s[i][j] - '0') * x[i][j] % mod) % mod;}printf("%lld\n", (z[n][m] + y[n][m]) % mod);return Ratio;}
}
signed main(){return Wisadel::main();}

B. 矩形

正解是根号分治。不是很会,于是在 GGrun 的帮助下焯过去了。

思路很平凡,将同一列和同一行的提前处理出来,然后看哪个少用哪个。求答案时朴素实现是枚举两列,双指针移动找匹配段,然后用 \(\frac{x(x-1)}{2}\) 贡献统计答案。发现会 TLE,于是考虑少些无用的枚举。我们枚举一列,然后枚举上面的每个点,再枚举该点所在行上的点,更新这些点所在列的贡献。我们将 \(\frac{x(x-1)}{2}\) 拆成 \(\frac{x^2}{2}-\frac{x}{2}\),发现可以根据转移式 \((x+1)^2=x^2+2x+1\) 直接更新二者的值,最后再枚举每一列统计贡献即可,然后就过了,复杂度 \(\mathcal{O(能过)}\)(我的实现常数过大会被卡

焯代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(register int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(register int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define lx ll
inline lx qr()
{char ch = getchar(); lx x = 0, f = 1;for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);return x * f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
#define pii pair<int, int>
#define P_B(x) push_back(x)
#define M_P(x, y) make_pair(x, y)
const int Ratio = 0;
const int N = 2e5 + 5;
const int mod = 998244353;
int n, tot;
int prex[N], prey[N];
ll sum[N], ans, ans1[N], ans2[N];
struct rmm
{int x, y;bool operator < (const rmm &A) const{return y == A.y ? x < A.x : y < A.y;}
} d[N], p[N];
pii xx[N], yy[N];
namespace Wisadel
{bool cmpn(rmm A, rmm B){return A.x == B.x ? A.y < B.y : A.x < B.x;}bool cmpm(rmm A, rmm B){return A.y == B.y ? A.x < B.x : A.y < B.y;}short main(){freopen("rect.in", "r", stdin), freopen("rect.out", "w", stdout);n = qr;ll c = 1;fo(i, 2, n) sum[i] = sum[i - 1] + c, c++;fo(i, 1, n) d[i].x = p[i].x = qr, d[i].y = p[i].y = qr;sort(d + 1, d + 1 + n, cmpn);sort(p + 1, p + 1 + n, cmpm);int zoz = 0;fo(i, 1, n) if(d[i].x != d[i - 1].x) xx[++tot].fi = d[i].x, xx[tot].se = i, prex[d[i].x] = tot;fo(i, 1, n) if(p[i].y != p[i - 1].y) yy[++zoz].fi = p[i].y, yy[zoz].se = i, prey[p[i].y] = zoz;if(zoz < tot){swap(tot, zoz);fo(i, 1, max(tot, zoz)) swap(xx[i], yy[i]);fo(i, 1, n) swap(d[i].x, p[i].y), swap(d[i].y, p[i].x), swap(prex[i], prey[i]);}xx[tot + 1].se = n + 1;yy[zoz + 1].se = n + 1;fo(i, 1, tot){int z1 = xx[i].se;while(z1 <= xx[i + 1].se - 1){int z2 = lower_bound(p + 1, p + 1 + n, (rmm){d[z1].x, d[z1].y}) - p;int bz = prey[p[z2].y]; z2++;while(z2 <= yy[bz + 1].se - 1){ans1[prex[p[z2].x]] += ans2[prex[p[z2].x]] * 2 + 1, ans2[prex[p[z2].x]]++;z2++;}z1++;}fo(j, i + 1, tot)ans += (ans1[j] - ans2[j]) / 2, ans1[j] = ans2[j] = 0;}printf("%lld\n", ans);return Ratio;}
}
signed main(){return Wisadel::main();}

正解晚上补。

C. 集合

容斥 + FFT,男蚌。

赛时猜了个结论拿了 10pts。

D. 倒水

期望 + 线段树优化,牛魔。

赛时打了个暴力拿了 24pts。

比昨天强点,但不多。

开题一眼三道取模压迫感就来了,因为 T1 看了会不会打就先通读了一遍,然后打 T4,打完打的 T2,结果空间没改 + 取模没改直接嗯挂 52pts。

T1 最后 15min 想到了过程中计算,少了个很大的常数但没有多得分,其实感觉到这再想想就能做出来了,可惜回看得太晚来不及了。

突然想到一场比赛三道 dp,两道计数(


完结撒花~

www 怎么状态越来越差了(

image

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

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

相关文章

rust学习五、认识所有权

在<<The rust programming language>>的中译版<<rust权威指南>>中,作者用了30页的篇幅来阐述这个问题。 如作者所言,所有权是学习rust语言的基础,不掌握这个,无需继续往下,所以,这是初学rust就必须会的。正是所有权概念和相关工具的引入,Rust才…

给予爱快路由器使用阿里云DDNS远程访问家庭网络

一、阿里云域名准备1、首先需要购买一个阿里云域名,选简短好记性价比高的即可,如果域名只是用来解析路由器IP地址,不做服务器类应用,则不需要备案。 2、想做动态域名解析,光有域名还不行,还需要在阿里云控制台建立一个访问授权,路由器才能动态同步远营商的IP地址到DNS服…

KingbaseES V8R6集群备份恢复案例之---主库single-pro备份恢复

KingbaseES、repmgr、sys_rman案例说明: KingbaseES V8R6集群物理备份支持single-pro方式,本案例在集群执行single-pro方式备份并多次切换集群后,对集群执行了恢复测试,文档记录了恢复的详细过程。 适用版本: KingbaseES V8R6 集群架构:ID | Name | Role | Status …

号码变换配置对接运营商IMS

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 fs直接对接运营商,调试过程中的号码变换规则比较容易出问题。 本文档记录一个较为通用的对接IMS配置方案。 环境 CentOS 7.9 freeswitch 1.10.7 模块配置 号码变换主要使用mod_translate模块和dialplan拨号计划实现。 确…

Idea上Git仓库不见了是什么原因

在使用IntelliJ IDEA进行项目开发时,Git仓库突然消失是开发者常遇到的问题。该问题可能由多个因素引起,包括:1.环境配置问题;2.软件或插件更新;3.目录结构变更;4.用户权限问题;5.其他软件干扰。理解这些因素并采取相应的解决措施,不仅能快速恢复Git仓库,还能避免类似问…

【算法学习】扫描线

这篇题解写的难以言喻,可能只有我能看的懂! 前言 虽然我觉得这个算法目前不太可能会考,但是我觉得挺有意思的,而且学个算法也挺好,我是为自己学的!!! 定义 扫描线可以求二维图形的面积,也可以求周长等多种用途…… P5490 【模板】扫描线 & 矩形面积并 这就是扫描线…

leetcode 740 删除并获得点数

740 删除并获得点数 题意 给你一个整数数组 nums ,你可以对它进行一些操作。 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。 开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。…

Navicat 17下载与安装

1、安装包 Navicat 17: 链接:https://pan.quark.cn/s/c75e892c4705 提取码:YvyF Navicat 16: 链接:https://pan.quark.cn/s/63c07b20ea7b提取码:B9ij 2、安装教程(这里以安装Navicat 17 为例) 1) 如之前已安装的需卸载当前Navicat,如未安装,直接双击无限试用…

gitlab怎么保护分支

​GitLab作为一个流行的版本控制工具其中“分支保护”是一个关键功能,用以防止开发过程中的不当操作对代码造成不可逆的影响。本文将指导你如何在GitLab中保护分支:1.理解保护分支的重要性;2.学会使用GitLab的界面进行分支的保护操作;3.了解与合并请求的关联使用;4.探讨在…

[编程笔记] 搞人心态的代码含毒事件 “svn无法成功完成操作因为文件包含病毒或潜在的垃圾软件”

svn无法成功完成操作因为文件包含病毒或潜在的垃圾软件,Windows Defender误判?今天突然冒出来的问题,烦死了!     svn拉取代码报毒了,不用想,基本就是下面几个可能性:1、某人提交的代码有毒2、电脑上的第三方杀毒软件引发3、Windows Defender误判报毒的代码是一个dl…

AI作文批阅,AI素材管理……璞华集团携多款明星产品亮相智能社会治理论坛

2024年10月25日,金秋十月的璀璨时节,备受瞩目的第二届智能社会治理论坛暨中国光谷人工智能艺术大会在中国光谷盛大启幕。此次论坛汇聚了人工智能领域的顶尖智慧,共同探讨人工智能技术的最新突破与智能社会治理模式的创新路径,同时强调了科技与文化融合的无限可能。璞华集团…