首页 > 其他分享 >20231024 集训

20231024 集训

时间:2024-01-31 22:36:16浏览次数:40  
标签:20231024 子树 子树内 线段 叶子 区间 集训 翻转

NOIP2023-div2模拟赛25

A

原题

发现实际上是一个直角边与坐标系垂直的直角三角形,直角顶左上且其上字符为 J,右边的字符是 O,底下的字符是 I。于是可以在 J 处统计贡献,另外两个做后缀和处理即可。

B

卡常做法里不要写 #define int long long !!!

\(O(n\log n)\):所有数按数值从大到小排序,从后往前扫,依次删除当前数所在下标,然后往前找 \(1 \cdots lim\) 阶前驱,可以使用链表维护。

\(O(nlim)\):注意到若一个点后面有多于 \(lim\) 个大于等于它的,则这个点不会再产生贡献,可以直接删掉。于是可以维护一个链表,对于每个点直接暴力跳前驱,若这个前驱权值大于等于当前点权值,则统计答案,统计到 \(lim\) 个答案后就可以 break 了。若小于等于,则增加其标记,若标记等于 \(lim\) 则直接删。复杂度均摊为 \(O(nlim)\)。

C

写的是贪心做法。考虑到肯定先给能更快收到水的叶子供水(即 \(dep[i]\) 更小的),我们将所有叶子按深度排序,从前往后保证每片叶子的供水。一片叶子的供水量是其到根的路径上流量最小值,可以直接暴力跳父亲统计。然后再把到根路径上的所有流量减掉该叶子的供水量。考虑如何统计答案。发现前 \(n\) 个时间点所有叶子收到水的总量可能会变(因为可能有的叶子预定的供水量还在路上),所以先枚举前 \(n\) 个时间点。在 \(n\) 个时间点之后,由于所有叶子每个时刻收到的总水量都固定了,所以可以直接算。时间复杂度 \(O(n^2)\)。

D

考试的时候甚至没有往二叉树那方面想?!

观察题目,发现每次翻转的区间都很整齐。如果把整个序列看成一棵二叉树,会发现每次翻转的实际上是某一层连续的若干子树(所代表的区间)。如果 \(l_i = r_i\) 的话,其实可以线段树维护区间逆序对数和跨区间中点的顺、逆序对数(下称 \(v_0, v_1\))。然后发现翻转操作只会将跨过区间中点的顺、逆序对互换,于是就很好维护。对于 \(l_i, r_i\) 不相等的情况,考虑线段树维护区间内的子树翻转。发现任意一条线段树扔到线段树上都会变成 \(log\) 条线段。而翻转的子树区间也一样。只不过更大的线段(子树)代表若干包含于其中的线段(子树)的 LCA。于是问题变成给 \(x\) 子树内(全局)深度为 \(d\) 的所有后代的子树都执行翻转,然后维护区间逆序对。先考虑如果只翻转一棵后代 \(y\) 的子树是什么情况。显然 \(x\) 子树内逆序数的变化就等于 \(y\) 的子树内逆序数的变化。所以我们可以在 \(x\) 处维护 \(y\) 的 \(v_0, v_1\)。同样,如果翻转某一深度 \(d\) 的全部子树,那 \(x\) 子树内逆序数的变化就等于这些子树内逆序数的变化量加起来。所以我们只需要在 \(x\) 处维护其子树内所有深度的 \(v_0, v_1\) 即可。然后对 \(x\) 子树内的每个深度 \(d\) 开 \(tag\) (用 int 状压)记录 \(d\) 是否要被翻转。打 \(tag\) 的时候直接遍历一遍深度看这个深度要不要被翻转即可。复杂度 \(O(n2^n + n^2m)\)。

标签:20231024,子树,子树内,线段,叶子,区间,集训,翻转
From: https://www.cnblogs.com/forgotmyhandle/p/18000269

