
树状数组
xyc1719
努力会说谎,但努力不会是白费
展开
-
luogu3374 【模板】树状数组
luogu警告:此处需要一定的二进制基础,二进制问题请右转百度树状数组的储存有两个数组a[i],c[i],a[i]表示第i个数的大小 而c[i]则比较神奇,用下图表示 c[i]的地址(也就是i)最低位的位数决定了c[i],所能包含的数的多少,具体关系为:c[i]包含数的个数==lowbit(i)的返回值lowbit(i)返回的是i中最低位1的位置,可以通过机器补码的...原创 2018-05-08 11:53:25 · 181 阅读 · 0 评论 -
国庆七连测(五)(AK.cpp)
什么破标题【一句话题意】 给定一个长度为n的序列。有m个询问,每次询问[l,r]的序列和,并将区间内所有数平方。【分析】通过打表发现当一个数平方几十次之后他就会陷入一个平方不变的循环。我们可以暴力修改每个数,并用线段树(树状数组或者分块)维护区间和,用并查集优化修改时的扫描次数。(这是第几次用并查集合并区间了,管他呢)。Code:#include<cstdio>#includ...原创 2018-10-05 15:44:00 · 144 阅读 · 0 评论 -
相交(Access)
【一句话题意】有一棵n 个节点,n-1 条边的树。树上有m 条路径,定义两条路径相交仅当这两条路径经过至少一个相同的点。求这m 条路径中选择两条相交的路径的方案数。【分析】两条树上的链相交的充要条件为:一条链上深度最小的节点(lca)被另一条链所包含。通过欧拉序预处理+树状数组,我们可以通过O(logN)的时间求出一个点到根的路径上的所有点,共有多少个lca。因此我们可以方便的求出一条链上所有点...原创 2018-10-26 07:44:16 · 263 阅读 · 0 评论 -
思考熊的马拉松 running.cpp
【一句话题意】给n个点,每个点速度不一地在长为A圆形跑道上跑步,当最快点跑完L圈时,问发生了多少次套圈。【分析】可以根据最快点,算出所有点的跑的圈数和不到一圈的部分。先根据每个人跑的圈数求出大致意义上的套圈数。又考虑到有可能在剩余部分中也存在套圈,求剩余部分比第i小的点的个数加上就是答案,查询时用离散化后的树状数组(或线段树),总复杂的为O(nlog2n)O(nlog_2n)O(nlog2n)...原创 2018-11-05 15:01:15 · 427 阅读 · 0 评论 -
弹药分配
【简要题意】原先有一个序列各有一定的值。有5e4个操作,分两种:1.在选取一个区间【a,b】,并给出一个值k,区间上如果编号i 满足(i- a) % k = 0 就加上c。(k<=10)2.询问序列中某个数的当前值。【分析】对于k较小,且序列长度<=5e4的情况,我们可以分模数和余数建K2个树状数组。询问时将这些修改相加。【code】#include<cstdio&g...原创 2019-02-17 13:39:03 · 264 阅读 · 0 评论 -
卡内存
【简要题意】给一个长度为n序列。进行m次如下操作:1.add x k:给a[x]加上k。2.ask x y:查询区间[x,y]内所有数的和。3.goto t:回到第t次操作之后的状态。n,m<=1e5。特别注意:空间限制为8MB【分析】由于题目背景中出现了可持久化线段树,又有回退到历史版本的操作,所以很多人试图如题目所说的那样卡可持久化的内存。事实证明是卡不过的。这里有一种神奇...原创 2019-02-24 14:55:42 · 10519 阅读 · 0 评论