敌兵布阵
2016-04-21 11:11
316 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1166
#include <iostream>
#include<cstdio>
using namespace std;
struct soldier
{
int left;
int right;
int num;
}tree[150010];
void build(int left,int right,int x)
{
tree[x].left=left;
tree[x].right=right;
if(left==right)
{
scanf("%d",&tree[x].num);
return;
}
int mid=(left+right)>>1;
build(left,mid,x<<1);
build(mid+1,right,x<<1|1);
tree[x].num=tree[x<<1].num+tree[x<<1|1].num;
}
void add(int id,int num,int x)
{
if(tree[x].left==tree[x].right)
{
tree[x].num+=num;
return;
}
tree[x].num+=num;
if(id<=tree[x<<1].right)
add(id,num,x<<1);
else
add(id,num,x<<1|1);
}
int query(int left,int right,int x)
{
if(tree[x].left==left && tree[x].right==right)
return tree[x].num;
int treemid=(tree[x].left+tree[x].right)>>1;
if(right<=treemid)
return query(left,right,x<<1);
if(left>treemid)
return query(left,right,x<<1|1);
return query(left,treemid,x<<1)+query(treemid+1,right,x<<1|1);
}
int main()
{
int T;
cin>>T;
int n,i,j,k;
char ch[20];
for(k=1;k<=T;k++)
{
cout<<"Case "<<k<<":"<<endl;
scanf("%d",&n);
build(1,n,1);
while(cin>>ch)
{
if(ch[0]=='E')
break;
else if(ch[0]=='Q')
{
int left,right;
cin>>left>>right;
printf("%d\n",query(left,right,1));
}
else if(ch[0]=='A')
{
int id,num;
scanf("%d%d",&id,&num);
add(id,num,1);
}
else if(ch[0]=='S')
{
int id,num;
scanf("%d%d",&id,&num);
add(id,num*(-1),1);
}
}
}
return 0;
}
////////////////////////////////////////////////////////////////////////
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[50010],b[50010],n;
void add(int k,int num)
{
while(k<=n)
{
b[k]+=num;
k+=k&-k;
}
}
int getSum(int k)
{
int sum=0;
while(k>0)
{
sum+=b[k];
k-=k&-k;
}
return sum;
}
int main()
{
int T;
cin>>T;
int i,j,k;
char ch[20];
for(k=1;k<=T;k++)
{
cout<<"Case "<<k<<":"<<endl;
memset(b,0,sizeof(b));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",a+i);
add(i,a[i]);
}
while(cin>>ch)
{
if(ch[0]=='E')
break;
else if(ch[0]=='Q')
{
int left,right;
scanf("%d%d",&left,&right);
printf("%d\n",getSum(right)-getSum(left-1));
}
else if(ch[0]=='A')
{
int id,num;
scanf("%d%d",&id,&num);
add(id,num);
}
else if(ch[0]=='S')
{
int id,num;
scanf("%d%d",&id,&num);
add(id,-num);
}
}
}
return 0;
}
#include <iostream>
#include<cstdio>
using namespace std;
struct soldier
{
int left;
int right;
int num;
}tree[150010];
void build(int left,int right,int x)
{
tree[x].left=left;
tree[x].right=right;
if(left==right)
{
scanf("%d",&tree[x].num);
return;
}
int mid=(left+right)>>1;
build(left,mid,x<<1);
build(mid+1,right,x<<1|1);
tree[x].num=tree[x<<1].num+tree[x<<1|1].num;
}
void add(int id,int num,int x)
{
if(tree[x].left==tree[x].right)
{
tree[x].num+=num;
return;
}
tree[x].num+=num;
if(id<=tree[x<<1].right)
add(id,num,x<<1);
else
add(id,num,x<<1|1);
}
int query(int left,int right,int x)
{
if(tree[x].left==left && tree[x].right==right)
return tree[x].num;
int treemid=(tree[x].left+tree[x].right)>>1;
if(right<=treemid)
return query(left,right,x<<1);
if(left>treemid)
return query(left,right,x<<1|1);
return query(left,treemid,x<<1)+query(treemid+1,right,x<<1|1);
}
int main()
{
int T;
cin>>T;
int n,i,j,k;
char ch[20];
for(k=1;k<=T;k++)
{
cout<<"Case "<<k<<":"<<endl;
scanf("%d",&n);
build(1,n,1);
while(cin>>ch)
{
if(ch[0]=='E')
break;
else if(ch[0]=='Q')
{
int left,right;
cin>>left>>right;
printf("%d\n",query(left,right,1));
}
else if(ch[0]=='A')
{
int id,num;
scanf("%d%d",&id,&num);
add(id,num,1);
}
else if(ch[0]=='S')
{
int id,num;
scanf("%d%d",&id,&num);
add(id,num*(-1),1);
}
}
}
return 0;
}
////////////////////////////////////////////////////////////////////////
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[50010],b[50010],n;
void add(int k,int num)
{
while(k<=n)
{
b[k]+=num;
k+=k&-k;
}
}
int getSum(int k)
{
int sum=0;
while(k>0)
{
sum+=b[k];
k-=k&-k;
}
return sum;
}
int main()
{
int T;
cin>>T;
int i,j,k;
char ch[20];
for(k=1;k<=T;k++)
{
cout<<"Case "<<k<<":"<<endl;
memset(b,0,sizeof(b));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",a+i);
add(i,a[i]);
}
while(cin>>ch)
{
if(ch[0]=='E')
break;
else if(ch[0]=='Q')
{
int left,right;
scanf("%d%d",&left,&right);
printf("%d\n",getSum(right)-getSum(left-1));
}
else if(ch[0]=='A')
{
int id,num;
scanf("%d%d",&id,&num);
add(id,num);
}
else if(ch[0]=='S')
{
int id,num;
scanf("%d%d",&id,&num);
add(id,-num);
}
}
}
return 0;
}
相关文章推荐
- 第一次作业-数据结构
- C++第4次作业
- 326. Power of Three
- typeset的常见用法
- 各种常用函数.md
- 页面的布局——在一块区域中显示一条不定长度的下划线,根据前面的字决定这条线有多长
- hive命令的3种调用方式
- 机器学习实战之Apriori
- 告别编译运行 ---- Android Studio 2.0 Preview发布Instant Run功能
- Javascript中document.execCommand()的用法
- GPS编码格式及C语言解码
- client缓存机制
- 服务应用监控健康检测
- fopen、file_get_contents方式set head
- 淡忘~浅思 » DOM笔记(十二):又谈原型对象
- HTTP中Get与Post的区别
- 如何判断用户是否关闭浏览器
- 短线与长线
- GridView只显示一行,可以横着滑动
- C # int值大小 0003