• [HDU 6315] Naive Operations


    [题目链接]

               http://acm.hdu.edu.cn/showproblem.php?pid=6315

    [算法]

             线段树

    [代码]

             

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 100010
    
    int i,n,q,l,r;
    int b[MAXN];
    char op[10];
    
    struct SegmentTree
    {
            struct Node
            {
                    int l,r;
                    int sum,val;
                    int tag;
            } Tree[MAXN << 2];
            inline void update(int index)
            {
                    Tree[index].val = min(Tree[index << 1].val,Tree[index << 1 | 1].val);
                    Tree[index].sum = Tree[index << 1].sum + Tree[index << 1 | 1].sum;
            }
            inline void pushdown(int index)
            {
                    if (Tree[index].tag)
                    {
                            Tree[index << 1].val -= Tree[index].tag;
                            Tree[index << 1 | 1].val -= Tree[index].tag;
                            Tree[index << 1].tag += Tree[index].tag;
                            Tree[index << 1 | 1].tag += Tree[index].tag; 
                            Tree[index].tag = 0;
                    }
            }
            inline void build(int index,int l,int r)
            {
                    int mid;
                    Tree[index].l = l;
                    Tree[index].r = r;
                    Tree[index].sum = 0;
                    Tree[index].tag = 0;
                    if (l == r) 
                    {
                            Tree[index].val = b[l];
                            return;
                    }
                    mid = (l + r) >> 1;
                    build(index << 1,l,mid);
                    build(index << 1 | 1,mid + 1,r);
                    update(index);
            }
            inline void modify(int index,int l,int r)
            {
                    int mid;
                    if (l == r)
                    {
                            Tree[index].val = b[l];
                            Tree[index].sum++;
                            return;
                    }
                    pushdown(index);
                    mid = (Tree[index].l + Tree[index].r) >> 1;
                    if (!Tree[index << 1].val) modify(index << 1,l,mid);
                    if (!Tree[index << 1 | 1].val) modify(index << 1 | 1,mid + 1,r);
                    update(index);
            }
            inline void add(int index,int l,int r)
            {
                    int mid;
                    if (Tree[index].l == l && Tree[index].r == r)
                    {
                            Tree[index].val--;
                            Tree[index].tag++;
                            if (Tree[index].val == 0) modify(index,l,r);
                            return;
                    }
                    pushdown(index);
                    mid = (Tree[index].l + Tree[index].r) >> 1;
                    if (mid >= r) add(index << 1,l,r);
                    else if (mid + 1 <= l) add(index << 1 | 1,l,r);
                    else
                    {
                            add(index << 1,l,mid);
                            add(index << 1 | 1,mid + 1,r);
                    }
                    update(index);
            }
            inline int query(int index,int l,int r)
            {
                    int mid;
                    if (Tree[index].l == l && Tree[index].r == r)
                            return Tree[index].sum;
                    pushdown(index);
                    mid = (Tree[index].l + Tree[index].r) >> 1;
                    if (mid >= r) return query(index << 1,l,r);
                    else if (mid + 1 <= l) return query(index << 1 | 1,l,r);
                    else return query(index << 1,l,mid) + query(index << 1 | 1,mid + 1,r);
            } 
    } T;
    
    int main() 
    {
            
            while (scanf("%d%d",&n,&q) != EOF)
            {
                    for (i = 1; i <= n; i++) scanf("%d",&b[i]);
                    T.build(1,1,n);    
                    while (q--)
                    {
                            scanf("%s",&op);
                            if (strcmp(op,"add") == 0) 
                            {
                                    scanf("%d%d",&l,&r);
                                    T.add(1,l,r);        
                            }    else
                            {
                                    scanf("%d%d",&l,&r);
                                    printf("%d
    ",T.query(1,l,r));
                            }
                    }    
            }
            
            return 0;
        
    }
  • 相关阅读:
    利用列表的知识写一个购物小程序
    基本数据类型(While循环,For循环,列表以及相关用法)
    爬虫学习--Day3(小猿圈爬虫开发_1)
    爬虫学习--常用的正则表达式 Day3
    win10系统任务栏点击没有反应
    python 内建类型
    MWeb
    jmeter创建测试计划
    jmeter建立FTP测试计划
    jmeter配置元件
  • 原文地址:https://www.cnblogs.com/evenbao/p/9385190.html
Copyright © 2020-2023  润新知