ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HDU-1698-Just a Hook

2019-02-24 16:38:46  阅读:220  来源: 互联网

标签:HDU Just int Hook add MAXN include root


链接:https://vjudge.net/problem/HDU-1698#author=0

题意:

给n个数,默认为1,q次操作,将x-y内的数改成1-3中的一种。

求n个数的和。

思路:

线段树,区间更新。

代码:

#include <iostream>
#include <memory.h>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

typedef long long LL;

const int MAXN = 1e5 + 10;
int segments[MAXN * 4];
int add[MAXN * 4];

void Push_down(int root, int l, int r)
{
    if (add[root])
    {
        add[root << 1] = add[root];
        add[root << 1 | 1] = add[root];
        int mid = (l + r) / 2;
        segments[root << 1] = add[root] * (mid - l + 1);
        segments[root << 1 | 1] = add[root] * (r - mid);
        add[root] = 0;
    }
}

void Build_tree(int root, int l, int r)
{
    if (l == r)
    {
        segments[root] = 1;
        return ;
    }
    int mid = (l + r) / 2;
    Build_tree(root << 1, l, mid);
    Build_tree(root << 1 | 1, mid + 1, r);
    segments[root] = segments[root << 1] + segments[root << 1 | 1];
}

void Update_tree(int root, int l, int r, int ql, int qr, int c)
{
    if (ql > r || qr < l)
        return ;
    if (ql <= l && r <= qr)
    {
        segments[root] = (r - l + 1) * c;
        add[root] = c;
    }
    else
    {
        Push_down(root, l, r);
        int mid = (l + r) / 2;
        Update_tree(root << 1, l, mid, ql, qr, c);
        Update_tree(root << 1 | 1, mid + 1, r, ql, qr, c);
        segments[root] = segments[root << 1] + segments[root << 1 | 1];
    }
}

int Query(int root, int l, int r, int w)
{
    if (l == r)
        return segments[root];
    int mid = (l + r) / 2;
    if (w <= mid)
        return Query(root << 1, l, mid, w);
    else
        return Query(root << 1 | 1, mid + 1, r, w);
}

int main()
{
    int t, cnt = 0;
    scanf("%d", &t);
    while (t--)
    {
        int n, q;
        int l, r, op;
        scanf("%d%d", &n, &q);
        Build_tree(1, 1, n);
        memset(add, 0, sizeof(add));

        for (int i = 1;i <= q;i++)
        {
            scanf("%d%d%d", &l, &r, &op);
            Update_tree(1, 1, n, l, r, op);
        }
        printf("Case %d: The total value of the hook is %d.\n", ++cnt, segments[1]);
    }

    return 0;
}

  

标签:HDU,Just,int,Hook,add,MAXN,include,root
来源: https://www.cnblogs.com/YDDDD/p/10426662.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有