zoukankan      html  css  js  c++  java
  • hud 1698 线段树(延迟标记)

     这道题居然以dota为背景,很受寝室同学的关注。

    自己写的延迟,后来发现错误了,看了ppt的思想,该写了好久。1A

    #include<stdio.h>
    struct st
    {
        int l;
        int r;
        int color;
        int num;
    }f[100002*4];
    int sum1;
    #define HH 1
    void build(int l,int r,int n)
    {
        int mid=(l+r)/2;
        f[n].l=l;
        f[n].r=r;
        f[n].num=1;
        f[n].color=0;
        if(l<r)
        {
            build(l,mid,n*2);
            build(mid+1,r,n*2+1);
        }
    }
    void update(int l,int r,int num,int n)
    {
        int mid=(f[n].l+f[n].r)/2;
        if(f[n].l==l&&f[n].r==r)
        {
            f[n].num=num;
            f[n].color=0;
            return ;
        }
        //if(f[n].num==num) continue; cuo wu
        if(f[n].color==0)
        {
               f[n].color=HH;
             f[n*2].num=f[n].num;
               f[n*2+1].num=f[n].num;
               f[n*2].color=0; //
               f[n*2+1].color=0; //
        }
           if(mid>=r) update(l,r,num,n*2);
        else if(mid<l) update(l,r,num,n*2+1);
        else {
            update(l,mid,num,n*2);
            update(mid+1,r,num,n*2+1);
        }
    }
    void getsum(int l,int r,int n)
    {
        int mid=(f[n].l+f[n].r)/2;
        if(f[n].l==l&&f[n].r==r&&f[n].color==0)
        {
        //    printf("%d %d %d\n",f[n].l,f[n].r,f[n].num);
            sum1=sum1+(f[n].r-f[n].l+1)*f[n].num;
        }
        else if(mid>=r)
            getsum(l,r,n*2);
        else if(mid<l)
            getsum(l,r,n*2+1);
        else {
            getsum(l,mid,n*2);
            getsum(mid+1,r,n*2+1);
        }
    }
    int main()
    {
        int i,t,time,n,m,l,r,num;
        while(scanf("%d",&t)>0)
        {
            time=0;
            while(t--)
            {
                scanf("%d",&n);
                build(1,n,1);
                scanf("%d",&m);
                sum1=0;
                for(i=1;i<=m;i++)
                {
                    scanf("%d%d%d",&l,&r,&num);
                    update(l,r,num,1);
                }
                getsum(1,n,1);
                printf("Case %d: The total value of the hook is %d.\n",++time,sum1);
            }
        }
        return 0;
    }
    
    
        
  • 相关阅读:
    python入坑级
    nginx配置文件详解
    nginx看端口使用情况
    linux安装nginx
    linux安装jdk1.7
    linux设置tomcat开机启动
    redis master配置了密码进行主从同步
    linux搭建mysql 5.6.28
    linux搭建redis数据库
    找出一组数里出现频率最高的3个数(1.3)
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3032020.html
Copyright © 2011-2022 走看看