• hdu 1166(线段树)


    点击打开链接


    都说是模版级别的。。

    但是还是RE了两次啊(是因为输入的原因)。。。。


    #include"stdio.h"
    #include"string.h"
    #define N 50011
    struct tree
    {
    	int x,y,mid;
    	int count;
    }A[4*N];
    
    void creat(int x,int y,int k)
    {
    	A[k].x=x;
    	A[k].y=y;
    	A[k].mid=(x+y)/2;
    	A[k].count=0;
    	if(x==y)return ;
    	creat(x,A[k].mid,2*k);
    	creat(A[k].mid+1,y,2*k+1);
    	return;
    }
    
    void insert(int x,int y,int k)
    {
    	if(A[k].x==A[k].y&&A[k].x==x)
    	{
    		A[k].count+=y;
    		return ;
    	}
    	if(x<=A[k].mid)insert(x,y,2*k);
    	else insert(x,y,2*k+1);
    	A[k].count=A[2*k].count+A[2*k+1].count;
    	return ;
    }
    
    int search(int x,int y,int k)
    {
    	if(A[k].x==x&&A[k].y==y)
    		return A[k].count;
    	int ans=0;
    	if(y<=A[k].mid)
    		ans+=search(x,y,2*k);
    	else if(x>A[k].mid)
    		ans+=search(x,y,2*k+1);
    	else
    	{
    		ans+=search(x,A[k].mid,2*k);
    		ans+=search(A[k].mid+1,y,2*k+1);
    	}
    	return ans;
    }
    int main()
    {
    	int T,t;
    	int n;
    	int x,y,a;
    	int i;
    	char s[15];
    	scanf("%d",&T);
    	t=1;
    	while(T--)
    	{
    		printf("Case %d:\n",t++);
    		scanf("%d",&n);
    		creat(1,n,1);
    		for(i=1;i<=n;i++)
    		{
    			scanf("%d",&a);
    			insert(i,a,1);
    		}
    		getchar();
    		while(scanf("%s",s),s[0]!='E')
    		{
    			scanf("%d%d",&x,&y);
    			if(s[0]=='A')insert(x,y,1);
    			else if(s[0]=='S')insert(x,-y,1);
    			else if(s[0]=='Q')printf("%d\n",search(x,y,1));
    		}
    	}
    	return 0;
    }
    
    				
    


  • 相关阅读:
    各种排序
    最大子数组的和与积
    字符串距离
    二叉树的基本操作
    C++11创建线程的几种方式
    二分查找
    汉诺塔问题
    读写锁实现
    全排列
    数字转汉字
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3095476.html
Copyright © 2020-2023  润新知