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 }
  • 相关阅读:
    【机器学习】浅谈协方差
    python {}.format
    【机器学习】准确率、精确率、召回率
    【声纹识别】 EER
    【机器学习】 最形象的入门
    逻辑卷-LVM
    RAID及软RAID的实现
    输入数字or 字符串,统计重复次数---字典统计练习
    Python-数据结构之dict(字典*****)
    POJ 3204 网络流的必须边
  • 原文地址:https://www.cnblogs.com/xiaozhuyang/p/hdu1698.html
Copyright © 2011-2022 走看看