zoukankan      html  css  js  c++  java
  • hdu 1698 线段树 一段更新染色

    其中的标志s用的很妙,非常精髓,标记是否是纯色,单色,是否往下递归,计算单色数据

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    const int MAXN=2000000;
    
    int n,m,a[MAXN+5],ans;
    
    struct tree
    {
    	int l,r;
    
    	int s;
    
    }trees[MAXN*2];
    
    int max(int k,int l)
    {
    	return k>l?k:l;
    }
    
    void buildtree(int rs,int l,int r)
    {
    	//printf("%d %d %d\n",rs,l,r);
    	trees[rs].l=l;
    	trees[rs].r=r;
    	trees[rs].s=1;
    
    	if(r==l)
    		return;
    
    	int mid=(l+r)/2;
    
    	buildtree(rs*2,l,mid);
    	buildtree(rs*2+1,mid+1,r);
    }
    
    void update(int rs,int l,int r,int u)
    {
    	if(trees[rs].l>r||trees[rs].r<l)
    		return ;
    
    	//printf("%d %d %d %d %d\n",rs,k,l,trees[rs].l,trees[rs].r);
    	if(trees[rs].l>=l&&trees[rs].r<=r)
    	{
    		trees[rs].s=u;
    		return ;
    	}
    
    	if(trees[rs].s!=-1)
    	{
    		trees[2*rs].s=trees[rs].s;
    		trees[2*rs+1].s=trees[rs].s;
    		trees[rs].s=-1;
    	}
    
    	update(rs*2,l,r,u);
    	update(rs*2+1,l,r,u);
    }
    
    void querry(int rs)
    {
    	if(trees[rs].s!=-1)
    	{
    		ans+=(trees[rs].r-trees[rs].l+1)*trees[rs].s;
    		return ;
    	}
    
    	if(trees[rs].l==trees[rs].r)
    		return ;
    	querry(2*rs);
    	querry(2*rs+1);
    }
    
    int main()
    {
    	int i,ac,bc,t,p;
    
    	int c;
    
    	scanf("%d",&t);
    
    	p=1;
    
    	while(t--)
    	{
    		scanf("%d%d",&n,&m);
    
    		buildtree(1,1,n);
    
    		for(i=1;i<=m;i++)
    		{
    			scanf("%d%d%d",&c,&ac,&bc);
    
    			update(1,c,ac,bc);
    		}
    		ans=0;
    
    		querry(1);
    
    		printf("Case %d: The total value of the hook is %d.\n",p++,ans);
    	}
    
    	return 0;
    }
    

      

  • 相关阅读:
    JFreeChart API 说明(转)
    杭电1064
    杭电2734
    杭电1170
    杭电1197
    杭电2629
    杭电1062
    杭电2088
    杭电1205
    杭电1004
  • 原文地址:https://www.cnblogs.com/jackes/p/2453758.html
Copyright © 2011-2022 走看看