洛谷P2068 统计和
2024-08-28 12:49:58
题目描述
给定一个长度为\(n(n \leq 100000)\),初始值都为\(0\)的序列,\(x(x \leq 10000)\)次的修改某些位置上的数字,每次加上一个数,然后提出\(y (y \leq 10000)\)个问题,求每段区间的和。时间限制\(1\)秒。
输入输出格式
输入格式:
第一行\(1\)个数,表示序列的长度\(n\)
第二行\(1\)个数,表示操作的次数\(w\)
后面依次是\(w\)行,分别表示加入和询问操作
其中,加入用\(x\)表示,询问用\(y\)表示
\(x\)的格式为"\(x\) \(a\) \(b\)" 表示在序列\(a\)的位置加上\(b\)
\(y\)的格式为"\(y\) \(a\) \(b\)" 表示询问\(a\)到\(b\)区间的加和
输出格式:
每行一个数,分别是每次询问的结果
输入输出样例
输入样例#1:
5
4
x 3 8
y 1 3
x 4 9
y 3 4
输出样例#1:
8
17
思路:一道(线段树&树状数组)的(单点修改&区间查询)的板子题,不用过多解释……
代码:
#include<cstdio>
#include<algorithm>
#define maxn 100007
#define lb(x) x&(-x)
using namespace std;
int n,m,a[maxn];
char s[2];
inline void add(int x, int w) {
while(x<=n) {
a[x]+=w;
x+=lb(x);
}
}
inline int csum(int x) {
int ans=0;
while(x) {
ans+=a[x];
x-=lb(x);
}
return ans;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1,l,r;i<=m;++i) {
scanf("%s%d%d",s,&l,&r);
if(s[0]=='x') add(l,r);
else printf("%d\n",csum(r)-csum(l-1));
}
return 0;
}
最新文章
- mysql连接报错 Host &lsquo;xxx&rsquo;is blocked because of many connection errors;unblock with 'mysqladmin flush-hosts'
- C#----对时间结构DateTime的使用(时间日期的使用)
- 剑指offer:大恒图像
- R数据实战vehicles--1
- 安卓开发_浅谈ContextMenu(上下文菜单)
- 【Spring学习笔记-1】Myeclipse下Spring环境搭建
- [Bootstrap]全局样式(三)
- pycharm的使用技巧
- Ganglia3.6.0,nginx+php搭建gweb,监控Hadoop2.2 和 Hbase0.98.1
- chrome可以登陆账号的hosts文件
- poj2388 高速排序 模板题
- android UI布局
- javascript基础修炼(6)——前端路由的基本原理
- 关于html中的 script标签中的 代码写法有效性? easyui tabs的href不能载入内容页面
- nil/Nil/NULL/NSNull
- JS 单线程
- Sql Server用户名和登录名的关系总结
- mysql 外键 cascade
- DXDBGrid使用方法
- Cobbler自动化安装部署系统
热门文章
- 表达式计算-----------eval()运算符
- POJ3080 POJ3450Corporate Identity(广义后缀自动机||后缀数组||KMP)
- swiper轮播 swiper整屏轮播
- ACM学习历程—Hihocoder 1290 Demo Day(动态规划)
- 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask
- web攻击之六:DNS攻击原理与防范
- zoj 3872
- 浏览器怎么禁用和开启Javascript
- k8s基础(3)etcd集群
- elasticsearch2.x插件之一:kibana