首页 > 其他分享 >杭州集训 Day 2

杭州集训 Day 2

时间:2024-10-23 09:00:11浏览次数:1  
标签:线段 mid 集训 枚举 区间 可以 维护 杭州 Day

课前

由于昨晚打了 ABC 很坐牢所以多睡了一会 6:30 才起,酒店的饭又贵又难吃于是我们选择点外卖,但是早上的外卖都是 \(20\) 元起送,很麻烦,所以和 htdlz 拼了一单。花十块钱买了粥,没吃完,最后吃的 hanss6 的榨菜才咽下去。

今天 hs_black 没有迟到,但是讲的题很抽象,六个小时讲二十多个数据结构题着实吓人。

笔记

P4168

预处理 \(a[i][j]\) 表示第 \(i\) 块到第 \(j\) 块的众数,预处理 \(cnt[i][j]\)
表示第 \(i\) 种蒲公英在前 \(i\) 块的出现次数。记录零散块里面每个颜色出现了多少次,并加上其在中间一部分的出现次数作为潜在众数更新答案。

P3203

分块,维护 \(f_i\) 表示到达 \(i\) 号点后第一次弹出其所在块会弹到哪个点,并且记录弹跳次数。这样每次都能跳出一整块,最多跳 \(\sqrt n\) 次。维护 \(f_i\) 可以每次修改直接重构整个块

P2391

倒序操作,需要支持将区间没有染色的地方染色。

并查集,暴力染色,并删除染过的地方。令 \(f[i]\) 从 \(i\) 开始第一个没有染色的地方。染色后将 \(f[i]\) 设置为 \(f[i]+1\),利用并查集维护。

CF571D

如果得到某个位置最后一次清 \(0\) 是什么时刻,那么只考虑这个时刻之后的加法操作即可。

我们用启发式合并维护信息,第二类集合维护上一次清零的时间,清零就在根结点处打 \(tag\),需要记录连接的时间。

然后可以离线下来,变成前缀和相减。

加法操作可以记录自己连上来时候父亲的 \(tag\),查询时拿父亲的 $ tag$ 减去记录的值即为正确的答案。

P4755

对于当前区间 \([l,r]\) ,先判断区间长度是否为 \(1\),为 \(1\) 只需要特判当前这个数是不是 \(1\) 即可。

否则找区间最大值的位置 \(mid\), \(ST\) 表维护。之后统计过 \(mid\) 的所有 \([l,r]\),递归计算 \([l,mid-1],[mid+1,r]\) 即可。

枚举 \(mid\) 的一边。假设枚举的数是 \(a_i\),需要在 \(mid\) 的另一边找到一个 \(a_j\),满足 \(a_i*a_j\leqslant a_{mid}\),即 \(a_j\leqslant \lfloor\frac{a_{mid}}{a_i}\rfloor\)。

现在问题变为统计一个区间内小于某个数的个数,可持久化线段树维护。

枚举时用启发式的思想,只枚举区间长度小的那边,就可以做到\(O(nlog^2n)\)。\(a_i\) 很大,要离散化。

P1972

离线下来,按照右端点从小到大排序。为了保证每个颜色只贡献一次,让其在最右边的点贡献,其他的点设为 0 贡献。直接求后缀和。

CF1000F

设 \(pre_i\) 表示上次出现的时间,如果存在 \(pre_i<l\) 说明有只出现一次的数,维护 \(pre_i\) 的最小值

CF522D

将询问离线下来,将 \(r\) 从小到大排序,每个点记录和下一次出现的距离,如果下一次超过 \(r\) 距离为无限,查询区间最小值即可。

P4247

听懂了但也仅限于听懂了,不理解这么抽象的题就评个蓝

线段树上每个节点维护一个 \(f[j]\) 表示选出 \(j\) 个数相乘的和,那么合并两个节点就是 \(root.f[a+b]=∏left.f[a]\times right.f[b]\)