相关文章

  • 20230918 集训
    A.操作题目大意有一个长为\(n\)的、初始全为\(0\)的数组和\(m\)次操作。操作分两种:1lr:将下标区间\([l,r]\)内的数全加\(1\);2lr:将下标区间\([l,r]\)内的操作再执行一遍。求所有操作结束后数组内每个数。\(1\leqn,m\leq1e5\),保证各操作合法。思路简......
  • 2024初三年前集训测试1
    前言总分:\(210\)\(T1\):\(40\),挂了\(60\),没考虑到他最后可能没有“句号”\(T2\):\(100\),\(Hash\)套\(map\)最劣解\(A\)掉了,直接用\(map\)实际上也能过。\(T3\):\(70\),忘记判断无解挂了\(20\)。跑的最短路,发现会被\(Hack\)调了好久,到最后自己造的\(Ha......
  • 6.【2024初三年前集训测试1】
    \(\Huge打了一场模拟赛,又垫底了。qwq\)2024初三年前集训测试1T1学说话\(100pts\)水题,秒了。单词被下划线分隔开,对于每个单词来说,只要记录最长的单词长度,用\(tot\)临时记录,遇到下划线就清零,\(ans\)记录最大值,最后输出即可。代码#include<bits/stdc++.h>#defineintl......
  • 2024初三年前集训测试1
    2024初三年前集训测试1\(T1\)学说话\(100pts\)找到下划线后将计数器归零。点击查看代码strings;intmain(){freopen("word.in","r",stdin);freopen("word.out","w",stdout);intans=0,num=0,len,i;cin>>s;len=s.si......
  • 2024初三年前集训测试1
    2024初三年前集训测试1我TM以后比赛不造数据对拍就TM是大傻逼打了2hours,觉得挺简单的,于是交了就润了。所以我是傻逼。T1:显然题,但scanf("%c",&a)\(\to\)scanf("%c",&a),\(100pts\to30pts\)wkh2008精通科技,可是我不会。科技#include<bits/stdc++.h>using......
  • 寒假集训纪要
    1.28KMP算法匹配intj;j=0;for(inti=1;i<=la;++i){while(j&&b[j+1]!=a[i])j=next[j];if(b[j+1]==a[j])j++;if(j==lb){cout<<i-lb+1<<'\n';j=next[j];}}处理next数组j=0;for(inti=2;......
  • 寒假集训Day10
    前缀和https://www.luogu.com.cn/problem/P2280一维前缀和维护一个前缀和数组,使得每一个元素num[i]等于从a[1]到a[i]所有元素之和,一位前缀和非常好写。这个时候如果我们要求某一区间[l,r]中所有元素的和,只需要用num[r]-num[l-1]即可二维前缀和我们用num[i][j]表示从(1,1)到(......
  • 六至水土,出水土记,一千言,写在寒假集训的最后几页
    前言写这篇回忆入魔咕咕了其他随笔忘了吃饭了所以也不是上课摸鱼吧写一些平平淡淡的事可能有些个人色彩了假如就是一个平行世界的水土和xndxfz吧不想看就不看都挺好多年前一至水土重庆卖的房子比较多价格也在涨我爸的一个高中同学是房屋中介公司和水土某楼盘有合作......
  • 2024寒假集训日记
    1.27闲话做题纪要CF1433ETwoRoundDances详见CF1433ETwoRoundDances题解。CF739AAlyonaandmex详见CF739AAlyonaandmex题解。1.28闲话做题纪要luoguP1993小K的农场详见【学习笔记】差分约束。luoguP3275[SCOI2011]糖果详见【学习笔......
  • 第一次 10天校内集训总结
    这十天,作为第一次在校集训,无疑即是高效的,也是收获满满的;首先,我十分感谢Lyn学长十天以来的辛勤付出然鹅在这十天以来也发现了不少问题;1.与题解的抗争可能是由于学长的速度有些快,而且本人在秋季培训中也没有太过认真的打下一个所谓牢靠的基石(根本原因);因而除了在开始复习语言基......