zoukankan      html  css  js  c++  java
  • (线段树)Just a Hook -- hdu -- 1689

    链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=1698

    思路:

    我的想法很简单,像上一题一样从后面向前面来算,前面已经覆盖的,后面自然不能再来计算了,具体是每次都计算覆盖的总长度,然后用这次的总长度减上次的总长度,自然就得到了这次覆盖的长度,可能我的方法不是很好吧!不过这是自己想出来的,再去借鉴一下别人的代码,多种想法是好的,毕竟是自己做的,因为数据不是很大所以不用离散化就可以

    代码:

      1 #include<stdio.h>
      2 #include<algorithm>
      3 #include<stdlib.h>
      4 #include<string.h>
      5 using namespace std;
      6 
      7 #define Lson r<<1
      8 #define Rson r<<1|1
      9 
     10 const int N = 100005;
     11 
     12 struct Node
     13 {
     14     int L, R, e;
     15 } s[N<<2];
     16 
     17 struct node
     18 {
     19     int L, R;
     20     int len; //len里面要记录被覆盖的长度
     21     int Mid()
     22     {
     23         return (L+R)>>1;
     24     }
     25 } a[N<<2];
     26 
     27 void UpDate(int r)
     28 {
     29     if(a[r].L != a[r].R)
     30         a[r].len = a[Lson].len + a[Rson].len;
     31 }
     32 
     33 void BuildTree(int r, int L, int R)
     34 {
     35     a[r].L = L, a[r].R = R;
     36     a[r].len = 0;
     37 
     38     if(L==R) return ;
     39 
     40     BuildTree(Lson, L, a[r].Mid());
     41     BuildTree(Rson, a[r].Mid()+1, R);
     42 }
     43 
     44 int Insert(int r, int L, int R)
     45 {
     46     if(a[r].L<=L && a[r].R>=R && a[r].len == a[r].R-a[r].L+1)
     47         return a[r].len;
     48     if(a[r].L==L && a[r].R==R)
     49     {
     50         a[r].len = R-L+1;
     51         return a[r].len;
     52     }
     53 
     54     if(R<=a[r].Mid())
     55         Insert(Lson, L, R);
     56     else if(L>a[r].Mid())
     57         Insert(Rson, L, R);
     58     else
     59     {
     60         Insert(Lson, L, a[r].Mid());
     61         Insert(Rson, a[r].Mid()+1, R);
     62     }
     63 
     64     UpDate(r);
     65 
     66     return a[r].len;
     67 }
     68 
     69 int main()
     70 {
     71     int t, k=1;
     72     scanf("%d", &t);
     73     while(t--)
     74     {
     75         int n, m;
     76         scanf("%d%d", &n, &m);
     77 
     78         BuildTree(1, 1, n);
     79 
     80         for(int i=2; i<=m+1; i++)
     81             scanf("%d%d%d", &s[i].L, &s[i].R, &s[i].e);
     82 
     83         s[1].L = 1, s[1].R = n, s[1].e = 1;
     84 
     85 
     86         int sum = 0, z=0, w=0;
     87         for(int i=m+1; i>0; i--)
     88         {
     89             w = z;
     90             z = Insert(1, s[i].L, s[i].R);
     91 
     92             sum += (z-w)*s[i].e;
     93 
     94             if(z==n)
     95                 break;
     96         }
     97 
     98         printf("Case %d: The total value of the hook is %d.
    ", k++, sum);
     99 
    100     }
    101     return 0;
    102 }

    代码:

     1 #include<stdio.h>
     2 #include<math.h>
     3 #include<string.h>
     4 #include<algorithm>
     5 using namespace std;
     6 #define Lson root<<1,L,tree[root].Mid()
     7 #define Rson root<<1|1,tree[root].Mid()+1,R
     8 
     9 const int maxn = 100005;
    10 
    11 struct Hook{int l, r, z;}hook[maxn];
    12 struct Tree{
    13     int L, R;
    14     int isCover;//等于1的时候被覆盖,等于2的时候区间下面有被覆盖的
    15     int Mid(){return (L+R)/2;}
    16     int Len(){return (R-L+1);}
    17 }tree[maxn*4];
    18 
    19 void Build(int root, int L, int R)
    20 {
    21     tree[root].L = L, tree[root].R = R;
    22     tree[root].isCover = false;
    23 
    24     if(L == R)return ;
    25 
    26     Build(Lson);
    27     Build(Rson);
    28 }
    29 void Up(int root)
    30 {
    31     if(tree[root].L != tree[root].R)
    32     if(tree[root<<1].isCover == 1 && tree[root<<1|1].isCover == 1)
    33         tree[root].isCover = 1;
    34 }
    35 int  Insert(int root, int L, int R)
    36 {
    37     if(tree[root].isCover == 1)return 0;
    38 
    39     if(tree[root].L == L && tree[root].R == R && !tree[root].isCover)
    40     {
    41         tree[root].isCover = 1;
    42         return tree[root].Len();
    43     }
    44     tree[root].isCover = 2;
    45 
    46     int ans = 0;
    47 
    48     if(R <= tree[root].Mid())
    49         ans = Insert(root<<1, L, R);
    50     else if(L > tree[root].Mid())
    51         ans = Insert(root<<1|1, L, R);
    52     else
    53         ans = Insert(Lson)+Insert(Rson);
    54 
    55     Up(root);
    56 
    57     return ans;
    58 }
    59 
    60 int main()
    61 {
    62     int i, T, t=1;
    63 
    64     scanf("%d", &T);
    65 
    66     while(T--)
    67     {
    68         int N, M;
    69 
    70         scanf("%d%d", &N, &M);
    71         Build(1, 1, N);
    72 
    73         for(i=1; i<=M; i++)
    74             scanf("%d%d%d", &hook[i].l, &hook[i].r, &hook[i].z);
    75 
    76         int ans = N;
    77 
    78         for(i=M; i>0; i--)
    79         {
    80             int len = Insert(1, hook[i].l, hook[i].r);
    81             ans = ans - len + len * hook[i].z;
    82         }
    83 
    84         printf("Case %d: The total value of the hook is %d.
    ", t++, ans);
    85     }
    86 
    87     return 0; }
    勿忘初心
  • 相关阅读:
    PHP抓取页面的几种方式
    MySQL性能优化的最佳20+条经验
    linux下导入、导出mysql数据库命令
    8个必备的PHP功能开发
    jquery中的children()和contents()的区别
    centos 通用开发工具及库安装 有了它不用愁了
    将bat批处理文件注册成windows服务
    squid隐藏squid的版本号
    squid如何屏蔽User-Agent为空的请求
    RHEL/CentOS 6.x使用EPEL6与remi的yum源安装MySQL 5.5.x
  • 原文地址:https://www.cnblogs.com/YY56/p/4692221.html
Copyright © 2011-2022 走看看