区间加,选 \(c\) 个数相乘,\(f[c]=∏a_i\),\(f'[c]=∏(a_i+t)=\sum t^i f[c-i] C_{len-c+i}^{i}\)

相反数,那么选奇数个取反,偶数个不变。

P5579

按照 \(a_i\) 排序,发现序列每时每刻都是一个单增的序列,那么每次割草都是一个后缀。如果找到这个后缀就可以轻松割草,可以线段树上二分 + 区间赋值。线段树维护最大值,赋值标记,赋值时间,区间和。

SP2713

经过几次开方,答案就会变成 1,考虑暴力做直到一个区间里都是 1 为止。

P3722

对于一个区间,在其内部最大值上计算答案。

设 \(L[i]\) 表示左边第一个大于自己的下标, \(R[i]\) 表示右边第一个大于自己的下标。那么 \(L[i]\)~\(R[i]\) 的代价是 \(p1\),\(L[i]+1\)~\(R[i]\) 的代价是 \(p2\),\(L[i]\)~\(R[i-1]\) 的代价是 \(p2\)。统计价值:二维数点

CF526F

统计满足 \(max-min+1=r-l+1\) 的区间的个数。从左边到右边枚举 \(r\) ,我们发现一定有 \(max-min-(r-l)≥0\),也就是 \(max-min+l≥r\),线段树维护,如果最小值为 \(r\) ,答案就是 \(r\) 的个数,由于扫描的序列位置单调可以考虑使用单调栈维护更新扫描线,弹栈的话就对应区间加减。

P4378

对于每个数 \(x\),每次都会恰好把 \(>x\) 的一个数字交换到后面,如果没有说明序列排好序了。因此答案为 \(max(1,(\sum _{j<i}[a_j>a_i]))\)

P4375

省流:把题目给的代码改成 C++ 有 50pts,卡常后有 60pts

首先对于原数组进行离散化。第一次:找出一个最大值放到最后面。对于位置 \(x\),冒泡之后一定有一个大于 \(x\) 的数被放到了 \(x\) 后面。

第二次:找出一个最小值放到最前面。同理,对于位置 \(x\),一定有一个小于等于 \(x\) 的值放到了 \(x\) 的前面。

结论就是:\(ans = max(ans, x 前 > x 的数的个数)\)

P4372

称一个序列是有序的当且仅当所有点都是分割点,对于每个点它不用在进行冒泡排序了当且仅当两边都已成为分割点,也就是两边出现时间的最大值,可以求出每个点被排了几次。离散化,然后对于一个点 \(x\) 来说, 所有小于它的数却在它后面的, 每一次都会向前走一次,那么它出现的时间就是离它最远的小于它的点冒泡到它前面的时间,即那个点到它的距离,
所以单调队列或指针都可以维护。

P6225

如果 \(l,u\) 奇偶性不同,每个点贡献偶数次,答案是 \(0\)。

否则和 \(l,u\) 奇偶性相同的位置贡献一次,其他点贡献为 \(0\),所以我们用两个树状数组分别保存奇数位置的异或和和偶数位置的前缀异或和。

P3760

设前缀和为 \(s_i\),考虑二进制第 \(k\) 位,计算有多少对 \(s_j-s_i\) 的第 \(k\) 位为 \(1\),如果有奇数对,那么最终答案这一位就是 \(1\),否则这一位就是 \(0\)

枚举 \(s_j\) 如果 \(s_i=j\) 第 \(k\) 位是 \(1\):如果 \(s_i\) 第 \(k\) 位是 \(1\),那么产生借位才会让第 \(k\) 位是 \(1\),所以应该满足 \(s_j\) 第
\(k\) 位之后的部分 \(<s_i\) 第 \(k\) 位至后的部分。如果 \(s_i\) 第 \(k\) 位是 \(1\),那么不产生借位才会让第 \(k\) 位是 \(1\),所以应该满足 \(s_j\) 第 \(k\) 位之后的部分 \(≥s_i\) 第 \(k\) 位至后的部分。\(s_j\) 第 \(k\) 位是零同理。

条件为偏序关系,可以使用树状数组维护,开两个树状数组分别维护第 \(k\) 位为 \(1\) 或 \(0\) 的后 \(k-1\) 位部分即可。

CF718C

对于斐波那契数列显然可以矩阵加速递推,但是发现修改操作并不能直接线段树维护,因为其操作对象一个是 \(a\) 一个是 \(f\) ,所以考虑想办法统一操作对象这样就可以使用一颗线段树进行维护了。对于 \(a\) 的修改操作,可以直接等价理解为给 \(f\) 乘上 \(1110\) 那个矩阵的 \(x\) 次方,这样就可以用一颗线段树进行维护了。

P7453

直接维护三颗线段树并不现实,考虑维护操作矩阵。那么这七种区间修改可以认为是乘上一个矩阵,所以我们维护一个区间乘法懒标记,线段树即可(卡常)

P5537

考虑到每个点从根节点到其的路径是唯一的,设为 \(p_x\),可以将操作 \(1\) 转化为从根节点开始,在操作区间前加入一段序列。考虑中间经过的某个节点 \(x\),那么 \(p_x\) 一定为操作区间的一段前缀,二分 + 哈希即可。现在加上了修改,那么可以有 \(O(n \log^2 n)\) 的树状数组维护哈希值,也可以做线段树上二分变成单 \(\log\)

课后

决定加入绝区零了,崩铁能肝的都肝完了,静等新版本了。(不可能玩原的

标签:线段,mid,集训,枚举,区间,可以,维护,杭州,Day
From: https://www.cnblogs.com/spaceswalker/p/18494372

相关文章

  • 杭州集训 Day 1
    杭州集训Day1课前早上很早很早就起了,大概5:40吧,然后就感觉肚子疼。因为昨天晚上吃的喷射战士。在厕所足足待到6:00才出来。然后听了一会崩铁的演唱会回放,一直没来得及看,听了几首大概6:30收拾东西准备吃饭了。30元一顿的早饭,必须好好看看,结果啥也没有,素包子,“正宗烧麦”是......
  • 杭州 Day 4 下午 简单数学
    数学问题初等数论\(a|b\):\(a\)整除\(b\),也就是\(a\)是\(b\)的因数,\(b\)是\(a\)的倍数,\(b=ka\)取模取整:\(b=ka+r\),其中\(0≤r<a\),则称\(⌊\frac{b}{a}⌋=k\),\(b\moda=r\)。整数唯一分解定理:每个整数\(n\)可以唯一的写成\(\prodp_i^{k_......
  • 杭州 Day 4 上午 状压 dp
    状压一类杂题P1896[SCOI2005]互不侵犯先预处理出一行的所有可能状态\(S\),应当满足\(S\&(S≫1)=0\),因为不能有相邻的国王。用\(f(i,S,j)\)表示考虑了前\(i\)行,第\(i\)行的状态是\(S\),当前已经放了$$个国王的方案数。转移直接枚举第\(i−1\)行的状态\(T......
  • 杭州集训 Day 3
    课前早饭htdlz帮忙买的,一碗粥和三个不知名的糕点,粥并不好喝,但是糕点好吃。早上到了机房把这儿的小破电脑换成了自己的笔记本,屏幕大一点舒服一些。hs_black走了,今天换syksykccc来讲,syk开朗幽默的多,上课和机房这群很有话题。而且他甚至把他讲的每个题对应的代码打了,然后课后......
  • C++入门Day5 ~ 6:简单变量 & 数据类型 part 1 <8000字长文带你初步理解数据类型>
    这是我在学习中的一个小问题,希望对你也有所帮助:        问:数据类型和简单变量属于oop的基本概念吗?        答:不是!数据类型和简单变量本身并不属于面向对象编程(OOP)的基本概念,但它们是编程中的基础概念,面向对象编程会基于这些基础概念来构建更复杂的结构。......
  • 代码随想录算法训练营day22和day23 | 77. 组合 216.组合总和III 17.电话号码的字母
    学习资料:https://programmercarl.com/回溯算法理论基础.html回溯法backtracking:for循环控制递归数量,暴力搜索:组合、切割、子集、排列、棋盘今天学了组合和切割可以画个N叉树的图来帮助理解回溯过程组合又包括1.单个数组(要加startIndex参数)或多个数组;2.数组内有无重复元素;3.数......
  • Day22--下标越界及小结
    Day22--下标越界及小结数组的四个基本特点:长度是确定的,一旦被创建,大小不可改变。元素必须是相同类型,不允许混合类型。元素可以是任何数据类型,包括基本类型和引用类型。在Java中,数组对象在堆中。数组边界数组边界特点如下:下标的合法区间为[0,length-1],如果越界就......
  • NOIP2024集训Day58 字符串
    NOIP2024集训Day58字符串C.[CEOI2011]Matching发现要做的是排名串的匹配。考虑把它转成这个位置之前有多少个数小于当前这个数,这样就只要每个位置都对应相等的,那就一定是合法的。然后就可以类似KMP的预处理出一个\(nxt\)数组,然后再类似KMP的匹配。因为需要支持动态......
  • P2866 [USACO06NOV] Bad Hair Day S
    [USACO06NOV]BadHairDayS题目描述农夫约翰有NNN头奶牛正在过乱头发节。每一头牛都站在同一排面朝右,它们被从左到右依次编号为......
  • 「Day-4 提高笔记-LCA最近公共祖先」
    #include<iostream>usingnamespacestd;constintMAXN=5*1e5+5;structnode{ intto,next;}e[MAXN*2];intf[MAXN][20],dp[MAXN];//f[x][i]表示x的第2^i个节点的编号inth[MAXN*2],tot=0;intn,m,s;voidadd(intx,inty){ e[++tot]={y,h[x]}; h......