hdu 1166 树状数组(线段树)
敌兵布阵
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 35307 Accepted Submission(s): 14974
中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇报第3个营地到第10个营地共有多少人!”Tidy就要马上开始计算这一段的总人数并汇报。但敌兵营地的人数经常变动,而Derek每次询问的段都不一样,所以Tidy不得不每次都一个一个营地的去数,很快就精疲力尽了,Derek对Tidy的计算速度越来越不满:"你个死肥仔,算得这么慢,我炒你鱿鱼!”Tidy想:“你自己来算算看,这可真是一项累人的工作!我恨不得你炒我鱿鱼呢!”无奈之下,Tidy只好打电话向计算机专家Windbreaker求救,Windbreaker说:“死肥仔,叫你平时做多点acm题和看多点算法书,现在尝到苦果了吧!”Tidy说:"我知错了。。。"但Windbreaker已经挂掉电话了。Tidy很苦恼,这么算他真的会崩溃的,聪明的读者,你能写个程序帮他完成这项工作吗?不过如果你的程序效率不够高的话,Tidy还是会受到Derek的责骂的.
每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。
接下来每行有一条命令,命令有4种形式:
(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;
(4)End 表示结束,这条命令在每组数据最后出现;
每组数据最多有40000条命令
对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int f[]; inline int lowbit(int x){ return x&(-x);}
inline void add(int x,int d,int n)
{
while(x<=n)
{
f[x]+=d;x+=lowbit(x);
}
} inline int sum(int x)
{
int ret=;
while(x>=)
{
ret+=f[x];x-=lowbit(x);
}
return ret;
}
int main()
{
int T,n,i,j,a,b,p;
char s[];
scanf("%d",&T);
for(i=;i<=T;i++)
{
scanf("%d",&n);
fill(f,f+n+,);
for(j=;j<=n;j++) scanf("%d",&p),add(j,p,n);
printf("Case %d:\n",i);
while(scanf("%s",s) && strcmp(s,"End")!=)
{
scanf("%d %d",&a,&b);
if(strcmp(s,"Add")==)
add(a,b,n);
else if(strcmp(s,"Sub")==)
add(a,-b,n);
else if(strcmp(s,"Query")==)
printf("%d\n",sum(b)-sum(a-));
}
}
return ;
}
线段树解法:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int a[]; struct IntervalTree
{
int left,right,sum;
}f[]; void bulid(int left,int right,int i)
{
int mid;
f[i].left=left;
f[i].right=right;
if(left==right)
{
f[i].sum=a[left];
return;
}
mid=(left+right)/;
bulid(left,mid,*i);
bulid(mid+,right,*i+);
f[i].sum=f[*i].sum+f[*i+].sum;
return ;
} void add(int x,int d,int i)
{
if(f[i].left==f[i].right)
{
f[i].sum+=d;
return ;
}
f[i].sum+=d;
if(x<=f[i*].right) add(x,d,*i);
else add(x,d,*i+);
return ;
} int query(int left,int right,int i)
{
int mid;
if(f[i].left==left && f[i].right==right) return f[i].sum;
mid=(f[i].left+f[i].right)/;
if(right<=mid) return query(left,right,i*);
else if(left>mid) return query(left,right,i*+);
else return query(left,mid,*i)+query(mid+,right,*i+);
} int main()
{
int T,n,i,j,lp,rp;
char s[];
scanf("%d",&T);
for(i=;i<=T;i++)
{
scanf("%d",&n);
for(j=;j<=n;j++) scanf("%d",a+j);
bulid(,n,);
printf("Case %d:\n",i);
while(scanf("%s",s) && strcmp(s,"End")!=)
{
scanf("%d %d",&lp,&rp);
if(strcmp(s,"Add")==)
add(lp,rp,);
else if(strcmp(s,"Sub")==)
add(lp,-rp,);
else if(strcmp(s,"Query")==)
printf("%d\n",query(lp,rp,));
}
}
return ;
}
hdu 1166 树状数组(线段树)的更多相关文章
- 树状数组 && 线段树应用 -- 求逆序数
参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...
- hdu1394(枚举/树状数组/线段树单点更新&区间求和)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- hdu 1166 敌兵布阵——(区间和)树状数组/线段树
pid=1166">here:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Input 第一行一个整数T.表示有T组数据. 每组数据第一 ...
- HDU 1166 敌兵布阵 树状数组||线段树
http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目大意: 给定n个数的区间N<=50000,还有Q个询问(Q<=40000)求区间和. 每个 ...
- hdu 3966 Aragorn's Story(树链剖分+树状数组/线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: 给出一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路 ...
- HDU 3303 Harmony Forever 前缀和+树状数组||线段树
Problem Description We believe that every inhabitant of this universe eventually will find a way to ...
随机推荐
- shell 简单脚本 2
#!/bin/bash source /etc/profile APPLICATIONS_HOME="/cpic/cpicapp/cpic_analy/jars" APPLICAT ...
- 几个不错的APP网站。
http://www.yunshipei.com/yunshipei.html http://www.appcan.cn/
- MAC 安装汇编编译工具 NASM
直接运行nasm报错: 开始安装: brew reinstall nasm
- Swift 中 String 与 CChar 数组的转换
在现阶段Swift的编码中,我们还是有很多场景需要调用一些C函数.在Swift与C的混编中,经常遇到的一个问题就是需要在两者中互相转换字符串.在C语言中,字符串通常是用一个char数组来表示,在Swi ...
- 升级nodejs 与短小的n模块
要用指令升级nodejs到新版本要先安装n模块 window用不了n模块 可以用 nvm-windows : https://github.com/coreybutler/nvm-windows n ...
- vue input 判断
//输入框 判断 //全局异常提示信息 //b 1:失去焦点验证错误提示 2:得到焦点关闭错误提示 //i 来区分是验证那个input框 check:function (t,b) { var that ...
- MySQL中数组的存储
1. MySQL中以字符串的形式存储数组 MySQL中无数组类型,通常将数组元素按某个字符分割以字符串形式存储 1.1. 求数组中元素的个数 方法:按指定符号分割字符串,返回分割后的元素个数.方法很简 ...
- Mac OS 终端强化美化:iterm2 + zsh + oh~my~zsh 设置教程
为了获得更好的排版效果,文章改用markdown撰写,故重发一次. 前言 mac自带的terminal终端没有文件名高亮等功能,而且界面不是很好看,故今晚学舍友折腾了终端,可以让自己使用起来更加方便, ...
- Linux用户身份(命令详解与补正)
基于Red Hat Enterprise Linux 7.5 Linux中的root就是存在于所有类UNIX系统中的超级用户,持有最高管理权限,能添加/删除用户.开关机.关闭或开启硬件或者系统服务等, ...
- mbist summary
1. 关于mbist,网上也有介绍,觉得不错: 推荐的mbistt的博客:奋斗的猪 2.使用的工具是mbistarchitect,不是tessent. 3.工具使用的相关文档:从EETOP和工具自带的 ...