【线段树应用】数据结构
创始人
2025-05-30 22:56:06

1008-数据结构_2021秋季算法入门班第十一章习题:线段树、树状数组 (nowcoder.com)

题意:

思路:

线段树应用的一般思路:

  1. 先去确定需要维护几个序列(一个序列对应一棵线段树)

  1. 再去确定对于一个序列需要维护的东西

  1. 再去考虑计算修改操作对需要维护的答案的贡献需要什么信息,这些信息就是新的需要维护的东西

  1. 这样对于一个序列所有需要维护的东西就确定了

  1. 去pushdown里计算修改操作对一棵线段树里的各种tag的贡献,考虑lazy tag的时候考虑要加哪些lazy tag,这个一定是和操作性质有关的,且维护的是序列里每一个数的信息

  1. 去pushup考虑怎么从两个子区间得到一个大区间

对于这道题:

  1. 首先我们需要维护的两个序列,一个是原序列,一个是原序列的平方和

  1. 对于这两个序列,我们需要维护的都是区间和

  1. 考虑修改操作。这里有三种修改操作:+x,*x,*y+x

考虑+x:

对于第一个序列,加上add这个lazy tag就可以了

对于第二个序列,我们这样去计算贡献:

可以看到我们用tree1的区间和和x和区间长度这些信息就能算出贡献,因此不需要额外加tag

考虑*x:

对于第一个序列,我们需要加mul这个lazy tag

对于第二个序列,这样去计算贡献:

贡献可以直接*y*y

还有一种操作:*y+x:

计算一下贡献就是:

这样我们一共需要维护哪些tag就确定了

  1. 然后就是最重要的一步,在pushdown里根据父结点计算贡献

注意要先算tree2的贡献再算tree1的贡献,因为计算tree2的贡献需要用到旧的tree1,不能先更新tree1再更新tree2

  1. 最后pushup就是很简单的左区间+右区间

Code:

#include 
#define int long long
const int mxn=1e5+10;
const int mxe=2e5+10;
const int mod=1e9+7;
const int Mnf=1e18;
const int Inf=-1e18;
using namespace std;
struct Tree{int sum,add,mul;
}tree1[mxe<<2],tree2[mxe<<2];int n,m,op,l,r,x;
int a[mxn];
void pushup(int rt){tree1[rt].sum=tree1[rt<<1].sum+tree1[rt<<1|1].sum;tree2[rt].sum=tree2[rt<<1].sum+tree2[rt<<1|1].sum;
}
void build(int rt,int l,int r){tree1[rt].add=tree2[rt].add=0;tree2[rt].mul=tree2[rt].mul=1;if(l==r){tree1[rt].sum=a[l];tree2[rt].sum=a[l]*a[l];return;}int mid=l+r>>1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);pushup(rt);
}
void pushdown(int rt,int tot){int x=tree2[rt].add,y=tree2[rt].mul;//区间乘:tree2[rt<<1].add=tree2[rt<<1].add*y+x;tree2[rt<<1|1].add=tree2[rt<<1|1].add*y+x;tree2[rt<<1].mul*=y;tree2[rt<<1|1].mul*=y;tree2[rt<<1].sum=tree2[rt<<1].sum*y*y+2*x*y*tree1[rt<<1].sum+x*x*(tot-tot/2);tree2[rt<<1|1].sum=tree2[rt<<1|1].sum*y*y+2*x*y*tree1[rt<<1|1].sum+x*x*(tot/2);//区间和:tree1[rt<<1].add=tree1[rt<<1].add*y+x;tree1[rt<<1|1].add=tree1[rt<<1|1].add*y+x;tree1[rt<<1].mul*=y;tree1[rt<<1|1].mul*=y;tree1[rt<<1].sum=tree1[rt<<1].sum*y+(tot-tot/2)*x;tree1[rt<<1|1].sum=tree1[rt<<1|1].sum*y+(tot/2)*x;tree1[rt].add=tree2[rt].add=0;tree1[rt].mul=tree2[rt].mul=1;
}
void modify_sum(int rt,int l,int r,int x,int y,int k){if(x<=l&&r<=y){tree1[rt].add+=k;tree2[rt].add+=k;tree2[rt].sum+=2*tree1[rt].sum*k+(r-l+1)*k*k;tree1[rt].sum+=k*(r-l+1);return;}if(tree1[rt].add||tree1[rt].mul!=1) pushdown(rt,r-l+1);int mid=l+r>>1;if(x<=mid) modify_sum(rt<<1,l,mid,x,y,k);if(y>mid) modify_sum(rt<<1|1,mid+1,r,x,y,k);pushup(rt);
}
void modify_mul(int rt,int l,int r,int x,int y,int k){if(x<=l&&r<=y){tree1[rt].add*=k;tree2[rt].add*=k;tree1[rt].mul*=k;tree2[rt].mul*=k;tree1[rt].sum*=k;tree2[rt].sum*=k*k;return;}if(tree1[rt].add||tree1[rt].mul!=1) pushdown(rt,r-l+1);int mid=l+r>>1;if(x<=mid) modify_mul(rt<<1,l,mid,x,y,k);if(y>mid) modify_mul(rt<<1|1,mid+1,r,x,y,k);pushup(rt);
}
int query(int rt,int l,int r,int x,int y,Tree *tree){if(x<=l&&r<=y){return tree[rt].sum;}pushdown(rt,r-l+1);int mid=l+r>>1;int res=0;if(x<=mid) res+=query(rt<<1,l,mid,x,y,tree);if(y>mid) res+=query(rt<<1|1,mid+1,r,x,y,tree);return res; 
}
void solve(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];build(1,1,n);for(int i=1;i<=m;i++){cin>>op;if(op==1){cin>>l>>r;cout<>l>>r;cout<>l>>r>>x;modify_mul(1,1,n,l,r,x);}else{cin>>l>>r>>x;modify_sum(1,1,n,l,r,x);}}
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int __=1;//cin>>__;while(__--)solve();return 0;
}

相关内容

热门资讯

