zoukankan      html  css  js  c++  java
  • Just a Hook---hdu1698(线段树---区间处理)

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

    现有n个金属(编号1---n),每个金属的材质都是铜,有m个操作,每个操作都是把编号 L 到 R 区间的金属变成(铜,银,金)三种中的一种,其中三种材质的代号和价值是(铜1,银2, 金3);最后求n个金属的所有价值总和;

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    #include <vector>
    #include <algorithm>
    #include <string>
    using namespace std;
    
    #define N 100010
    #define MOD 1000000007
    #define met(a, b) memset(a, b, sizeof(a))
    #define INF 0x3f3f3f3f
    
    typedef long long LL;
    
    #define Lson r<<1
    #define Rson r<<1|1
    
    struct Tree
    {
        int L, R, sum;
        int Mid() { return (L+R)/2; }
        int len() { return (R-L+1); }
    }a[N<<2];
    
    void Build(int r, int L, int R)
    {
        a[r].L = L , a[r].R = R, a[r].sum = 1;
        if(L == R)return;
        Build(Lson, L, a[r].Mid());
        Build(Rson, a[r].Mid()+1, R);
    }
    void Down(int r)
    {
        if(a[r].sum && a[r].L != a[r].R)
        {
            a[Lson].sum = a[Rson].sum = a[r].sum;
            a[r].sum = 0;
        }
    }
    
    void Update(int r, int L, int R, int num)
    {
        if(a[r].sum == num) return;
    
        Down(r);
    
        if(a[r].L == L && a[r].R == R)
        {
            a[r].sum = num;
            return;
        }
        if(R <= a[r].Mid())
            Update(Lson, L, R, num);
        else if(L > a[r].Mid())
            Update(Rson, L, R, num);
        else
        {
            Update(Lson, L, a[r].Mid(), num);
            Update(Rson, a[r].Mid()+1, R, num);
        }
    }
    
    int Query(int r)
    {
        if(a[r].sum !=0)
            return a[r].sum*a[r].len();
        int ans = 0;
        ans += Query(Lson);
        ans += Query(Rson);
        return ans;
    }
    int main()
    {
        int T, n, m, t = 1;
        scanf("%d", &T);
        while(T--)
        {
            scanf("%d %d", &n, &m);
            Build(1, 1, n);
            while(m--)
            {
                int L, R, num;
                scanf("%d %d %d", &L, &R, &num);
                Update(1, L, R, num);
            }
            int ans = Query(1);
            printf("Case %d: The total value of the hook is %d.
    ", t++, ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    [转载]美国名校的与机器视觉相关的研发中心网址
    图像匹配方法浅谈
    Debug FFMpeg with CodeBlock
    zircobrowser 源代码学习 一个Android平台的浏览器,适合用在学UI
    iPhone addSubview sameview 是否会产生内存泄漏
    Android 游戏demo
    C# 多线程 注意问题 总结
    Builld with gloox
    论坛专用
    VMware vSphere Client(4.1/5.0/5.1/5.5/6.0) 客户端下载地址
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/5452896.html
Copyright © 2011-2022 走看看