NOIP2024模拟赛8 赛后总结

news/2024/9/25 19:24:24

前言

真正的宝石纵使无光,亦能闪耀。

今天的纯唐氏题目我居然不会做。

考试的时候脑子跟生锈了一样。

考虑到 \(1,2\) 题都太一眼了,这里就只总结一下最后两道题。

多重集

这道题目的重点是去观察对于 \(a_x,b_x,a_y,b_y\) 什么条件下 \(a_x+a_y\) 更小,以及什么条件下 \(b_x+b_y\) 更小。

其实判定条件是多种多样的,我这里写一种比较简洁的,跟题解是一样的,但是跟我考试的时候推出来的柿子不太一样(其实两者都可以做)的判定条件:

  • 定义 \(h_x=a_x-b_x(x\in A),h_y=b_y-a_y(y\in B)\)

  • 显然,稍微写一下式子就可以得到,当 \(h_x\le h_y,\min=b_x+b_y\)。反之亦然。

故我们考虑以 \(h_x\) 为下标开一颗权值线段树,在合并的时候,左儿子和右儿子本身就满足 \(h\) 的偏序关系,所以你就可以大胆将合并,只需要维护 \(A,B\) 集合 \(h\) 在这个区间中 \(a,b\) 的最小值即可。然后合并的时候维护答案。

观察到有 \(n\le 10^6\),故你还是考虑一个离散化防止出事,然后注意到有可能 \(h_x\) 对于不同的 \(x\) 可能会相同,故你要对权值线段树的叶子节点要开一个 \(\texttt{multiset}\),只向上传有用的就行了。

也不知道考试发生了什么,前面的都想到了,但是一直在想将 \(A,B\) 分别开一颗独立的线段树,然后看怎么合并统计答案,却忘了线段树上本质上是有偏序条件的啊啊啊啊啊。

#include <bits/stdc++.h>
using namespace std;
#define maxn 1000005
int q;
int op1[maxn], op2[maxn], x[maxn], y[maxn];
int ls[maxn], lslen;
struct segmentree
{int l, r;long long data[4], ans;//min(a,b) max(a,b)
}tree[maxn << 2];
multiset<long long> s[maxn][4];
void build(int p, int l, int r)
{tree[p].l = l, tree[p].r = r;tree[p].ans = 2e9;for (int i = 0; i < 4; ++i) tree[p].data[i] = 2e9;if(l == r) return;int mid = (l + r) >> 1;build(p << 1, l, mid), build(p << 1 | 1, mid + 1, r);
}
void change(int p, int x, int y)
{if(tree[p].l > x || tree[p].r < x) return;if(tree[p].l == tree[p].r){int d = op2[y] ? 2 : 0, l = tree[p].l;if(op1[y]){s[l][d].insert(::x[y]);s[l][d + 1].insert(::y[y]);}else{s[l][d].erase(s[l][d].find(::x[y]));s[l][d + 1].erase(s[l][d + 1].find(::y[y]));}tree[p].ans = 2e9;if(s[l][0].size() && s[l][2].size()) tree[p].ans = (*s[l][0].begin()) + (*s[l][2].begin());if(s[l][1].size() && s[l][3].size()) tree[p].ans = min((*s[l][1].begin()) + (*s[l][3].begin()), tree[p].ans);for (int i = 0; i < 4; ++i) tree[p].data[i] = s[l][i].size() ? (*s[l][i].begin()) : 2e9;return;}change(p << 1, x, y), change(p << 1 | 1, x, y);for (int i = 0; i < 4; ++i) tree[p].data[i] = min(tree[p << 1].data[i], tree[p << 1 | 1].data[i]);tree[p].ans = min(tree[p << 1].ans, tree[p << 1 | 1].ans);tree[p].ans = min(tree[p << 1].data[2] + tree[p << 1 | 1].data[0], tree[p].ans);tree[p].ans = min(tree[p << 1].data[1] + tree[p << 1 | 1].data[3], tree[p].ans);
}
int main()
{scanf("%d", &q);for (int i = 1; i <= q; ++i) scanf("%d %d %d %d", &op1[i], &op2[i], &x[i], &y[i]), ls[++lslen] = (op2[i] ? y[i] - x[i] : x[i] - y[i]);stable_sort(ls + 1, ls + lslen + 1), lslen = unique(ls + 1, ls + lslen + 1) - ls - 1;build(1, 1, lslen);for (int i = 1; i <= q; ++i){int h = (op2[i] ? y[i] - x[i] : x[i] - y[i]);h = lower_bound(ls + 1, ls + lslen + 1, h) - ls;change(1, h, i);if(tree[1].ans >= 2e9) puts("-1");else printf("%lld\n", tree[1].ans);}return 0;
}

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

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

相关文章

mini-lsm通关笔记Week2Overview

Week 2 Overview: Compaction and Persistence在上周,您已经实现了LSM存储引擎的所有必要结构,并且您的存储引擎已经支持读写接口。在本周中,我们将深入探讨SST文件的磁盘组织,并研究在系统中实现性能和成本效益的最佳方法。我们将花4天时间学习不同的compaction策略,从最…

001-什么是VOQ

1、什么是VOQ(Virtual Output Queues)? VOQ(虚拟输出序列)是一种存储结构,由FIFO与RAM以及逻辑结构组合构成。在一些数据应用场景中能够有效存储数据并且能够及时输出,避免阻塞。一句话来说VOQ的优点在于:共享存储,较少存储资源,避免数据阻塞,提高数据输出效率。 2、…

MIT6.824 课程-Aurora

Aurora原文:https://xie.infoq.cn/article/09849d56c3b18064af6c7f857 搬运用于参考学习ABSTRACT Amazon Aurora 是一个关系型数据库服务,其作为 Amazon Web Services(AWS)的一部分为 OLTP 业务提供服务。本文描述了 Aurora 的体系结构以及设计该结构时的一些思考。我们认为高…

pl/sql小技巧

pl/sql中文乱码 select userenv(language) from dual cmd命令行 set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK pl/sql拖到cmd窗口下执行 pl/sql 显示行号pl、sql字体大小调整

结对项目-四则运算

github链接这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 实现四则运算自动生成程序,结对协作开发姓名 学号柳浩 3122004444洪吉潮PSP表格PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)Planning 计划 20 25Esti…

java作业

要求做几道练习题,体会java一些比较细的知识点 1. • 第一行输出false是因为这行代码比较两个枚举变量s和t是否引用同一对象。s被赋值为Size.SMALL,而t被赋值为Size.LARGE。由于它们引用不同的枚举实例,所以输出为false。 • 第二行输出false是因为这行代码首先通过s.getCla…

基于Sentinel自研组件的系统限流、降级、负载保护最佳实践探索

一、Sentinel简介 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: •丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、…