您的位置:首页 > 其它

士兵杀敌(四)(树状数组+线段树)

2015-11-10 21:21 609 查看

士兵杀敌(四)

时间限制:2000 ms | 内存限制:65535 KB
难度:5

描述
南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上,这样,有时候,计算他们中的哪一个人到底有多少军功就是一个比较困难的事情,军师小工的任务就是在南将军询问他某个人的军功的时候,快速的报出此人的军功,请你编写一个程序来帮助小工吧。

假设起始时所有人的军功都是0.

输入只有一组测试数据。 每一行是两个整数T和M表示共有T条指令,M个士兵。(1<=T,M<=1000000) 随后的T行,每行是一个指令。 指令分为两种: 一种形如 ADD 100 500 55 表示,第100个人到第500个人请战,最终每人平均获得了55军功,每次每人获得的军功数不会超过100,不会低于-100。 第二种形如: QUERY 300 表示南将军在询问第300个人的军功是多少。输出对于每次查询输出此人的军功,每个查询的输出占一行。样例输入
4 10
ADD 1 3 10
QUERY 3
ADD 2 6 50
QUERY 3

样例输出
10
60


树状数组:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define mem(x,y) memset(x,y,sizeof(x))
#define L tree[root].l
#define R tree[root].r
#define S tree[root].sum
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define LA tree[root].lazy
#define V tree[root].val
const int INF=0x3f3f3f3f;
const int MAXN=1000010;
int tree[MAXN];
int lowbit(int x){
return x&(-x);
}
int update(int x,int v){
while(x<MAXN){
tree[x]+=v;
x+=lowbit(x);
}
}
int query(int x){
int ans=0;
while(x>0){
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
int main(){
int M,T,a,b,c;
char s[10];
scanf("%d%d",&T,&M);
mem(tree,0);
while(T--){
scanf("%s",s);
if(strcmp(s,"ADD")==0){
scanf("%d%d%d",&a,&b,&c);
update(a,c);update(b+1,-c);
}
else{
scanf("%d",&a);
printf("%d\n",query(a));
}
}
return 0;
}


线段树:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define mem(x,y) memset(x,y,sizeof(x))
#define L tree[root].l
#define R tree[root].r
#define S tree[root].sum
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define LA tree[root].lazy
#define V tree[root].val
#define NOW S=tree[root<<1].sum+tree[root<<1|1].sum
const int INF=0x3f3f3f3f;
const int MAXN=1000010;
struct Node{
int l,r,sum;//lazy,val;
};
Node tree[MAXN<<2];
int ans;
void build(int root,int l,int r){
L=l;R=r;S=0;//LA=0;V=0;
if(l==r)return;
else{
int mid=(l+r)>>1;
build(lson);build(rson);
}
}
void update(int root,int l,int r,int v){
if(L>=l&&R<=r){
//    LA=1;
//    V=v;
S+=v;
}
else{
int mid=(L+R)>>1;
/*if(LA){
LA=0;
update(root<<1,l,mid,V);
update(root<<1|1,mid+1,r,V);
V=0;
}*/
if(mid>=r)update(root<<1,l,r,v);
else if(mid<l)update(root<<1|1,l,r,v);
else{
update(root<<1,l,mid,v);
update(root<<1|1,mid+1,r,v);
}
}
}
int query(int root,int x){
if(L==x&&R==x)return S;
int cnt=S;
int mid=(L+R)>>1;
if(mid>=x)cnt+=query(root<<1,x);
else cnt+=query(root<<1|1,x);
return cnt;
}
int main(){
int T,M;
char s[10];
int a,b,c;
scanf("%d%d",&T,&M);
build(1,1,M);
while(T--){
scanf("%s",s);
if(strcmp(s,"ADD")==0){
scanf("%d%d%d",&a,&b,&c);
update(1,a,b,c);
}
else{
scanf("%d",&a);
printf("%d\n",query(1,a));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: