HUSTOJ(敌兵布阵)

来源:互联网 发布:建筑节能设计软件 编辑:程序博客网 时间:2024/06/10 23:54

线段树的应用:很生疏,以后要多学才行


Link:http://vjudge.net/vjudge/contest/view.action?cid=56214#problem/A


/*#include<stdio.h>#include<climits>#include<algorithm>#include<stack>#include<iostream>#include<cmath>#include<set>#include<vector>#include<map>#include<queue>#include<string.h>using namespace std;const int maxn=50010;typedef struct  tree{   int left,right;   int value;}tree;tree s[maxn*4+10];int arr[maxn];char str[20];void buildtree(int node,int left,int right){   if(left==right)//左右两边相等   {  s[node].value=arr[left];  s[node].left=s[node].right;   }    else   {     buildtree(node*2,left,(right+left)/2);     buildtree(node*2+1,((right+left)/2)+1,right);     s[node].value=s[node*2].value+s[node*2+1].value;   }}int asktree(int tarl,int tarr,int node,int left ,int right){  if(left==tarl&&right==tarr)  {  return s[node].value;  }  int mid=(left+right)/2;  if(tarr<=mid) return asktree(tarl,tarr,2*node,left,mid);   else if(tarl>mid) return asktree(tarl,tarr,(2*node)+1,mid+1,right);   else   {      return asktree(tarl,mid,2*node,left,mid)+asktree(mid+1,tarr,(2*node)+1,mid+1,right);   }}int  main(void){  int t;  scanf("%d",&t);  for(int l=1;l<=t;l++)  {      int n;       scanf("%d",&n);       for(int i=1;i<=n;i++)       {     scanf("%d",&arr[i]);       }       buildtree(1,1,n);      // cout<<s[1].value<<endl;     // getchar();     printf("Case %d:\n",l);      while(scanf("%s",str)&&strcmp(str,"End")!=0)      {     if(strcmp(str,"Add")==0||strcmp(str,"Sub")==0)//changetree      {           int aa;           int ab;           scanf("%d %d",&aa,&ab);          if(strcmp(str,"Add")==0)            arr[aa]+=ab;          else if(strcmp(str,"Sub")==0)            arr[aa]-=ab;           buildtree(1,1,n);           //cout<<s[8].value<<endl;           //int c;           //cin>>c; } else if(strcmp(str,"Query")==0) {        int sta,end;scanf("%d %d",&sta,&end);printf("%d\n",asktree(sta,end,1,1,n));       }     getchar();      }     }  return 0;}使用线段树的非指针部分,超时*/#include<stdio.h>#include<iostream>using namespace std;const int maxn=50005;#define max(a,b) a>b?a:b//看看那个大 struct LineTree  {      int l,r;  //区间的开始和结束     int max_count;  //此时的左右子树的和     LineTree *lchild,*rchild;  //左右指针,指向左右子树 };  int pos;LineTree mem[3*maxn];//定义大小 int num[maxn];//原来的数组的数据 char ch[10];LineTree *NewTree(){   LineTree *s=&mem[pos++];   return s;}//建立一颗新树 LineTree *CreatTree(int a,int b){  int mid;  LineTree *s=NewTree();  s->l=a;  s->r=b;  if(b-a>1)  {     mid=(a+b)/2;     s->lchild=CreatTree(a,mid);     s->rchild=CreatTree(mid+1,b);     s->max_count=s->lchild->max_count+s->rchild->max_count;  }  else if(b-a==1)  {    s->lchild=CreatTree(a,a);    s->rchild=CreatTree(b,b);    s->max_count=s->lchild->max_count+s->rchild->max_count;  }  else s->max_count=num[s->l];  return s;}void update(LineTree *s,int a, int b){   if(s->r==s->l)   {   if(strcmp(ch,"Add")==0)     s->max_count+=b;           else s->max_count-=b;           return ;   }//修改数据    if(s->lchild->r>=a) update(s->lchild,a,b);   else if(s->rchild->l<=a) update(s->rchild,a,b);    s->max_count=s->lchild->max_count+s->rchild->max_count;}int search(LineTree *s,int a,int b){ if(s->l==a&&s->r==b) return s->max_count; int mid=(s->l+s->r)/2;      if(b<=mid) return search(s->lchild,a,b);      else if(mid<a) return search(s->rchild,a,b);     else      {          return search(s->lchild,a,mid)+search(s->rchild,mid+1,b);      }  }int main()  {      int t,n,i,flag=0;      int a,b;      scanf("%d",&t);      while(t--)      {          pos=0;          LineTree *s;          flag++;          scanf("%d",&n);          for(i=1;i<=n;i++)              scanf("%d",&num[i]);          s=CreatTree(1,n);          getchar();          printf("Case %d:\n",flag);          while(scanf("%s",ch))          {              if(strcmp(ch,"End")==0)                  break;              scanf("%d%d",&a,&b);              if(strcmp(ch,"Query")==0)              {                  printf("%d\n",search(s,a,b));              }              else                  update(s,a,b);          }      }      return 0;  }  


0 0
原创粉丝点击