HDU1166 敌兵布阵 [线段树模板]
题意:在序列中修改单点和查询区间和
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #define ls l,m,rt<<1
- #define rs m+1,r,rt<<1|1
- using namespace std;
- const int maxn=*;
- int sum[maxn<<],add[maxn<<];//sum求和,add懒惰标记
- int a[maxn]={},n=;//存原数组数据下标[1,n]
- //更新节点信息,这里是求和
- void pushup(int rt)
- {
- sum[rt]=sum[rt<<]+sum[rt<<|];
- }
- //建树
- void pushdown(int rt,int ln,int rn)
- {//ln,rn为左子树,右子树的数量
- if(add[rt])//下推标记
- {
- add[rt<<]+=add[rt];
- add[rt<<|]+=add[rt];
- sum[rt<<]+=add[rt]*ln;
- sum[rt<<|]+=add[rt]*rn;
- add[rt]=;//清除本节点标记
- }
- }
- void build(int l,int r,int rt)//rt表示当前节点编号
- {
- if(l==r)
- {
- sum[rt]=a[l];
- return;
- }
- int m=(l+r)>>;
- build(l,m,rt<<);
- build(m+,r,rt<<|);
- pushup(rt);
- }
- //点修改a[L]+=c;
- //比如update(a,-b,1,n,1);//修改a点的值,减去b,当前节点区间是1到n,起始点是1
- void update(int L,int c,int l,int r,int rt)
- {//l,r当前节点区间,rt当前节点编号,L需要修改的节点,c修改的值
- if(l==r)
- {
- sum[rt]+=c;
- return;
- }
- int m=(l+r)>>;
- //根据条件判断调用左子树还是右子树
- if(L<=m)
- update(L,c,l,m,rt<<);
- else
- update(L,c,m+,r,rt<<|);
- pushup(rt);//子节点更新,所以本节点也需要更新
- }
- //区间修改a[r,t]+=c
- ////比如query(a,b,1,n,1))查询a b之间的和,当前节点区间是1到n,起始点是1
- void update_(int L,int R,int c,int l,int r,int rt)
- {//L,R表示操作区间,l,r表示当前节点区间,rt表示当前节点编号
- if(L<=l&&r<=R)//遍历的区间在操作区间内
- {
- sum[rt]+=c*(r-l+);
- add[rt]+=c;
- return;
- }
- int m=(l+r)>>;
- pushdown(rt,m-l+,r-m);
- if(L<=m)
- update_(L,R,c,l,m,rt<<);
- if(R>m)
- update_(L,R,c,m+,r,rt<<|);
- pushup(rt);
- }
- //区间查询 a[l,r]的和
- //下推标记函数
- int query(int L,int R,int l,int r,int rt)
- {
- if(L<=l&&r<=R)
- {
- return sum[rt];
- }
- int m=(l+r)>>;
- pushdown(rt,m-l+,r-m);
- int ans=;
- if(L<=m)
- ans+=query(L,R,l,m,rt<<);
- if(R>m)
- ans+=query(L,R,m+,r,rt<<|);
- return ans;
- }
- int main()
- {
- int t,cnt=;
- scanf("%d",&t);
- while(t--)
- {
- memset(a,,sizeof(a));
- memset(sum,,sizeof(sum));
- memset(add,,sizeof(add));
- scanf("%d",&n);
- for(int i=;i<=n;i++)
- scanf("%d",&a[i]);
- build(,n,);
- printf("Case %d:\n",cnt++);
- char str[];
- while(scanf("%s",str)&&str[]!='E')
- {
- int a,b;
- scanf("%d%d",&a,&b);
- if(str[]=='Q')
- {
- query(a,b,,n,);
- }
- if(str[]=='S')
- update(a,-b,,n,);//修改a点的值,减去b,当前节点区间是1到n,起始点是1
- if(str[]=='A')
- update(a,b,,n,);
- if(str[]=='Q')
- printf("%d\n",query(a,b,,n,));//查询a b之间的和,当前节点区间是1到n,起始点是1
- }
- }
- return ;
- }
HDU1166 敌兵布阵 [线段树模板]的更多相关文章
- HDU-1166敌兵布阵(线段树)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...
- hdu1166 敌兵布阵(线段树 求区间和 更新点)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- hdu1166 敌兵布阵 线段树(区间更新)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU1166 敌兵布阵(线段树)
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...
- 【生活没有希望】hdu1166敌兵布阵 线段树
线段树水题刷刷,生活没有希望 最近看到代码跟树状数组差不多短的非递归线段树,常数也很小——zkw线段树 于是拿道水题练练手 短到让人身无可恋 ;pos;pos/=) a[pos]+=x;} ,ans= ...
- HDU1166 敌兵布阵 线段树详解
题解: 更新是线段树的单点更新,简单一点. 有50000个阵营,40000查询,用普通数组肯定超时.区间求和和区间查询问题用线段树最好不过了. 先说说什么是线段树. 区间[1,10]用树的方法存起来, ...
- HDU1166 敌兵布阵 —— 线段树单点修改
题目链接:https://vjudge.net/problem/HDU-1166 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布 ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
随机推荐
- PAT Advanced 1090 Highest Price in Supply Chain (25) [树的遍历]
题目 A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)–everyone inv ...
- Luogu P3031 高于中位数
定义序列\(x_i = f([H_i >=x])\;\;\;\;其中f(0) = -1,f(1) = 1\),那么区间[i,j]满足条件当且仅当sum_j-sum_{i-1} > 0,即s ...
- vue图片查看器
vue 安装图片查看器插件安装cnpm install v-viewer引用 import 'viewerjs/dist/viewer.css' import Viewer from 'v-viewe ...
- Express+MySQL实现图片上传到服务器并把路径保存到数据库中
demo准备:mysql5.7.20 express4.0 处理图片文件的中间件Multer 先搭建服务器并展示html页面 const express = require("express ...
- jquery如何获取div下ul的某个li
$('div ul').each(function(){ alert($(this).find('li').eq(x)) }) $("div ul li:eq(1)")// $(& ...
- py02_02:pyc的解释
1. Python是一门解释型语言吗? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言 ...
- 神奇的Python代码
一 def f(arg=i): print(arg) i = 6 f() i = 7 f(i) 输出结果是: 7 7
- sol - 0x60,61,62
[例题]走廊泼水节 设当前扫描到边x,y,长度为z,x所处的并查集为Sx,y所处的并查集为Sy: 对于任意u属于Sx,v属于Sy,我们可以知道u,v之间必连一条边 但是我们要在保证x,y之间的边属于唯 ...
- matlab代码学习_2018-7-28
1.核范数||A|| * 是指矩阵奇异值的和,英文称呼叫Nuclear Norm.matlab code:[s, u, v] = svd(A); nulear_norm = sum(diag(s)); ...
- Office文档WEB端在线浏览(转换成Html)
最近在做了一个项目,要求是对Office文档在线预览.下面给大家分享一下我的方法. 1.第一种方法(不建议使用)我是在网上搜了一个利用COM组件对office文档进行转换,但是此方法必须要装Offic ...