首页 > 其他分享 >NOIP2024模拟赛8 赛后总结

NOIP2024模拟赛8 赛后总结

时间:2024-09-25 19:11:51浏览次数:1  
标签:2e9 int tree maxn NOIP2024 ans 赛后 模拟 size

前言

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

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

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

考虑到 \(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;
}

标签:2e9,int,tree,maxn,NOIP2024,ans,赛后,模拟,size
From: https://www.cnblogs.com/SFsaltyfish/p/18432012

相关文章

  • 20240925 模拟赛总结
    期望得分:100+85+30+0=215实际得分:100+65+30+0=195。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。还是没啥长进哈。T1二进制位数是关键一招,位数相同怎么异或都会小,位数不同怎么异或都......
  • [湖北省选模拟 2023] 棋圣 / alphago 题解
    很牛的题目啊。-Alex_Wei发现这个操作比较复杂但限制较弱,考虑通过考察“不变的量”来刻画操作。容易发现若为二分图,则初始颜色不同的一定不能移动到一起。又因为在存在环的图上这个限制很弱/目前较难考虑,所以先考虑树的情况,发现答案存在可能取到的上界,令\(c_{i,j}\)为初......
  • 2024.9.2-CSP模拟赛1
    考试:大约在9:40左右发了题。9:45把所有的题目都快速看了一遍,T1感觉模拟可能会T,T2最小生成树的板子,T3又是追及问题感觉要挂,T4感觉像是区间DP。9:50开始做T1,先是手搓了一个gcd又手动模拟了取模(想起了xqy因为取模导致的TLE),样例输出得都挺快的。但是看了一眼数据......
  • 2024.9.3-CSP模拟赛2
    考试:9:00开题:第一题第一眼数据范围\(1\len\le5\times10^7\),感觉有T的风险。第二题littlebird,记得在以前做过这道题。第三题不太会,没有给部分分的比值,感觉只能写个暴搜。\(O(n^2)\)的暴力肯定会,正解先待会再想。9:10做T1,直接写暴力,5分钟写完了。试了一下500......
  • 2024.9.5-CSP模拟赛4
    考试:9:00~9:10看题:T1:很久之前做过,没有什么印象了。T2:感觉是广搜,但有可能要爆。T3:搜索题,猛加优化。T4:不知道是什么类型的题目。9:10~9:50写T1,已经忘了怎么写的,只能当做一道新题来做。写了个贪心,分了2中情况进行讨论,样例和自造样例都过了,但肯定会WA。其实在写计算的......
  • 2024.9.4-CSP模拟赛3
    考试:9:00~9:25怎么还不发卷啊,等得有点慌了,这是在考验心态吗?原来是极域出了点问题9:25~9:35发卷了,先看题。T1:相对距离,这不是原题吗,这题能做。T2:平衡队列,数据有点大,要不要离散化?好像不用,先等会在仔细看看。T3:第一眼数据范围:\(1\leN\le100\),直接弗洛伊德呀。T4:是并查集吗......
  • 2024.9.6-CSP模拟赛5
    考试:9:00~9:10发卷:T1有想法但要思考一下。T2水题,秒切。T3状压,昨天晚上就在看,但没看完只听了思路。T4看上去是原题,可以做一做。9:10~9:30先做T4,真是原题,直接写。直接写了归并排序,前面又补了一个0,然后求了逆序对。样例很快就过了就放了。9:30~9:50直接写了T2,T2......
  • 模拟船舶的货物卸载过程,并计算总物流时间和转弯次数 python代码
    一个模拟物流操作的脚本,它处理船舶货物的卸载,并将货物运送到堆场。代码主要包含以下几个部分:1.**参数设置**:  -`NUM_FORKLIFTS`:每个堆场的叉车数量。  -`SHIP_CARGO`:每艘船舶的货物量(吨)。  -`CARGO_PER_TRUCK`:每辆叉车能运输的货物(吨)。  -`LOADING_TIME......
  • uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款
    uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款等功能,界面漂亮颜值高,视频商城小工具等,蚂蚁森林种树养鸡农场偷菜样样齐用于视频,商城,直播,聊天等sumer-alipay介绍uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝......
  • C++模拟真人鼠标轨迹
    一.API跨语言平台支持`鼠标轨迹API`[https://winsdk.cn/]()底层实现采用C/C++语言,利用其高性能和系统级访问能力,开发出高效的鼠标轨迹模拟算法。通过将算法封装为DLL(动态链接库),可以方便地在不同的编程环境中调用,实现跨语言的兼容性。通过DLL封装,开发者可以在C++、Pytho......