Noip前的大抱佛脚----数据结构

数据结构

线段树

注意:空间开4倍

神奇标记

From8.26 Test_zsy(CPU监控)

如果一个点权为\(val\)的点被打上了\((a,b)\)标记,那么他的实际点权为\(max(a+val,b)\)

干啥滴?

标记不下放

  • 区间加标记不下放,维护区间max或者最大值

方法是当前\(tag\)维护当前区域标记,\(t\)维护左右儿子的\(max+tag[now]\),并没有快多少,如果仍然忘记见提交记录

并查集

维护二分图

并查集每个点维护是否要改颜色,然后按秩合并/按大小合并即可

实际上可以说是用期望树高为\(logn\)的树形结构维护信息

维护后继位置

快速得到后继位置

  • [BZOJ2054]疯狂的馒头 维护数列的后继位置

    对一个数列进行\(10^7\)次区间覆盖,查询最终颜色。

    倒序做,每次做完一个区间把\([l,r]\)的并查集父亲指向\(r+1\),表示扫到该区间,要从\(r+1\)开始染色,这样就可以快速得到下一个染色的位置,复杂度为\(O(n)\)

  • [BZOJ2238]Mst 维护树形结构的后继位置

    对树上路径进行染色,查询最终颜色。

    路径拆成直上直下的两条,\(x,lca、y,lca\),于是每次弄完把\([x,lca]\)的并查集父亲指向\(fa[lca]\),就可以类似数列一样快速求得下一个位置了,复杂度为\(O(n)\)

对于所有的父子结构,一定都有父亲的优先级大于左右儿子的优先级

可并堆的可持久化

左偏树可持久化,每次合并两个堆,只需要给经过的\(log\)个结点复制一遍就好了

#define lc H[x].ch[0]
#define rc H[x].ch[1]
struct heap {int ch[2],dis;double w;}H[M];
int Merge(int x,int y)
{
    if(!x||!y) return x+y;
    H[++node]=H[x];x=node;
    if(H[x].w>H[y].w) swap(x,y);
    rc=Merge(rc,y);
    if(H[lc].dis<H[rc].dis) swap(lc,rc);
    H[x].dis=H[rc].dis+1;
    return x;
}

这个可以用来完成\(k\)短路问题

dsu on tree

姑且叫它数据结构

方式&原理

步骤:

  • 先递归做轻儿子的答案,再递归做重儿子的答案
  • 暴力把当前结点的轻儿子扫一遍统计答案
  • 如果当前结点是递归下来的轻儿子,扫一遍把答案清空,否则不做处理

要求: 离线算法

复杂度: \(O(nlogn)\)

分析:只需要考虑每个点被扫的次数,树剖下来每个点到根的路径最多有\(log\)条链,每逢轻重链交替的时候就会暴力去扫,于是每个点最多只会被扫\(log\)次,复杂度得证

适用范围

适用一些子树信息不好统计的题,可以类比于树上莫队

  • 统计子树内数量最多的颜色的编号之和(Codeforces600E)
  • 统计子树内距离\(i\)点不超过\(k\)的点的颜色数/某权值之和(BZOJ4771七彩树离线版/[湖南集训]谈笑风生)

    ?

原文地址:https://www.cnblogs.com/xzyxzy/p/9903894.html

时间: 2024-07-30 01:49:00

Noip前的大抱佛脚----数据结构的相关文章

Noip前的大抱佛脚----文章索引

Noip前的大抱佛脚----赛前任务 Noip前的大抱佛脚----考场配置 Noip前的大抱佛脚----数论 Noip前的大抱佛脚----图论 Noip前的大抱佛脚----动态规划 Noip前的大抱佛脚----数据结构 Noip前的大抱佛脚----根号对数算法 Noip前的大抱佛脚----字符串 Noip前的大抱佛脚----一些思路 Noip前的大抱佛脚----奇技淫巧 原文地址:https://www.cnblogs.com/xzyxzy/p/9903933.html

