您的位置:首页 > 其它

HDU 1166 敌兵布阵

2013-05-29 16:24 239 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

用结构体做的 470+ms;

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <queue>
#include <cmath>
#include <cstring>

using namespace std;

struct N
{
int z,y,data;
struct N *l,*r;
};

struct N *creat()
{
struct N *p = (struct N *)malloc(sizeof(struct N));
p->l =  NULL;
p->r = NULL;
return p;
}

int st[50010];

int change(int z,int y,struct N *root)
{
int m = (z+y)/2;
root->z = z;
root->y = y;
if(z == y)
{
root->data = st[z];
return (st[z]);
}
root->l = creat();
root->r = creat();
int tl = change(z,m,root->l);
int tr = change(m+1,y,root->r);
root->data = (tl + tr);
return root->data;
}

void add(int site,int s,int z,int y,struct N *root)
{
int m = (z+y)/2;

if(z == y)
{
root->data += s;
return;
}

if(site <= m)
{
add(site,s,z,m,root->l);
root->data += s;
}
else
{
add(site,s,m+1,y,root->r);
root->data += s;
}
}

void sub(int site,int s,int z,int y,struct N *root)
{
int m = (z+y)/2;

if(z == y)
{
root->data -= s;
return;
}

if(site <= m)
{
sub(site,s,z,m,root->l);
root->data -= s;
}
else
{
sub(site,s,m+1,y,root->r);
root->data -= s;
}
}

int query(int ml,int mr,int z,int y,struct N *root)
{
int m = (z+y)/2;

if(ml == z && mr == y)
return root->data;

if(mr <= m)
{
return query(ml,mr,z,m,root->l);
}
else if(m+1 <= ml)
{
return query(ml,mr,m+1,y,root->r);
}
else
{
return ( query(ml,m,z,m,root->l) + query(m+1,mr,m+1,y,root->r) );
}
}

int main()
{
int T;
int icase = 0;
int n,i;
char order[20];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i = 1;i <= n; i++)
{
scanf("%d",&st[i]);
}
struct N *root = creat();

root->z = 1;
root->y = n;

change(1,n,root);

printf("Case %d:\n",++icase);

while(scanf("%s",order) != EOF)
{
if(order[0] == 'E')
break;
else if(order[0] == 'A')
{
int site,s;
scanf("%d %d",&site,&s);
add(site,s,1,n,root);
}
else if(order[0] == 'S')
{
int site,s;
scanf("%d %d",&site,&s);
sub(site,s,1,n,root);
}
else if(order[0] == 'Q')
{
int l,r;
scanf("%d %d",&l,&r);
int sum = query(l,r,1,n,root);
printf("%d\n",sum);
}
}

}
return 0;
}


#include <cstdio>//用数组模拟的线段树  跑了370+  玛德  说好的0ms呢
#include <algorithm>//在大白书 点修改  上看的  就是在不停的传递 树的节点编号node
#include <iostream>//当前节点的左子节点编号为2*node  右子节点为2*node+1;
#include <cstdlib>
#include <queue>
#include <cmath>
#include <cstring>

using namespace std;

int st[100010];
int a[50001];

int change(int node,int l,int r)
{
int m = (l+r)/2;
if(l == r)
{
st[node] = a[l];
return st[node];
}
st[node] = change(node+node,l,m) + change(node+node+1,m+1,r);
return st[node];
}

void add(int site,int s,int node,int l,int r)
{
int m = (l+r)/2;

if(l == r && r == site)
{
st[node] += s;
return ;
}
if(site <= m)
{
add(site,s,node+node,l,m);
st[node] += s;
return ;
}
if(m < site)
{
add(site,s,node+node+1,m+1,r);
st[node] += s;
return ;
}
}

void sub(int site,int s,int node,int l,int r)
{
int m = (l+r)/2;

if(l == r && r == site)
{
st[node] -= s;
return ;
}
if(site <= m)
{
sub(site,s,node+node,l,m);
st[node] -= s;
return ;
}
if(m < site)
{
sub(site,s,node+node+1,m+1,r);
st[node] -= s;
return ;
}
}

int query(int ml,int mr,int node,int l,int r)
{
if(ml == l && mr == r)
{
return st[node];
}
int m = (l+r)/2;

if(mr <= m)
{
return query(ml,mr,node+node,l,m);
}
if(m < ml)
{
return query(ml,mr,node+node+1,m+1,r);
}
return (query(ml,m,node+node,l,m) + query(m+1,mr,node+node+1,m+1,r));
}

int main()
{
int T,icase = 0;
int n,i;
char order[6];

scanf("%d",&T);

while(T--)
{
scanf("%d",&n);
for(i = 1;i <= n; i++)
scanf("%d",&a[i]);
change(1,1,n);
printf("Case %d:\n",++icase);
while(scanf("%s",order) != EOF)
{
if(order[0] == 'A')
{
int site,s;
scanf("%d %d",&site,&s);
add(site,s,1,1,n);
}
else if(order[0] == 'S')
{
int site,s;
scanf("%d %d",&site,&s);
sub(site,s,1,1,n);
}
else if(order[0] == 'Q')
{
int l,r;
scanf("%d %d",&l,&r);
printf("%d\n",query(l,r,1,1,n));
}
else if(order[0] == 'E')
break;
}

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: