首页 > 其他分享 >【codevs1080】线段树练习

【codevs1080】线段树练习

时间:2023-02-08 12:36:48浏览次数:43  
标签:addmark val codevs1080 int 线段 练习 sgt rch ql


problem

solution

codes

#include<iostream>
using namespace std;
const int maxn = 100010;
#define lch p<<1
#define rch p<<1|1
struct node{
int val, addmark;
}sgt[maxn<<2];
void pushdown(int p, int l, int r){
if(!sgt[p].addmark)return;
int t = sgt[p].addmark, m=l+r>>1;
sgt[lch].addmark += t;
sgt[rch].addmark += t;
sgt[lch].val += t*(m-l+1);
sgt[rch].val += t*(r-m);
sgt[p].addmark = 0;
}
void update(int p, int l, int r, int ql, int qr, int v){
if(l>qr || r<ql)return ;
if(ql<=l && r<=qr){
sgt[p].val += v*(r-l+1);
sgt[p].addmark += v;
return ;
}
int m = l+r>>1;
if(ql<=m)update(lch,l,m,ql,qr,v);
else update(rch,m+1,r,ql,qr,v);
sgt[p].val = sgt[lch].val+sgt[rch].val;
}
int query(int p, int l, int r, int ql, int qr){
if(ql<=l && r<=qr)return sgt[p].val;
pushdown(p,l,r);
int m = l+r>>1, ans = 0;
if(ql<=m)ans += query(lch,l,m,ql,qr);
if(qr>m)ans += query(rch,m+1,r,ql,qr);
return ans;
}
int main(){
int n, m;
cin>>n;
for(int i = 1; i <= n; i++){
int x; cin>>x; update(1,1,n,i,i,x);
}
cin>>m;
for(int i = 1; i <= m; i++){
int op, x, y;
cin>>op>>x>>y;
if(op == 1){
update(1,1,n,x,x,y);
}else{
cout<<query(1,1,n,x,y)<<"\n";
}
}
return 0;
}


标签:addmark,val,codevs1080,int,线段,练习,sgt,rch,ql
From: https://blog.51cto.com/gwj1314/6044054

相关文章

  • javascript:DOM/BOM练习
    javascript:DOM/BOM练习    一、BOM/DOM练习内容1<!DOCTYPEhtml>2<html>3<head>4<metacharset="utf-8">5<title>菜鸟教程(runoob.com)</t......
  • 开学考前练习题的一点小思路
    大概是因为比较笨,刚看到王老师发的参考练习题时我是没有看懂的。原本本着熟悉一下流程的想法试了试,结果除了实现登陆外就没有什么太大的进展。后来又研究了研究,有了一点......
  • 【YBT2023寒假Day7 C】查区间(线段树套线段树)
    查区间题目链接:YBT2023寒假Day7C题目大意给你一个序列,要你维护两种操作,区间取min和区间求第k小。思路关于区间求第k小,有一个方法,是树套树。外层线段树维护位......
  • 【YBT2023寒假Day7 A】出题人(线段树优化DP)
    出题人题目链接:YBT2023寒假Day7A题目大意有一个序列,你要把它分成若干份,每一份的值的和不超过m,而且每一段最大值的和最小。输出每段最大值和的最小值。思路考虑每次......
  • 【YBT2023寒假Day6 C】子串染色(SAM)(线段树)(启发式合并)
    子串染色题目链接:YBT2023寒假Day6C题目大意对于一个s的子串t,把它在s中所有出现的位置包含的所有下标染黑,黑色连续段的数目是子串t的价值。然后给你一个k和一......
  • c语言练习
    练习C语言题第一题:统计素数并求和比较重要的几个步骤:对1进行特殊处理if(m==1){m=2;}定义一个变量,用给变量赋值的不同来进行判断是否为素数......
  • 【YBT2023寒假Day6 A】寄蒜挤河(计算几何)(线段树)
    寄蒜挤河题目链接:YBT2023寒假Day6A题目大意有一些二维平面上的点,按顺序加入,每次加入一个点后,问你图上有多少个三元点对使得它们构成的三角形严格包含原点,就是原点不能......
  • C语言填空:switch case练习
    /*下列程序的功能为:实现加、减、乘、除四则运算。*///【1】【2】【3】【4】【5】【6】【7】【8】【9】【10】#include<stdio.h>voidmain(){inta,b,d;......
  • Codeforces 240 F. TorCoder 线段树
    AboynamedLeodoesn'tmissasingleTorCodercontestround.OnthelastTorCoderroundnumber100666Leostumbledoverthefollowingproblem.Hewasgivenas......
  • POJ 3667 Hotel(线段树:区间覆盖+维护最大连续子区间长度)
    HotelDescriptionThecowsarejourneyingnorthtoThunderBayinCanadatogainculturalenrichmentandenjoyavacationonthesunnyshoresofLakeSuperior.Be......