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

Rank

打得还可以

image

image

A. 构造字符串

签,但是挂了 40pts。

发现判条件只有相等和不相等,于是想到并查集维护连通块,将强制相同的两个位置的连通块合并,强制不同的先记下,最后统一判断。

重点在细节处理,合并连通块时要将位置靠后的合并到靠前的上,注意 \(LCP(x,y)=z\)\(x+z,y+z\le n\) 时,存在 \(s_{x+z}\neq s_{y+z}\) 的要求,漏了这个就会狠挂 40pts,同样,判断位置字符不同时修改操作也要在位置靠后的块上进行,同时记一下每个块不能成为哪个数,为防止出现一个数先与其后的数更新然后与其前的数更新导致答案不优的情况,我将这些判断做了排序。

点击查看代码
#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;
#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 pii pair<int , int>
#define fi first
#define se second
const int Ratio = 0;
const int N = 1e4 + 5;
int n , m, tot;
int fx[N], ans[N];
bool yz[1005][1005];
struct neq{int x, y;} a[N];
namespace Wisadel
{int Wfind(int x){if(x == fx[x]) return x;return fx[x] = Wfind(fx[x]);}bool cmp(neq A, neq B){return Wfind(A.x) == Wfind(B.x) ? Wfind(A.y) < Wfind(B.y) : fx[A.x] < fx[B.x];}short main(){freopen("str.in", "r", stdin) , freopen("str.out", "w", stdout);n = qr, m = qr;fo(i, 1, n) fx[i] = i;fo(i, 1, m){int x = qr, y = qr, z = qr;if(x == y && z != 0){printf("-1\n"); return Ratio;}if(z == 0) a[++tot] = {x, y};else{fo(j, 0, z - 1){int _ = Wfind(x + j), __ = Wfind(y + j);if(_ > __) swap(_, __);fx[__] = _;}if(x + z > n || y + z > n) continue;a[++tot] = {x + z, y + z};}}sort(a + 1, a + 1 + tot, cmp);fo(i, 1, tot){int _ = Wfind(a[i].x), __ = Wfind(a[i].y);if(_ == __){printf("-1\n"); return Ratio;}if(ans[_] != ans[__]){yz[_][ans[__]] = yz[__][ans[_]] = 1 ; continue;}if(_ > __) swap(_, __);int zc = ans[_];yz[__][zc] = 1;while(yz[__][zc]) zc++;ans[__] = zc, yz[_][zc] = 1;}fo(i, 1, n) printf("%d ", ans[Wfind(i)]);return Ratio;}
}
int main(){return Wisadel::main();}

B. 寻宝

真·签。

过的人比 T1 多,那就简单说说好了。

还是用并查集,将完全相连的点聚合到一个连通块内,然后对于传送门,我们将连通块连上单向边,然后查询时每次对连通块跑一遍 bfs 即可,复杂度最差是 \(\mathcal{qk}\) 的,总复杂度 \(\mathcal{O(nm+qk)}\)

点击查看代码
#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;
#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 pii pair<int , int>
#define fi first
#define se second
const int Ratio = 0;
const int N = 5e4 + 5;
int n, m, k, q;
int fx[N];
int hh[N], to[N << 1], ne[N << 1], cnt;
bool yz[N];
char ch[N];
namespace Wisadel
{void Wadd(int u, int v){to[++cnt] = v;ne[cnt] = hh[u];hh[u] = cnt;}int Wfind(int x){if(x == fx[x]) return x;return fx[x] = Wfind(fx[x]);}bool Wsol(int x, int tar){if(x == tar) return 1;memset(yz, 0, sizeof yz);queue<int> q;q.push(x);while(q.size()){int u = q.front(); q.pop();yz[u] = 1;for(int i = hh[u]; i != -1; i = ne[i]){int v = to[i];if(!yz[v]){yz[v] = 1;if(v == tar) return 1;q.push(v);}}}return 0;}short main(){freopen("treasure.in", "r", stdin) , freopen("treasure.out", "w", stdout);n = qr, m = qr, k = qr, q = qr;memset(hh, -1, sizeof hh);fo(i, 1, n * m) fx[i] = i;fo(i, 1, n) fo(j, 1, m) scanf(" %c", &ch[(i - 1) * m + j]);fo(i, 1, n)fo(j, 1, m){int _ , __;if(j != m && ch[(i - 1) * m + j] == '.' && ch[(i - 1) * m + j + 1] == '.'){_ = Wfind((i - 1) * m + j), __ = Wfind((i - 1) * m + j + 1);if(_ > __) swap(_, __);fx[__] = _;}if(i != n && ch[(i - 1) * m + j] == '.' && ch[i * m + j] == '.'){_ = Wfind((i - 1) * m + j), __ = Wfind(i * m + j);if(_ > __) swap(_, __);fx[__] = _;}}fo(i, 1, k){int xa = qr, ya = qr, xb = qr, yb = qr;int za = (xa - 1) * m + ya, zb = (xb - 1) * m + yb;int _ = Wfind(za), __ = Wfind(zb);Wadd(_, __);}fo(i, 1, q){int xa = qr, ya = qr, xb = qr, yb = qr;int za = (xa - 1) * m + ya, zb = (xb - 1) * m + yb;int _ = Wfind(za), __ = Wfind(zb);if(Wsol(_, __)) printf("1\n");else printf("0\n");}return Ratio;}
}
int main(){return Wisadel::main();}

