zoukankan      html  css  js  c++  java
  • [codevs]: 切水果(线段树) 2017-05-29 17:54 31人阅读 评论(0) 收藏

    1299 切水果
    时间限制: 1 s
    空间限制: 128000 KB
    题目等级 : 大师 Master

    题目描述 Description
    简单的说,一共N个水果排成一排,切M次,每次切[L,R]区间的所有水果(可能有的水果被重复切),每切完一次输出剩下水果数量
    数据已重新装配,不会出现OLE错误
    时限和数据范围适当修改,避免数据包过大而浪费空间资源

    输入描述 Input Description
    第1行共包括2个正整数,分别为N,M。
    接下来m行每行两个正整数L,R
    输出描述 Output Description
    一共输出M行,每行输出切完之后剩下水果数量
    样例输入 Sample Input
    10 3
    3 5
    2 8
    1 5
    样例输出 Sample Output
    7
    3
    2
    数据范围及提示 Data Size & Hint
    30%的数据满足N,M<=5,000
    60%的数据满足N,M<=100,000
    100% 的数据满足1<=L<=R<=N<=500,000,1<=M<=500,000

    线段树模板题 区间修改和区间查询

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #define N 1000010
    using namespace std;
    struct node{
        int left;int right;bool cut;int sum;
    }a[4*N];
    void build(int l,int r,int p){
        a[p].left=l;a[p].right=r;a[p].sum=r-l+1;
        if(l==r) {
            a[p].sum=1;
            return;
        }
        if(l<r) {
            build(l,(l+r)/2,2*p);
            build((l+r)/2+1,r,2*p+1);
        }
    }
    void pushdown(int p){
            a[2*p].cut=a[2*p+1].cut=a[p].cut;
            a[2*p].sum=a[2*p+1].sum=0;
    }
    void pushup(int p){
        a[p].sum=a[2*p].sum+a[2*p+1].sum;
    }
    void update(int l,int r,int p){
        if(a[p].cut){pushdown(p);return;}//如果这个区间被切 那么这个区间内没有水果 这个节点的下面的子树都为空 就不必再向下走 这一优化很关键 不然80if(a[p].left==l&&a[p].right==r)
        {a[p].sum=0;a[p].cut=1;return;}
        int mid=(a[p].left+a[p].right)/2;
        if(r<=mid) update(l,r,2*p);
        else if(l>mid) update(l,r,2*p+1);
        else {
            update(l,mid,2*p);update(mid+1,r,2*p+1);
        }
        pushup(p);
    }
    int main(){
        int n,m;
        scanf("%d%d",&n,&m);
        build(1,n,1);
        for(int k=1;k<=m;k++){
            int x,y;
            scanf("%d%d",&x,&y);
            update(x,y,1);
            printf("%d
    ",a[1].sum);
        }
        return 0;   
    }
  • 相关阅读:
    OpenCV/python读取,显示,保存图像
    机器学习的基本分类
    Qt Designer常用部件介绍
    C#数据类型列表
    SQL-Base 函数
    SQl 基本函数
    SQL 插入数据
    SQL-Base 用表组织数据
    SQLserver的基本用法
    C#MyBank(自己的看法,转账有点小问题)
  • 原文地址:https://www.cnblogs.com/xljxlj/p/7183638.html
Copyright © 2011-2022 走看看