zoukankan      html  css  js  c++  java
  • 线段树模板-1204-影子的宽度

    https://ftp.bmp.ovh/imgs/2020/06/850ec126e9a0b8c2.png

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int l,r,n,ans;
    struct fdfdfd{int l,r,flag,sum;}a[800005];
    void build(int x,int left,int right)
    {
    	a[x].l=left; a[x].r=right;
    	if(left==right) return;
    	int mid=(left+right)>>1;
    	build(x<<1,left,mid);
    	build(x<<1|1,mid+1,right);
    }
    void pushdown(int x)
    {
    	if(a[x].flag)
    	{
    		a[x<<1].flag=a[x<<1|1].flag=1;
    		a[x<<1].sum=a[x<<1].r-a[x<<1].l+1;
    		a[x<<1|1].sum=a[x<<1|1].r-a[x<<1|1].l+1;
    		a[x].flag=0; a[x].sum=0;
    	}
    }
    void add(int x,int left,int right)
    {
    	if(a[x].r<left||a[x].l>right) return;
    	if(a[x].l>=left&&a[x].r<=right){a[x].flag=1; a[x].sum=a[x].r-a[x].l+1; return;}
    	pushdown(x);
    	add(x<<1,left,right);
    	add(x<<1|1,left,right);
    	if(a[x<<1].flag&&a[x<<1|1].flag){a[x].sum=a[x].r-a[x].l+1; a[x].flag=1;}
    }
    void ask(int x,int left,int right)
    {
    	if(a[x].r<left||a[x].l>right) return;
    	if(a[x].l>=left&&a[x].r<=right&&a[x].flag){ans+=a[x].sum; return;}
    	if(a[x].l==a[x].r) return;
    	pushdown(x);
    	ask(x<<1,left,right);
    	ask(x<<1|1,left,right);
    	if(a[x<<1].flag&&a[x<<1|1].flag){a[x].sum=a[x].r-a[x].l+1; a[x].flag=1;}
    }
    int main()
    {
    	scanf("%d%d%d",&l,&r,&n);
    	build(1,l,r-1);
    	for(int i=1;i<=n;++i)
    	{
    		int f1,f2; scanf("%d%d",&f1,&f2);
    		add(1,f1,f2-1);
    	}
    	ask(1,l,r-1); printf("%d",ans);
    	return 0;
    }
    
  • 相关阅读:
    谈一谈循环的性能提升
    Web前端性能优化的9大问题
    随机获取一种颜色值的三种方法
    ES6还是ES2015?
    history.back(-1)和history.go(-1)的区别
    关于overflow-y:scroll ios设备不流畅的问题
    前端如何压缩图片
    【转】理解JavaScript之闭包
    关于如何给数字排序
    本地缓存localstorage使用
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/13159444.html
Copyright © 2011-2022 走看看