POJ 3468 线段树裸题

  这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解。

  然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了ACdreamer的模板,在此基础上自己用宏定义来精简了一下代码:

 1 #include<cstdio>
 2 typedef long long LL;
 3 #define root  int rt, int l, int r
 4 #define lson  rt*2, l, mid
 5 #define rson  rt*2+1, mid+1, r
 6 #define makemid  int mid= (l+r)>>1
 7 int a,b;
 8 LL c;
 9 
10 struct tree {
11     LL add,sum;
12 } s[400003];
13 
14 void build(root) {
15     s[rt].add= 0;
16     if(l==r){
17         scanf("%lld",&s[rt].sum);
18         return ;
19     }
20     makemid ;
21     build(lson);
22     build(rson);
23     s[rt].sum= s[rt*2].sum+s[rt*2+1].sum;
24 }
25 
26 inline void pushdown(int rt, int len) {
27     int ls= rt*2, rs= ls+1;
28     const LL &c= s[rt].add;
29     s[ls].add += c;
30     s[rs].add += c;
31     s[ls].sum += c*(len-len/2);
32     s[rs].sum += c*(len/2);
33     s[rt].add= 0;
34 }
35 
36 void update(root) {
37     if(a<=l && r<=b){
38         s[rt].add+= c;
39         s[rt].sum+= c*(r-l+1);
40         return ;
41     }
42     if(s[rt].add)    pushdown(rt,r-l+1);
43     makemid ;
44     if(a<=mid)    update(lson);
45     if(b>mid)    update(rson);
46     s[rt].sum= s[rt*2].sum+s[rt*2+1].sum;
47 }
48 
49 LL query(root) {
50     if(a<=l && r<=b)    return s[rt].sum;
51     if(s[rt].add)    pushdown(rt,r-l+1);
52     makemid ;
53     LL res= 0;
54     if(a<=mid)    res+= query(lson);
55     if(b>mid)    res+= query(rson);
56     return res;
57 }
58 
59 int main(){
60     int n,q;
61     while(~scanf("%d%d",&n,&q)){
62         build(1,1,n);
63         while(q--){
64             getchar();
65             if(getchar()=='Q'){
66                 scanf("%d%d",&a,&b);
67                 printf("%lld\n",query(1,1,n));
68             }
69             else {
70                 scanf("%d%d%lld",&a,&b,&c);
71                 update(1,1,n);
72             }
73         }
74     }
75     return 0;
76 }

  原样的代码是:

 1 #include<cstdio>
 2 typedef long long LL;
 3 LL c;
 4 int a,b;
 5 
 6 struct tree{
 7     LL add,sum;
 8 } s[400003];
 9 
10 void build(int rt, int l, int r){
11     s[rt].add= 0;
12     if(l==r){
13         scanf("%lld",&s[rt].sum);
14         return ;
15     }
16     int mid= (l+r)>>1;
17     build(rt*2,l,mid);
18     build(rt*2+1,mid+1,r);
19     s[rt].sum= s[rt*2].sum+s[rt*2+1].sum;
20 }
21 
22 inline void pushdown(int rt, int len){
23     if(s[rt].add){
24         int ls= rt*2, rs= ls+1;
25         s[ls].add += s[rt].add;
26         s[rs].add += s[rt].add;
27         s[ls].sum += s[rt].add*(len-len/2);
28         s[rs].sum += s[rt].add*(len/2);
29         s[rt].add= 0;
30     }
31 }
32 
33 void update(int rt, int l, int r){
34     if(a<=l && r<=b){
35         s[rt].add+= c;
36         s[rt].sum+= c*(r-l+1);
37         return ;
38     }
39     pushdown(rt,r-l+1);
40     int mid= (l+r)>>1;
41     if(a<=mid)    update(rt*2,l,mid);
42     if(b>mid)    update(rt*2+1,mid+1,r);
43     s[rt].sum= s[rt*2].sum+s[rt*2+1].sum;
44 }
45 
46 LL query(int rt, int l, int r){
47     if(a<=l && r<=b)    return s[rt].sum;
48     pushdown(rt,r-l+1);
49     int mid= (l+r)>>1;
50     LL res= 0;
51     if(a<=mid)    res+= query(rt*2,l,mid);
52     if(b>mid)    res+= query(rt*2+1,mid+1,r);
53     return res;
54 }
55 
56 int main(){
57     int n,q;
58     while(~scanf("%d%d",&n,&q)){
59         build(1,1,n);
60         while(q--){
61             getchar();
62             if(getchar()=='Q'){
63                 scanf("%d%d",&a,&b);
64                 printf("%lld\n",query(1,1,n));
65             }
66             else {
67                 scanf("%d%d%lld",&a,&b,&c);
68                 update(1,1,n);
69             }
70         }
71     }
72     return 0;
73 }
View Code

  线段树,不断进取中~~

转载于:https://www.cnblogs.com/Newdawn/p/4197240.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值