线段树

1.hdu1166 敌兵布阵

#include <iostream>
#include <string>
using namespace std;
#define MAX_N 50000

string 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 200000

int 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 100000

struct 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 200000

int 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值