Noip前的大抱佛脚----一些思路

一些有启发性的思路 序列 线段树(当然还要有主席树啊!) 差分和前缀和啊 分块 莫队 看到等差数列先推一波式子啊(天天爱跑步) 有序序列的动态插入删除 有的时候需要算贡献,当你发现序列(离散化后)值域一定时,便可以尝试使用树状数组 维护\(mex\) 可以尝试使用值域分块,当这个块内全部有值了就打个\(tag\) 等和序列 大概就是说可以多项式乘起来那种吧,可以发现差分之后是回文串! 序列差分 异或序列可以差分!!(具体差分方法:遇到一个1,给当前位置和下一个位置异或上一个1,这样统计前缀和后就

Noip前的大抱佛脚----数论

数论 知识点 Exgcd \(O(logn)\)求解\(Ax+By=C\)的问题 1.若\(C\%gcd(A,B)!=0\)则无解 2.\(Gcd=gcd(A,B);A/=Gcd,B/=Gcd,C/=Gcd\) 3.代入下面代码求\(Ax+By=1\) 4.\(x*C\),得到一组特解 5.通解为\(\begin{cases}x=x_0+k*B \\y=y_0+k*A\end{cases}\) void Exgcd(ll a,ll b,ll &x,ll &y) { if(!b){x=1;y

Noip前的大抱佛脚----根号对数算法

根号算法 分块 数列分块入门九题(hzwer) 入门题1,2,3,4,5,7 问题:给一段区间打上标记后单点查询 解法:主要是每块维护一些标记,计算答案等,此类分块较为简单 注意:块大小一般为\(\sqrt n\) 复杂度:\(O(n\sqrt n)\) 入门题6 问题:每次朝数列中间插入一个元素,查询第k个元素是什么 解法:块大小超过一定值后暴力重构!采用链表实现 复杂度:\(O(n\sqrt n)\) 入门题8 问题:每次询问一个区间内为\(c?\)的元素个数,并把整个区间改为\(c?\)

NOIP前必须记住的30句话

NOIP前必须记住的30句话 1.比赛前一天晚上请准备好你的各种证件,事先查好去往考场的路线2.比赛之前请先调整你的屏幕分辨率到你喜欢的大小3.比赛之前请把编译器的字体调为你平时惯用的字体,尤其是注意这种字体中的逗号,点,1,l这种易混淆的字是不是区分明显4.在不影响视野的情况下,请将字号尽可能调大,方便查错5.请将题目通读完以后,再开始深入思考你认为最容易的一道题6.即使这道题再容易,也不要着急写代码,请先明确自己每一步要干什么后,再开始写,轻敌会是你最大的错误7.即使这道题看起来再没法做,也

从一个序列中获取前K大的数的一种方法

这个方法是利用快速排序的.在快速排序中,得到中间元素(pivot)之后,比较中间元素之前的元素个数和K的大小关系,从而确定后面该往哪个方向继续递归.如果中间元素前面的元素个数等于K,那就停止递归过程:如果中间元素前面元素个数小于K,那就再中间元素后面进行递归:否则就往中间元素前面进行递归.这样最终得到的是没有排序的前K大的元素,这样再对前K个元素进行一次真正的快速排序.这样就能得到排好序的前K大元素.我随机生成了一个100000个整型数据的文件进行测试,求前10000个元素.这样做用了0.984

hdu 1280 前m大的数 哈希

前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 10574    Accepted Submission(s): 3686 Problem Description 还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小

【hdu1280】前M大的数

前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 19208    Accepted Submission(s): 6563 Problem Description 还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小希

统计前k大的数x

我终于敲上了题目--记起来啦! 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小.n < 100000. 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开.每个整数的绝对值不超过100000000. 第三行包含一个整数k.k < n. 输出 从大到小输出前k大的数,每个数一行. 样例输入 10 4 5 6 9 8 7 1 2 3 0 5 样例输出 9 8 7 6 5 //AC自动机x #include<iostream&