C. 序列

\(\mathcal{O(n^2)}\) 做法很显然,对于给定的 \(p_i\)\((l,r)\) 使得答案最大,我们可以将其拆成求 \([l,p_i]\)\((p_i,r]\) 这两个区间分别的最大值,维护个前缀和实现 \(\mathcal{O(1)}\) 查询 \(a_i\)\(b_i\) 的区间和,就能达到 \(\mathcal{O(nm)}\) 的复杂度。

有了前缀和的优化,此时我们所求可以转化为 \((A_r-A_l)-k\times (B_r-B_l)\) 的最大值,我们可以将其拆成两个式子 \(A_r-B_r\times k\)\(-A_l+B_l\times k\),可以看做是 \(k\) 为自变量的一次函数。维护一次函数最值问题遂想到李超线段树,将询问离线下来按 \(p_i\) 升序排序,分别求两个式子的最大值然后加和就是最终答案,时间复杂度 \(\mathcal{O(n\log^2n+m\log n)}\)

还有,这道题 \(k\le|10^6|\),所以空间大小应该是 \(10^6\times 2^3\)

点击查看代码
#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;
#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 pii pair<int , int>
#define fi first
#define se second
const int Ratio = 0;
const int N = 1e6 + 5;
const int maxn = 1e6 + 2;
int n, m;
ll a[N], b[N], suma[N], sumb[N], ans[N];
struct rmm{ll p, k; int id;} q[N];
bool cmp(rmm A, rmm B){return A.p < B.p;}
struct edge{ll k, b; edge(){b = -1e18, k = 0;}} e[N << 3];
namespace Wisadel
{#define ls (rt << 1)#define rs (rt << 1 | 1)#define mid ((l + r) >> 1)ll W(ll x, ll k, ll b){return k * x + b;}void Wins(int rt, int l, int r, ll k, ll b){ll bf = W(mid, e[rt].k, e[rt].b), now = W(mid, k, b);if(now > bf) swap(k, e[rt].k), swap(b, e[rt].b);if(l == r) return;if(W(l, k, b) > W(l, e[rt].k, e[rt].b)) Wins(ls, l, mid, k, b);if(W(r, k, b) > W(r, e[rt].k, e[rt].b)) Wins(rs, mid + 1, r, k, b);}ll Wq(int rt, int l, int r, int x){ll res = W(x, e[rt].k, e[rt].b);if(l == r) return res;if(x <= mid) res = max(res, Wq(ls, l, mid, x));else res = max(res, Wq(rs, mid + 1, r, x));return res;}short main(){freopen("seq.in", "r", stdin) , freopen("seq.out", "w", stdout);n = qr, m = qr;fo(i, 1, n) a[i] = qr, b[i] = qr, suma[i] = suma[i - 1] + a[i], sumb[i] = sumb[i - 1] + b[i];fo(i, 1, m) q[i].id = i, q[i].p = qr, q[i].k = qr;sort(q + 1, q + 1 + m, cmp);int now = 1;Wins(1, -maxn, maxn, 0, 0);fo(i, 1, m){// - A_l + B_l\times kwhile(now <= n && now + 1 <= q[i].p)Wins(1, -maxn, maxn, sumb[now], -suma[now]), now++;ans[q[i].id] += Wq(1, -maxn, maxn, q[i].k);}fo(i, 1, maxn << 3) e[i].k = 0, e[i].b = -1e18;now = n;fu(i, m, 1){// A_r - B_r\times kwhile(now >= 1 && now >= q[i].p)Wins(1, -maxn, maxn, -sumb[now], suma[now]), now--;ans[q[i].id] += Wq(1, -maxn, maxn, q[i].k);}fo(i, 1, m) printf("%lld\n", ans[i]);return Ratio;}
}
int main(){return Wisadel::main();}

D. 构树

二项式反演,是上一届某某模拟赛的原题,有点复杂。

最基础的暴力,考虑一共有哪些边,直接 \(\mathcal{O(2^{总边数})}\) 枚举取不取这条边,最后再跑一遍看看和原来有几条边相同,能拿 25pts。挺多能剪枝的地方的,好好剪应该能过 40pts 左右。

然后 5k 那个式子,暴力用能到 75pts。

正解仙姑。

刚来第一场,打的其实还行。

T1 挂 40pts 感觉不太应该,这种细节问题应该再多想想的,读完题立马把能想到的细节写下来,然后最后再对照着细节出小点尝试 hack 自己。

整体上还是打得可以的,T2 T3 T4 都没挂。

在 hzoi 里挂不挂都是 Rank4,但是在 accoder 上没挂 Rank16,挂了 Rank30,感觉不能太坐井观天了,还是得有点危机意识,紧张起来。


完结撒花~

最后一张了。

image

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

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

相关文章

CSS display属性 inline-block flex grid

CSS display inline-block flex grid ======================================= CSS的display属性是一个核心属性,用于控制元素如何在页面布局中显示,包括其盒模型的行为。以下是display属性的一些常见值及其示例代码:1. block 说明:将元素变为块级元素,独占一行,可以…

[39] (多校联训) A层冲刺NOIP2024模拟赛01

你们不感觉最近机房网越来越慢了吗,现在下个 10M 的东西要用三分钟,而且期间访问不了网站 整个机房分 1000Mbps 的带宽为啥只能分这么一点, huge 拿我电脑挖矿了? 本来以为多校就是多校的,结果是真的多校,一百一十多个人在一块考 huge: 参加的都是咱们北方这几个强校 你说…

事故分享——关于Conda激活环境失败并报gbk相关错误

事情是今天打开了pwsh,突然发现conda的环境没了,启动时提示:UnicodeEncodeError: gbk codec cant encode character \xe5 in position 884: illegal multibyte sequence在网上搜索了许多相关的资料,一度怀疑是代理等问题。 进行过的尝试:清理conda缓存,更新conda版本,删…

【闲话】高一上运动会

“加油,加油!”虽然没有上场,但记忆也为本次运动会的举办做出了许多努力!想喝矿泉水的话,就请记忆帮你拿一瓶吧!心跳节拍弥梦离 “加油,加油!”虽然没有上场,但记忆也为本次运动会的举办做出了许多努力!想喝矿泉水的话,就请记忆帮你拿一瓶吧!活力四射超神龙女 代表…

信息学奥赛复赛复习10-CSP-J2020-03表达式求值-栈、后缀表达式、isdigit函数、c_str函数、atoi函数、链式前向星、数据结构、深度优先搜索

PDF文档公众号回复关键字:202410031 P7073 [CSP-J2020] 表达式 [题目描述] 小 C 热衷于学习数理逻辑。有一天,他发现了一种特别的逻辑表达式。在这种逻辑表达式中,所有操作数都是变量,且它们的取值只能为 0 或 1,运算从左往右进行。如果表达式中有括号,则先计算括号内的子…

群晖docker实现稍后阅读wallabag

开篇 本文基于 docker 和 github 开源项目 wallabag 关于群晖安装, 在项目的说明文档里面显示他们在群晖社区里面提供了一个套件, 但我在添加社区以后并没有找到, 所以采用了 docker 方式 拉取镜像Ssh 链接群晖, sudo -i 进入 root 权限 使用命令 docker run -v /opt/wallabag/…

bing chat 该服务在你所在的地区不可用。

一是:在浏览器搜索结果页-更多中,将国家或地区更改为非中国大陆。 二是:在浏览器设置-语言中,将语言更改为非中文简体的语言,这里语言是可以更改回来。 三是:重新注册一个新的Microsoft 账号,推荐谷歌邮箱进行注册。编程是个人爱好

[错误代码]SQLSTATE[HY000] [1045] Access denied for user 20241001@localhost (using password: YES)

这个错误提示 SQLSTATE[HY000] [1045] Access denied for user 20241001@localhost (using password: YES) 表示 MySQL 认证失败,通常是由于用户名或密码不正确导致的。 解决方法检查用户名和密码 确认使用的用户名和密码是否正确。重置密码 如果忘记密码,可以重置密码。检查…

国庆快乐!附ssh实战

小伙伴们,有一段时间没更新了,目前在中科院软件所实习,在这里我祝大家国庆快乐!今天这一期带来ssh命令的实战教程,ssh在工作当中遇到的非常多,因为总是需要登服务器,而且玩法也有不少,这是我常用的几个玩法。 1、Windows直接连接虚拟机启动的Linux。 ssh user@IPV42、从…

当前页面出现致命错误,详细报错请切换至开发模式调试

切换到开发模式:获取详细的错误信息。 检查列定义:确认 Color 列的定义是否合理。 修改列定义:如果需要,增加列的长度。 重新导入数据:确保数据符合新的列定义。希望这些步骤能帮助你解决问题。如果有更多详细的信息,请随时提供。扫码添加技术【解决问题】专注中小企业网…

【软考】2 码制 / 机器数

概念 机器数只能以二进制方式表示,大类分为【无符号数】和【有符号数】 【无符号数】在机器数中没有符号,表示正数 【有符号数】在机器数中有符号,包含正数的其他数值,存在四种操作:【原码】【反码】【补码】【移码】 一、原码 最高位作为符号位进行正数和负数表示 剩余低…

基于selenium的爬取dblp论文的python爬虫

出于阅读文献的需要,导师让我写一个能够爬取dblp上文献资料的爬虫,话不多说,开学。 学习路径总结前端基本知识 request库与bs库 目标特征,规划爬取步骤 动态加载的应对方法-selenium前端基本知识 前端开发是指创建Web页面或应用程序用户可以与之交互的部分。前端开发主要涉…