hiho #1078 : 线段树的区间修改

题意:长度为n的序列上有两种操作

0 ql qr  输出区间[ql,qr]和

1 ql qr v 区间[ql,qr]赋值为v

线段树懒标基础题,我用分块写了一个,在本题数据竟然跑的飞快

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include<iostream>
#include<cstdio>
#include<cmath>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=1e5+5;
typedef long long ll;
 
int val[maxn],belong[maxn],l[maxn],r[maxn],inv[maxn];
ll ans[maxn];
int n,q,op,ql,qr,v,cnt,block;
 
void update(int L,int R,int bt){
    if(L==l[bt]&&R==r[bt]){
    inv[bt]=v;ans[bt]=(ll)v*(R-L+1);
    return ;
    }
    if(inv[bt]){
      rep(i,l[bt],L-1)val[i]=inv[bt];
      rep(i,R+1,r[bt])val[i]=inv[bt];
      rep(i,L,R)ans[bt]+=v-inv[bt],val[i]=v;
      inv[bt]=0;
      return ;
    }
    rep(i,L,R)ans[bt]+=v-val[i],val[i]=v;
}
 
void update(){
    int b1=belong[ql],b2=belong[qr];
    if(b1==b2)update(ql,qr,b1);
    else{
    update(ql,r[b1],b1);b1++;
    while(b1<b2)
      update(l[b1],r[b1],b1),b1++;
    update(l[b2],qr,b2);
    }
}
 
ll query(int L,int R,int bt){
    if(l[bt]==L&&r[bt]==R)return ans[bt];
    if(inv[bt])return (ll)inv[bt]*(R-L+1);
    ll res=0;
    rep(i,L,R)res+=val[i];
    return res;
}
 
ll query(){
    ll res=0;
    int b1=belong[ql],b2=belong[qr];
    if(b1==b2)return query(ql,qr,b1);
    res+=query(ql,r[b1],b1);b1++;
    while(b1<b2)res+=ans[b1++];
    res+=query(l[b2],qr,b2);
    return res;
}
 
void init(){
    block=sqrt(n);cnt=n/block;
    rep(i,0,n-1){
    belong[i]=i/block;
    ans[belong[i]]+=val[i];
    }
    rep(i,0,cnt-1)l[i]=i*block,r[i]=(i+1)*block-1;
    if(n%block){
    l[cnt]=cnt*block,r[cnt]=n-1;cnt++;
    }
}
 
int main(){
    scanf("%d",&n);
    rep(i,0,n-1)scanf("%d",val+i);
    init();
    scanf("%d",&q);
    while(q--){
    scanf("%d%d%d",&op,&ql,&qr);
    ql--;qr--;
    if(op){
        scanf("%d",&v);
        update();
    }
    else
        printf("%lld\n",query());
    }
   
    return 0;
}

 

posted @   N维解析几何  阅读(228)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
点击右上角即可分享
微信分享提示