首页 > 其他分享 >Codeforces Round #254 (Div. 1) C - DZY Loves Colors 线段树|lazytag维护区间加

Codeforces Round #254 (Div. 1) C - DZY Loves Colors 线段树|lazytag维护区间加

时间:2023-03-01 11:57:06浏览次数:52  
标签:rt int Codeforces update Colors ls Loves 区间 lazytag

开一个变量维护同一个区间内颜色是否相同,而且显然要用lazytag了

递归到颜色相同的区间时就可以直接打标记

然后对于标记,维护的就是常规区间加的部分

(最开始没写lazy,wa6,没明白自己怎么错的,但是又觉得要加lazy很合理:) 

由于有区间推平的操作,用珂朵莉树也可以,详情见洛谷题解区

#include<bits/stdc++.h>
#define ls (rt<<1)
#define rs (rt<<1|1)
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int maxn=1e5+5;
typedef long long ll;
struct seg{
    int l,r;
    ll len,col,sum,lazy;
    //
}t[maxn<<2];
void push_up(int rt){
    t[rt].sum=t[ls].sum+t[rs].sum;
    if(t[rs].col==t[ls].col) {
        t[rt].col=t[ls].col;
    }
    else t[rt].col=0;
}
void push_down(int rt){
    if(!t[rt].col) return;
    t[ls].lazy+=t[rt].lazy;//lazy 维护的是 多出来的贡献,至于abs的部分,不在这里维护 
    t[rs].lazy+=t[rt].lazy;
    t[ls].sum+=t[rt].lazy*t[ls].len;
    t[rs].sum+=t[rt].lazy*t[rs].len;
    t[ls].col=t[rs].col=t[rt].col;
    t[rt].lazy=0;
    t[rt].col=0;// 可能短期内col不修改没影响,但是为了形式统一emmm 
}
void build(int rt,int l,int r){
    t[rt].l=l;t[rt].r=r;t[rt].len=1ll*(r-l+1);
    if(l==r){
       t[rt].sum=0;
       t[rt].col=1ll*l;
       t[rt].lazy=0;
       return;
    }
    int mid=(l+r)>>1;
    build(ls,l,mid);build(rs,mid+1,r);
    push_up(rt);
}
void update(int rt,int l,int r,ll val){
    if(l<=t[rt].l&&t[rt].r<=r){
        // update
        if(t[rt].col){
           t[rt].sum+=t[rt].len*abs(val-t[rt].col);
           t[rt].lazy+=abs(val-t[rt].col);
           t[rt].col=val;
           return;    
        }  
    }
    push_down(rt);
    if(t[ls].r>=l) update(ls,l,r,val);
    if(t[rs].l<=r) update(rs,l,r,val);
    push_up(rt);
}
ll query(int rt,int l,int r){
    if(l<=t[rt].l&&t[rt].r<=r){
        return t[rt].sum;//
    }
    push_down(rt);
    ll ans=0;
    if(t[ls].r>=l) ans+=query(ls,l,r);//
    if(t[rs].l<=r) ans+=query(rs,l,r);//
    push_up(rt);
    return ans;
} 
int n,m;
int main(){
    //freopen("lys.in","r",stdin);
    fastio;
    cin>>n>>m;
    build(1,1,n);
    for(int i=1;i<=m;i++){
      int op;cin>>op;
      if(op==1){
           int l,r;ll x;cin>>l>>r>>x;
           update(1,l,r,x);
      }    
      else {
           int l,r;cin>>l>>r;
           cout<<query(1,l,r)<<endl;
      }    
     }
}

 

标签:rt,int,Codeforces,update,Colors,ls,Loves,区间,lazytag
From: https://www.cnblogs.com/liyishui2003/p/17167659.html

相关文章

  • Codeforces Round #854 by cybercats (Div. 1 + Div. 2) A-B题解
    比赛链接A可以发现,每次出去的顺序一定是按照\(n->1\)的顺序。因为新加入的东西只会放在最前面。相应的,如果其已在序列中,则这个操作不会对\(1~n\)的信息产生影响。......
  • Educational Codeforces Round 143 (Rated for Div. 2)(A,C,D)
    EducationalCodeforcesRound143(RatedforDiv.2)(A,C,D)好久没有写题了,这次\(vp\)竟然连\(vs\)都不会用了,O(∩_∩)OAA这个也是差一点了,还有一个情况我的解法是没有......
  • Educational Codeforces Round 26
    EducationalCodeforcesRound26https://codeforces.com/contest/837E公式推导看明白了,但是因子求解部分的代码还不是很懂,所以还没有补A.TextVolume#include<bits/......
  • Codeforces Round #854 by cybercats (Div. 1+2) 1799 A~G 题解
    点我看题A.RecentActions注意到只有编号大于n的博客会被更新,所以每当有一个之前没被更新的过的博客被更新时,当前列表中最下面的就会被挤掉。如果这次更新的博客之前已......
  • Educational Codeforces Round 112 (Rated for Div
    EducationalCodeforcesRound112(RatedforDiv.2)CodeForces-1555DSayNotoPalindromes如果一个字符串中不包含长度2以上的回文子串,我们就说这个字符串是漂亮......
  • Codeforces Round #776 (Div
    CodeforcesRound#776(Div.3)CodeForces-1650DTwistthePermutation给定你数组a:123...n,一共有n次操作,每次操作可以把\(a_i\)移到最左边,然后对\(i+1\)位以......
  • CodeForces-483D Interesting Array 线段树拆位
    让你构造一个数列,满足m种限制条件,每种限制条件是l,r,x,要求构造的序列区间[l,r] 与运算的值结果为x。注意到如果某一位上&运算的结果为1的话,该区间内所有元素都要是1先......
  • Codeforces Beta Round #19 D. Points 线段树+set
    给你一个笛卡尔坐标系,现在要支持三种操作,第一种操作是添加一个点(x,y),第二种操作是删除一个点(x,y),第三种操作是查询严格在点(x,y)右上角的点中,横坐标最小的点,如果有多......
  • Educational Codeforces Round 25
    EducationalCodeforcesRound25https://codeforces.com/contest/825ABCD没有什么意思,阅读理解题比较无聊(((EFG不难写,但是思维比较巧,知道就是知道,不知道就写不出emmA.B......
  • 【比赛记录】 Codeforces Round #682 Div.2
    Problems:#NameSubmitASpecificTastesofAndreBValeriiAgainstEveryoneCEngineerArtemDPowerfulKseniaEYuriiCanDoEverything......