zoukankan      html  css  js  c++  java
  • FZU 2171(线段树的延迟标记)

    题意:容易理解。

    分析:时隔很久,再一次写了一道线段树的代码,之前线段树的题也做了不少,包括各种延迟标记,但是在组队分任务之后,我们队的线段树就交给了另外一个队友在搞,

    然后我就一直没去碰线段树的题了,但是我现在发现这种做法不是很好,导致我现在的思维受到了很大的局限性,所以我现在想纠正这种错误,该做的就应该去做,就像

    高中一样不能太偏科!一道比较简单的线段树延迟标记!

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    
    struct node{
        int l , r;
        int sum;
        int color;
    }tree[100005*4];
    
    int n,len,a[100005];
    
    void buildTree(int l,int r,int n)
    {
        int mid = (l + r) >> 1;
        tree[n].l = l;
        tree[n].r = r;
        tree[n].color = 0;
        if(l == r)
        {
            tree[n].sum = a[l];
            return ;
        }
    
        buildTree(l,mid,n*2);
        buildTree(mid+1,r,n*2+1);
        tree[n].sum = tree[n*2].sum + tree[n*2+1].sum;
    }
    
    void pushDown(int n)
    {
        tree[n*2].sum = tree[n*2].sum - (tree[n*2].r - tree[n*2].l + 1) * tree[n].color;
        tree[n*2+1].sum = tree[n*2+1].sum - (tree[n*2+1].r - tree[n*2+1].l + 1) * tree[n].color;
        tree[n*2].color += tree[n].color;
        tree[n*2+1].color += tree[n].color;
    }
    
    int calSum(int x,int y,int n)
    {
        int mid = (tree[n].l + tree[n].r) >> 1;
        if(tree[n].l==x && tree[n].r == y)
            return tree[n].sum;
        if(tree[n].color)
        {
            pushDown(n);
            tree[n].color = 0;
        }
    
        if(y <= mid)
            return calSum(x , y , n*2);
        else if(x>mid)
            return calSum(x , y , n*2+1);
        else
            return calSum(x , mid , n*2) + calSum(mid+1 , y , n*2+1);
    }
    
    void update(int x , int y , int n)
    {
        int mid = (tree[n].l + tree[n].r) >> 1;
    
        if(tree[n].l == x && tree[n].r == y)
        {
            tree[n].sum = tree[n].sum - (tree[n].r - tree[n].l + 1);
            tree[n].color ++;
            return ;
        }
        if(y <= mid)
            update(x , y , n*2);
        else if(x > mid)
            update(x , y , n*2+1);
        else
        {
            update(x , mid , n*2);
            update(mid+1 , y , n*2+1);
        }
        tree[n].sum = tree[n*2].sum + tree[n*2 + 1].sum;
    }
    
    int main()
    {
        int i,q,x;
        while(scanf("%d%d%d",&n,&len,&q)!=EOF)
        {
            for(i=1;i<=n;i++)
                scanf("%d",&a[i]);
            buildTree(1,n,1);
            while(q--)
            {
                scanf("%d",&x);
                printf("%d
    ",calSum(x , x+len-1 , 1));
                update(x , x+len-1 , 1);
            }
        }
        return 0;
    }
  • 相关阅读:
    夜空中最亮的星
    让我留在你身边
    反思
    又想起民谣那诗
    初学积性函数
    P1049 装箱问题(01背包)
    set
    紫书 习题 10-4 UVa 1644(素数筛)
    紫书 习题 10-2 UVa 808(建立坐标+找规律)
    紫书 习题 10-1UVa 111040(找规律)
  • 原文地址:https://www.cnblogs.com/jiangjing/p/3696080.html
Copyright © 2011-2022 走看看