hdu_1166 敌兵布阵(线段树)
2013-12-13 15:22
309 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1166
分析: 虽然题目的意思很清楚,但是不会写线段树…… (太弱了),所以参考了大神的代码,觉得递归使得整个程序显得非常漂亮。
( 线段树的总结等刷够了题在写吧~,觉得现在的自己实在是太弱了! 今年的长春真的很冷……)
感觉题目卡得很死,如果用string的话直接tle,但是换了字符串之后就AC了,还有一点就是应该正确使用位移运算!
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int a[50002];
struct node
{
int l,r,v,sum;
}T[150010];
void create(int u,int l,int r)
{
T[u].l=l; T[u].r=r;
if(l==r){
T[u].v=T[u].sum=a[r];
return;
}
T[u].v=0;
int mid=(l+r)>>1;
create(u<<1,l,mid);
create(((u<<1)|1),mid+1,r);
T[u].sum=T[u<<1].sum+T[((u<<1)|1)].sum;
}
void update(int order,int v,int u)
{
if(order==T[u].l&&order==T[u].r){
T[u].sum+=v;
T[u].v+=v;
return;
}
else{
if(order<=T[u<<1].r) update(order,v,u<<1);
else update(order,v,(u<<1)|1);
T[u].sum=T[u<<1].sum+T[(u<<1)|1].sum;
}
}
int query(int from,int to,int u)
{
if(from==T[u].l&&to==T[u].r) return T[u].sum;
if(to<=T[u<<1].r) return query(from,to,u<<1);
else if(from>=T[(u<<1)|1].l) return query(from,to,(u<<1)|1);
else return query(from,T[u<<1].r,u<<1)+query(T[(u<<1)|1].l,to,(u<<1)|1);
}
int main()
{
//freopen("in.txt","r",stdin);
int t,n;
char s[6];
scanf("%d",&t);
for(int ccnt=1;ccnt<=t;ccnt++){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
create(1,1,n);//u l r
printf("Case %d:\n",ccnt);
while(1){
scanf("%s",s);
if(s[0]=='E') break;
if(s[0]=='Q'){
int from,to;
scanf("%d%d",&from,&to);
int ans=query(from,to,1);
printf("%d\n",ans);
}
else{
int order,num;
scanf("%d%d",&order,&num);
if(s[0]=='A') num=num;
else num=-num;
update(order,num,1);
}
}
}
return 0;
}
分析: 虽然题目的意思很清楚,但是不会写线段树…… (太弱了),所以参考了大神的代码,觉得递归使得整个程序显得非常漂亮。
( 线段树的总结等刷够了题在写吧~,觉得现在的自己实在是太弱了! 今年的长春真的很冷……)
感觉题目卡得很死,如果用string的话直接tle,但是换了字符串之后就AC了,还有一点就是应该正确使用位移运算!
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int a[50002];
struct node
{
int l,r,v,sum;
}T[150010];
void create(int u,int l,int r)
{
T[u].l=l; T[u].r=r;
if(l==r){
T[u].v=T[u].sum=a[r];
return;
}
T[u].v=0;
int mid=(l+r)>>1;
create(u<<1,l,mid);
create(((u<<1)|1),mid+1,r);
T[u].sum=T[u<<1].sum+T[((u<<1)|1)].sum;
}
void update(int order,int v,int u)
{
if(order==T[u].l&&order==T[u].r){
T[u].sum+=v;
T[u].v+=v;
return;
}
else{
if(order<=T[u<<1].r) update(order,v,u<<1);
else update(order,v,(u<<1)|1);
T[u].sum=T[u<<1].sum+T[(u<<1)|1].sum;
}
}
int query(int from,int to,int u)
{
if(from==T[u].l&&to==T[u].r) return T[u].sum;
if(to<=T[u<<1].r) return query(from,to,u<<1);
else if(from>=T[(u<<1)|1].l) return query(from,to,(u<<1)|1);
else return query(from,T[u<<1].r,u<<1)+query(T[(u<<1)|1].l,to,(u<<1)|1);
}
int main()
{
//freopen("in.txt","r",stdin);
int t,n;
char s[6];
scanf("%d",&t);
for(int ccnt=1;ccnt<=t;ccnt++){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
create(1,1,n);//u l r
printf("Case %d:\n",ccnt);
while(1){
scanf("%s",s);
if(s[0]=='E') break;
if(s[0]=='Q'){
int from,to;
scanf("%d%d",&from,&to);
int ans=query(from,to,1);
printf("%d\n",ans);
}
else{
int order,num;
scanf("%d%d",&order,&num);
if(s[0]=='A') num=num;
else num=-num;
update(order,num,1);
}
}
}
return 0;
}
相关文章推荐
- hdu1166 敌兵布阵(线段树)
- hdu 1166 敌兵布阵 线段树
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- HDU 1166 敌兵布阵(线段树版)
- HDU 1166 敌兵布阵(线段树)
- HDU 1166 敌兵布阵【线段树】
- HDU 1166 敌兵布阵(线段树)
- HDU 1166.敌兵布阵【线段树】【树状数组】【4月27】
- HDU 1166 敌兵布阵 线段树
- hdu 1166 敌兵布阵 基础线段树 2种做法
- hdu 1166 敌兵布阵 (线段树单点更新)
- 敌兵布阵(HDU - 1166)(线段树的点更新-区间查询)
- hdu 1166 敌兵布阵 (zkw线段树)
- Hdu 1166 敌兵布阵 -- 线段树
- hdu 1166 敌兵布阵 【线段树】
- 线段树 端点更新 hdu-1166-敌兵布阵
- HDU1166——敌兵布阵(线段树)
- hdu 1166 敌兵布阵(线段树)
- hdu 1166 敌兵布阵(线段树入门题)
- hdu 1166 敌兵布阵(树状数组 or 线段树)