zoukankan      html  css  js  c++  java
  • hdu698 Just a Hook 线段树-成段更新

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698

    很简单的一个线段树的题目,每次更新采用lazy思想,这里我采用了增加一个变量z,z不等于0时其绝对值表示当前区间的牌的性质并且代表更新到此区间

    代码:

     1 #include<iostream>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<cstdio>
     5 using namespace std;
     6 #define maxn 100010
     7 class node
     8 {
     9    public:
    10    int l;
    11    int r;
    12    int sum;
    13    int z;
    14 };
    15 int n;
    16 int q;
    17 int x,y,z;
    18 node segTree[maxn*3];
    19 void build(int num, int l,int r)
    20 {
    21     segTree[num].l=l;
    22     segTree[num].r=r;
    23     segTree[num].z=0;
    24     if(l==r)
    25     {
    26         segTree[num].sum=1;
    27         return ;
    28     }
    29     int mid=(l+r)/2;
    30     build(num*2,l,mid);
    31     build(num*2+1,mid+1,r);
    32     segTree[num].sum=segTree[num*2].sum+segTree[num*2+1].sum;
    33 }
    34 void Update(int num,int l,int r,int z)
    35 {
    36    if(segTree[num].l ==l && segTree[num].r ==r)
    37    {
    38       segTree[num].z=z;
    39       segTree[num].sum=(segTree[num].r- segTree[num].l +1)*segTree[num].z;
    40       return ;
    41    } 
    42    int mid=(segTree[num].l + segTree[num].r)/2;
    43    if(segTree[num].z)
    44     {
    45         Update(num*2,segTree[num].l,mid,segTree[num].z);
    46         Update(num*2+1,mid+1,segTree[num].r,segTree[num].z);
    47         segTree[num].z=0;
    48     }
    49 
    50    if(r<=mid)
    51        Update(num*2,l,r,z);
    52    else if(l>mid) Update(num*2+1,l,r,z);
    53    else
    54         {
    55            Update(num*2,l,mid,z);
    56            Update(num*2+1,mid+1,r,z);
    57         }
    58    segTree[num].sum = segTree[num*2].sum + segTree[num*2+1].sum;
    59 }
    60 int main()
    61 {
    62   int t;
    63   scanf("%d",&t);
    64   int iCase=1;
    65   while(t--)
    66   {
    67      scanf("%d%d",&n,&q);
    68      build(1,1,n);
    69      for(int i=0;i<q;i++)
    70      {
    71            scanf("%d%d%d",&x,&y,&z);
    72            Update(1,x,y,z);
    73      }
    74      cout<<"Case "<<iCase++<<":"<<" The total value of the hook is "<<segTree[1].sum<<"."<<endl;
    75      
    76   }
    77   return 0;
    78 }
  • 相关阅读:
    C# 实现 Snowflake算法生成唯一性Id
    kafka可视化客户端工具(Kafka Tool)的基本使用(转)
    docker 安装kafka
    Model类代码生成器
    使用docker 部署rabbitmq 镜像
    Vue 增删改查 demo
    git 提交代码到库
    Android ble蓝牙问题
    mac 配置 ssh 到git (Could not resolve hostname github.com, Failed to connect to github.com port 443 Operation timed out)
    okhttp
  • 原文地址:https://www.cnblogs.com/xiaozhuyang/p/hdu1698.html
Copyright © 2011-2022 走看看