zoukankan      html  css  js  c++  java
  • HDU 1698(线段树)

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

    属于区间染色与区间求和问题,用线段树解决~~~

    代码如下:

     1 #include <stdio.h>
     2 #define N 300002
     3 #define LL(x) ((x)<<1)
     4 #define RR(x) ((x)<<1|1)
     5 
     6 typedef struct
     7 {
     8     int lson, rson;
     9     int val;
    10 } seg_tree;
    11 
    12 seg_tree s[N];
    13 
    14 void build(int left, int right, int idx)
    15 {
    16     s[idx].lson = left;
    17     s[idx].rson = right;
    18     s[idx].val = 1;
    19     if(left == right)
    20     {
    21         return;
    22     }
    23     int mid = (left + right) / 2;
    24     build(left, mid, LL(idx));
    25     build(mid + 1, right, RR(idx));
    26 }
    27 
    28 void update(int left, int right, int idx, int val)
    29 {
    30     if(left <= s[idx].lson && s[idx].rson <= right)
    31     {
    32         s[idx].val = val;
    33         return;
    34     }
    35     if(s[idx].val != -1)
    36     {
    37         s[LL(idx)].val = s[RR(idx)].val = s[idx].val;
    38         s[idx].val = -1;
    39     }
    40     int mid = (s[idx].lson + s[idx].rson) / 2;
    41     if(left <= mid)
    42         update(left, right, LL(idx), val);
    43     if(right > mid)
    44         update(left, right, RR(idx), val);
    45 }
    46 
    47 int query(int left, int right, int idx)
    48 {
    49     if(left == s[idx].lson && right == s[idx].rson)
    50     {
    51         if(s[idx].val != -1)
    52         {
    53             return (right - left + 1) * s[idx].val;
    54         }
    55         else
    56         {
    57             int mid = (s[idx].lson + s[idx].rson) / 2;
    58             return query(left, mid, LL(idx)) + query(mid + 1, right, RR(idx));
    59         }
    60     }
    61     int mid = (s[idx].lson + s[idx].rson) / 2;
    62     if(right <= mid)
    63     {
    64         return query(left, right, LL(idx));
    65     }
    66     else if(left > mid)
    67     {
    68         return query(left, right, RR(idx));
    69     }
    70     else
    71     {
    72         return query(left, mid, LL(idx)) + query(mid + 1, right, RR(idx));
    73     }
    74 }
    75 
    76 int main()
    77 {
    78     int t;
    79     int n;
    80     int ncase;
    81     int i, j;
    82     int a, b, val;
    83     scanf("%d", &t);
    84     for(i = 1; i <= t; i++)
    85     {
    86         scanf("%d", &n);
    87         scanf("%d", &ncase);
    88         build(1, n, 1);
    89         for(j = 0; j < ncase; j++)
    90         {
    91             scanf("%d%d%d", &a, &b, &val);
    92             update(a, b, 1, val);
    93         }
    94         printf("Case %d: The total value of the hook is %d.\n", i, query(1, n, 1));
    95     }
    96     return 0;
    97 }

    第二种代码:

      1 #include <stdio.h>
      2 #define N 300000
      3 #define LL(x) ((x)<<1)
      4 #define RR(x) ((x)<<1|1)
      5 
      6 typedef struct
      7 {
      8     int lson, rson;
      9     int val;
     10 }  seg_tree;
     11 seg_tree s[N];
     12 
     13 int ans;
     14 
     15 void build(int left, int right, int idx)
     16 {
     17     s[idx].lson = left;
     18     s[idx].rson = right;
     19     s[idx].val = 1;
     20     if(left == right)
     21         return;
     22     else
     23     {
     24         int mid = (left + right) / 2;
     25         build(left, mid, LL(idx));
     26         build(mid + 1, right, RR(idx));
     27     }
     28 }
     29 
     30 void update(int left, int right, int idx, int val)
     31 {
     32     if(left == s[idx].lson && s[idx].rson == right)
     33     {
     34         s[idx].val = val;
     35         return;
     36     }
     37     if(s[idx].val == val)
     38         return;
     39     if(s[idx].val > 0)
     40     {
     41         s[LL(idx)].val = s[RR(idx)].val = s[idx].val;
     42         s[idx].val = 0;
     43     }
     44     int mid = (s[idx].lson + s[idx].rson) / 2;
     45     if(right <= mid)
     46     {
     47         update(left, right, LL(idx), val);
     48     }
     49     else if(left > mid)
     50     {
     51         update(left, right, RR(idx), val);
     52     }
     53     else
     54     {
     55         update(left, mid, LL(idx), val);
     56         update(mid + 1, right, RR(idx), val);
     57     }
     58 }
     59 
     60 int get_sum(int left, int right, int idx)
     61 {
     62     if(s[idx].val > 0)
     63     {
     64         return (s[idx].rson - s[idx].lson + 1) * s[idx].val;
     65     }
     66     else
     67     {
     68         int mid = (s[idx].lson + s[idx].rson) / 2;
     69         if(right <= mid)
     70         {
     71             return get_sum(left, right, LL(idx));
     72         }
     73         else if(left > mid)
     74         {
     75             return get_sum(left, right, RR(idx));
     76         }
     77         else
     78         {
     79             return get_sum(left, mid, LL(idx)) + get_sum(mid + 1, right, RR(idx));
     80         }
     81     }
     82 }
     83 
     84 int main()
     85 {
     86     int t;
     87     int n, ncase;
     88     int i, j;
     89     scanf("%d", &t);
     90     for(i = 1; i <= t; i++)
     91     {
     92         scanf("%d", &n);
     93         scanf("%d", &ncase);
     94         build(1, n, 1);
     95         int a, b, val;
     96         for(j = 0; j < ncase; j++)
     97         {
     98             scanf("%d%d%d", &a, &b, &val);
     99             update(a, b, 1, val);
    100         }
    101         printf("Case %d: The total value of the hook is %d.\n", i, get_sum(1, n, 1));
    102     }
    103     return 0;
    104 }

    刚开始时,用暴力解,但超时,也贴出代码:

     1 #include <stdio.h>
     2 #define N 100001
     3 
     4 int s[N];
     5 
     6 void solve(int a, int b, int c)
     7 {
     8     int i;
     9     for(i = a; i <= b; i++)
    10     {
    11         s[i] = c;
    12     }
    13 }
    14 
    15 int main()
    16 {
    17     int i, j;
    18     int t;
    19     int n;
    20     int ncase;
    21     int a, b, c, sum;
    22     scanf("%d", &t);
    23     for(i = 1; i <= t; i++)
    24     {
    25         sum = 0;
    26         scanf("%d", &n);
    27         for(j = 1; j <= n; j++)
    28         {
    29             s[j] = 1;
    30         }
    31         scanf("%d", &ncase);
    32         for(j = 0; j < ncase; j++)
    33         {
    34             scanf("%d%d%d", &a, &b, &c);
    35             solve(a, b, c);
    36         }
    37         for(j = 1; j <= n; j++)
    38         {
    39             sum += s[j];
    40         }
    41         printf("Case %d: The total value of the hook is %d.\n", i, sum);
    42     }
    43 }


  • 相关阅读:
    微信开发返回验证来源方式代码
    Yii 开发过程 tips
    PHP 搜索分词实现代码
    PHP 中文字符串截取
    Ubuntu16.04设置静态ip
    Linux(Ubuntu18.04)安装Chrome浏览器
    ubuntu18.04安装redis
    ubuntu18.04虚拟机安装docker
    虚拟机安装ssh,关闭防火墙
    面试送命题,你为什么从上家公司离职?(面试题总结大全)
  • 原文地址:https://www.cnblogs.com/10jschen/p/2669302.html
Copyright © 2011-2022 走看看