线段树

来源:互联网 发布:金无怠 知乎 编辑:程序博客网 时间:2024/05/18 10:16

1.hdu1166 敌兵布阵

#include <iostream>#include <string>using namespace std;#define MAX_N 50000string str;int sum;  //记录总兵数int num[MAX_N+1]={0};  //记录各个兵营的兵数typedef struct  node{int left;int right;int data;node* lchild;node* rchild;node(){left = right = data = 0;}}Tree;Tree* CreateTree(int a,int b){Tree* r;r = (Tree*)malloc(sizeof(Tree));r->left = a;r->right = b;if(a == b){r->data = num[a];r->lchild = r->rchild = NULL;}else{int mid = (a+b)>>1;r->lchild = CreateTree(a,mid);r->rchild = CreateTree(mid+1,b);r->data = r->lchild->data + r->rchild->data;}return r;}void insert(Tree* r,int a,int b){if(r->left == a && r->right == a){r->data += b;return;}int mid = (r->left + r->right)>>1;if(a <= mid){insert(r->lchild,a,b);}else {insert(r->rchild,a,b);}r->data += b;}void find(Tree* r,int a,int b){if(r->left == a && r->right == b){sum += r->data;return;}int mid = (r->left + r->right)>>1;if(b<=mid){find(r->lchild,a,b);}else if(a>mid){find(r->rchild,a,b);}else{find(r->lchild,a,mid);find(r->rchild,mid+1,b);}}int main(){int t,n,x,y;int i;int ca = 0;scanf("%d",&t);while(t--){printf("Case %d:/n",++ca);scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&num[i]);}Tree* T;T = CreateTree(1,n);while(cin>>str){if(str == "Query"){sum = 0;scanf("%d%d",&x,&y);find(T,x,y);printf("%d/n",sum);}else if(str == "Add"){scanf("%d%d",&x,&y);insert(T,x,y);}else if(str == "Sub"){scanf("%d%d",&x,&y);insert(T,x,-y);}else{break;}}}return 0;}

2.hdu1754 I Hate It

#include <iostream>using namespace std;#define MAX_N 200000int big;typedef struct node{    int left;    int right;    int data;    int maxx;}node;node stu[MAX_N*4];//int num[MAX_N+1];int Max(int a,int b){    return a>b?a:b;}void CreateTree(int ii,int a,int b){    stu[ii].left = a;    stu[ii].right = b;    stu[ii].maxx = 0;    stu[ii].data = 0;    if(a == b)    {        return;    }    else    {        int mid = (a+b)>>1;        CreateTree(ii*2,a,mid);        CreateTree(ii*2+1,mid+1,b);    }}void updata(int ii,int a,int b){    if(stu[ii].left == a && stu[ii].right == a)    {        stu[ii].data = b;        stu[ii].maxx = b;    }    else    {        int mid = (stu[ii].left+stu[ii].right)>>1;        if(a <= mid)        {            updata(ii*2,a,b);        }        else        {            updata(ii*2+1,a,b);        }        if(b > stu[ii].maxx)            stu[ii].maxx = b;    }}void find(int ii,int a,int b){    if(stu[ii].left == a && stu[ii].right == b)    {        //printf("%d/n",stu[ii].maxx);        if(stu[ii].maxx > big)            big = stu[ii].maxx;    }    else     {        int mid = (stu[ii].left + stu[ii].right)>>1;        if(b <= mid)        {            find(ii*2,a,b);        }        else if(a > mid)        {            find(ii*2+1,a,b);        }        else        {            find(ii*2,a,mid);            find(ii*2+1,mid+1,b);        }    }}int main(){    int n,m,num;    int i;        while(scanf("%d%d",&n,&m)!=EOF)    {        CreateTree(1,1,n);        for(i=1;i<=n;i++)        {            scanf("%d",&num);            updata(1,i,num);        }        char c;        int x1,x2;        while(m--)        {            scanf("%*c%c",&c);            scanf("%d%d",&x1,&x2);            if(c == 'Q')            {                        big = 0x80000000;                find(1,x1,x2);                printf("%d/n",big);            }            else            {                updata(1,x1,x2);            }        }    }    return 0;}
3.hdu1698 Just a Hook
#include <iostream>using namespace std;#define MAX_N 100000struct node{int left;int right;int data;int sum;};node hook[4*MAX_N];void CreateTree(int ii,int a,int b){hook[ii].left = a;hook[ii].right = b;if(a == b){hook[ii].data = 1;hook[ii].sum = 1;}else{int mid = (a+b)>>1;CreateTree(ii*2,a,mid);CreateTree(ii*2+1,mid+1,b);hook[ii].data = 0;hook[ii].sum = (hook[ii*2].sum + hook[ii*2+1].sum);}}void updata(int ii,int a,int b,int c){if(hook[ii].left == a && hook[ii].right == b){hook[ii].data = c;hook[ii].sum = (b-a+1)*c;}else{if(hook[ii].data > 0){hook[ii*2].data = hook[ii].data;hook[ii*2].sum = (hook[ii*2].right - hook[ii*2].left+1)*hook[ii*2].data;hook[ii*2+1].data = hook[ii].data;hook[ii*2+1].sum = (hook[ii*2+1].right - hook[ii*2+1].left+1)*hook[ii*2+1].data;}hook[ii].data = 0; //写的时候这个丢掉了。一直错int mid = (hook[ii].left + hook[ii].right)>>1;if(b <= mid){updata(ii*2,a,b,c);}else if(a > mid){updata(ii*2+1,a,b,c);}else{updata(ii*2,a,mid,c);updata(ii*2+1,mid+1,b,c);}hook[ii].sum = hook[ii*2].sum + hook[ii*2+1].sum;}}int main(){int t,n,m,x1,x2,x3;int i;scanf("%d",&t);for(i=1;i<=t;i++){scanf("%d",&n);CreateTree(1,1,n);scanf("%d",&m);while(m--){scanf("%d%d%d",&x1,&x2,&x3);updata(1,x1,x2,x3);}printf("Case %d: The total value of the hook is %d./n",i,hook[1].sum);}return 0;}
.hdu2795 Billboard

#include <iostream>using namespace std;#define MAX_N 200000int h,w,n;struct node{    int left;    int right;    int data;   //表示这一段中最大的数};node T[4*MAX_N];int Max(int a,int b){    return a>b?a:b;}void CreateTree(int ini,int a,int b){    T[ini].left = a;    T[ini].right = b;    T[ini].data = w; //一开始最大都是宽度    if(a == b)    {        return;    }    else    {        int mid = (a + b) >> 1;        CreateTree(ini*2,a,mid);        CreateTree(ini*2+1,mid+1,b);    }}void insert(int ini,int a){    if(T[ini].left == T[ini].right)    {        printf("%d/n",T[ini].left);        T[ini].data -= a;    }    else    {        if(T[ini*2].data >= a)        {            insert(ini*2,a);        }        else        {            insert(ini*2+1,a);        }        T[ini].data = Max(T[ini*2].data,T[ini*2+1].data);    }        }int main(){    int i,num;    while(scanf("%d%d%d",&h,&w,&n)!=EOF)    {        if(h < n)            CreateTree(1,1,h);        else            CreateTree(1,1,n);      //建树按照min(h,n)来建,这样就保证最大时n。        for(i=0;i<n;i++)        {            scanf("%d",&num);            if(num > T[1].data)            {                printf("-1/n");            }            else                insert(1,num);        }    }    return 0;}


原创粉丝点击