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

news/2024/10/3 17:56:44
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.ryyt.cn/news/67418.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

虚拟机类加载机制

1. 类加载时机 一个类型(接口/类)从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将历加载、验证、准备、解析、初始化、使用和卸载七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,…

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 账号,推荐谷歌邮箱进行注册。编程是个人爱好