万泰生物九价HPV疫苗获批上市... 长江商报消息●长江商报记者 汪静全国首个!全球第二!万泰生物(603392.SH)的国产九价HPV疫...
氟化工概念股活跃,永和股份涨停... 6月6日,氟化工概念股活跃,永和股份涨停,三美股份涨逾6%,多氟多涨逾4%。
汽车零部件板块震荡走弱 汽车零... 【汽车零部件板块震荡走弱】合兴股份跌超6%,神驰机电、新泉股份跌超5%,信质集团、恒勃股份、湖南天雁...
一名老师眼中的“高考工厂”:我... 在“高考工厂”中,作为一名老师,我看到的是学生们被成绩牢牢束缚的模样。他们如同被囚禁在一座巨大的成绩...
恒生医疗指数ETF(15955... 6月6日早盘,港股弱势震荡。截至发稿,恒生指数跌0.29%,恒生科技指数跌0.47%。热门ETF中,...
马斯克与特朗普公开骂架 特斯拉... 当地时间6月5日,受特斯拉首席执行官马斯克与美国总统特朗普矛盾公开化影响,当日特斯拉股价下跌14.2...
苦熬近2年,“IPO钉子户”广... 6月3日,广东省建筑科学研究院集团股份有限公司(下称“广东建科”)在深交所创业板提交注册,IPO进程...
商标折戟、债台高筑,川酒集团如... “国酿”商标被撤销,是不是让川酒集团的高端布局之路瞬间受阻了呢? 来源:明见局 在白酒行业的激烈竞争...
国家数据要素综合试验区将落地!... 截至2025年6月6日 09点39分,中证大数据产业指数下跌0.40%。成分股方面涨跌互现,石基信息...
医美论战持续,真相待解,监管已... 文丨詹詹 郭小兴 编辑丨杜海来源丨正经社(ID:zhengjingshe)(本文约为1200字)两大...
V观财报|燕京啤酒:2025年... 【V观财报|燕京啤酒:2025年行业原材料成本仍处于下行周期】燕京啤酒披露的投资者关系管理信息显示,...
丰收季“粮心”溯源、世博会文化... 独立 稀缺 穿透心有多大舞台就有多大!作者:闻道编辑:楚逸风品:时完来源:铑财——铑财研究院风吹麦浪...
这家6500亿顶流公募的“铁饭... 文丨徐风从开年到现在,基金行业的排名战愈演愈烈,偏股混合型基金收益率的TOP 10门槛已经来到了65...
用时三个月,达永有限减持良品铺... 新京报贝壳财经讯(记者阎侠)6月5日,良品铺子发布股东减持股份结果公告。公告显示,2025年3月5日...
国防军工板块走强,航天机电等涨... 6月6日,国防军工板块走强,华伍股份涨超10%,航天机电、华体科技、中电鑫龙涨停,晨曦航空、西测测试...
英国承认:统计数据存在重大错误... 有多少资讯是真正有用的?FinGraph是中文财经世界唯一一家每日图形化早晚专栏,为专注于全球市场的...
实盘大赛迎短线高手“橘海孤舟”... 在A股市场的跌宕起伏中,总有一些投资者能凭借独特的眼光和策略脱颖而出。首届“股神争霸赛”季军橘海孤舟...
恒生指数开盘涨0.14%,华兴... 6月6日,恒生指数开盘涨0.14%报23941.57点,恒生科技指数涨0.13%,恒生中国企业指数涨...
埃文凯尔考察中国农业 慨叹农业... 作/博望财经中国对外开放步伐加快,火爆的“中国游”成为世界认识和了解中国的新窗口。6月5日,捐献记载...
5月消费品仓储业务需求表现较好... 6月6日,港股主要指数早盘活跃,恒生指数盘中翻红,消费板块震荡回升。热门ETF中,港股消费ETF(1...
拟收购中芯宁波94.366%股... 6月6日早盘,国科微高开高走,截至发稿,该股涨超12%,报90.88元,此前一度大涨超18%。6月5...
白象“多半袋”风波:民族品牌的... “多半袋”风波是白象经历的一次重大考验。白象作为民族品牌,一直坚守品质与担当。然而,某事件中出现的“...
马斯克和特朗普为何“闹掰”? 马斯克与特朗普“闹掰”主要源于多方面原因。在政治立场上,马斯克虽在商业领域极具影响力,但他对一些政治...
原创 非... 止损,永远是对的,错了也对! 死扛,永远是错的,对了也错! 横批:止损无条件! 如果没有交易原则,那...
特斯拉市值蒸发1500亿美元 当地时间6月5日,美国企业家、前“政府效率部”负责人马斯克与美国总统特朗普公开反目,特朗普表示,他对...
25元调至52元!这家A股公司... 雷赛智能(002979)6月5日晚间公告,鉴于近期资本市场行情及公司股价变化等情况综合影响,公司股票...
AI早报 | 微软CEO称正调... 微软CEO称正调整与OpenAI的关系,但合作依然稳固 6月5日,据财联社消息,微软CEO萨提亚·...
把张雪峰当自己人,咱配吗? 张... 临近高考了,莘莘学子却失去了自己的指路明灯。01几天前,张雪峰泪洒直播间,表示会暂时告别直播两个月,...
隆基绿能,往事并不如烟 隆基绿... 低迷期中的隆基绿能(SH:601012),迎来了难得的荣耀时刻——光伏军团市值瀑布杀之后,其市值仍然...
卖金表的烦恼:存货周转达700... 本报(chinatimes.net.cn)记者胡梦然 深圳报道随着金价持续上涨,黄金饰品商老铺黄金(...