zoukankan      html  css  js  c++  java
  • hdu Just a Hook 线段树——成段操作 区域覆盖

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

    大意:先输入一个t代表有t个案例,然后输入个数n代表一共有n个数,值为他们的编号1~n。然后输入q,代表q各更新,再输入a,b,c,代表把a_b的值全部改为c;然后求出所有的和。

    View Code
     1 #include <stdio.h>
     2 #define maxn 100007*4
     3 struct node
     4 {
     5     int sum;
     6     int lazy;
     7 }tr[maxn];
     8 void pushup(int rt)
     9 {
    10     tr[rt].sum = tr[rt<<1].sum+tr[rt<<1|1].sum;
    11 }
    12 void build(int l,int r,int rt)
    13 {
    14     if(l == r)
    15     {
    16         tr[rt].sum = 1;
    17         tr[rt].lazy = 0;
    18         return;
    19     }
    20     int m = (l+r)>>1;
    21     build(l,m,rt<<1);
    22     build(m+1,r,rt<<1|1);
    23     pushup(rt);
    24     return;
    25 }
    26 void pushdown(int rt,int len)
    27 {
    28     if(tr[rt].lazy)
    29     {
    30         tr[rt<<1].lazy = tr[rt<<1|1].lazy = tr[rt].lazy;
    31         tr[rt<<1].sum = (len-(len>>1))*tr[rt].lazy;
    32         tr[rt<<1|1].sum = (len>>1)*tr[rt].lazy;
    33         tr[rt].lazy = 0;
    34     }
    35 }
    36 void update(int lx,int rx,int l,int r,int val,int rt)
    37 {
    38     if(lx <= l && rx >= r)//只要在要求的区域内就改变。
    39     {
    40         tr[rt].sum = val*(r-l+1);
    41         tr[rt].lazy = val;
    42         return;
    43     }
    44     pushdown(rt,r-l+1);
    45     int m = (l+r)>>1;
    46     if(lx <= m)
    47         update(lx,rx,l,m,val,rt<<1);
    48     if(rx > m)
    49         update(lx,rx,m+1,r,val,rt<<1|1);
    50     pushup(rt);
    51     return;
    52 }
    53 int main()
    54 {
    55     int cas,t,n,m,i,j;
    56     scanf("%d",&t);
    57     cas = 0;
    58     while(t--)
    59     {
    60         cas++;
    61         scanf("%d",&n);
    62         build(1,n,1);
    63         scanf("%d",&m);
    64         int x,y,val;
    65         while(m--)
    66         {
    67             scanf("%d %d %d",&x,&y,&val);
    68             update(x,y,1,n,val,1);
    69         }
    70         printf("Case %d: The total value of the hook is %d.\n",cas,tr[1].sum);
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    Mac 终端自动补全忽略大小写
    AtCoder ABC 155F Perils in Parallel
    AtCoder ABC 155E Payment
    AtCoder ABC 155D Pairs
    AtCoder ABC 154F Many Many Paths
    牛客 边界都是1的最大正方形大小
    牛客 打印N个数组整体最大的Top K
    牛客 数组中子数组的最大累乘积
    牛客 在数组中找到一个局部最小的位置
    牛客 子矩阵最大累加和问题
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2634516.html
Copyright © 2011-2022 走看看