hdu1698(线段树的区间替换)

HDU1698

#include <bits/stdc++.h>
using namespace std;
#define Maxn 1001000*4
struct Node{
    int lt,rt,val;
}A[Maxn];
int j = 1;
void Build(int i,int lt,int rt){
    A[i].lt = lt;
    A[i].rt = rt;
    A[i].val = 1;
    if( lt == rt ){
        return ;
    }
    int mid = (lt+rt) >> 1;
    Build(i<<1,lt,mid);
    Build(i<<1|1,mid+1,rt);
}

void update(int i,int lt,int rt,int val){
    if( A[i].val == val ){
        return ;
    }
    if( A[i].lt == lt && A[i].rt == rt ){
        A[i].val = val;
        return ;
    }
    if( A[i].val != -1 ){
        A[i<<1].val = A[i<<1|1].val = A[i].val;
        A[i].val = -1;
    }
    if( rt <= A[i<<1].rt ){
        update(i<<1,lt,rt,val);
    }else if( lt >= A[i<<1|1].lt ){
        update(i<<1|1,lt,rt,val);
    }else{
        update(i<<1,lt,A[i<<1].rt,val);
        update(i<<1|1,A[i<<1|1].lt,rt,val);
    }
}

int find(int i){
    if( A[i].val != -1 ){
        return ( (A[i].rt-A[i].lt+1)*A[i].val);
    }else{
        return ( find(i<<1) + find(i<<1|1) );
    }
}

int main(){
    int T,N,a,b,c;
    cin >> T;
    while(T--){
        scanf("%d",&N);
        Build(1,1,N);
        int n;
        scanf("%d",&n);
        while(n--){
            scanf("%d%d%d",&a,&b,&c);
            update(1,a,b,c);
        }
        printf("Case %d: The total value of the hook is %d.\n",j++,find(1));
    }
}

  

时间: 2024-10-17 12:58:27

hdu1698(线段树的区间替换)的相关文章

HDU 1698 Dota钩子问题-线段树-(区间替换,查询总和)

题意:一段挂钩分成n段,每一段可以由铜.银.金做成,对应的价值分别是1,2,3,现在有m个操作(a,b,x)意思是改变区间[a,b]段的钩子为材质x,问m个操作之后这段挂钩的价值总和.挂钩的每一段初始为铜,也就是1. 分析: 区间更新,单点查询.确切的说是区间替换,询问总区间总和.线段树的典型应用之一.因为是区间更新,所以用 lazy[rt] 数组记录当前子树是否曾经更新过,lazy[rt]!=-1表示在本操作之前就已经替换过rt代表的子区间的值,那么需要把上次的更新操作向下执行完.详见注释.

1698-Just a Hook 线段树(区间替换)

Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 32141    Accepted Submission(s): 15804 Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing

HDU1698线段树区间更新

原题http://acm.hdu.edu.cn/showproblem.php?pid=1698 Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16935    Accepted Submission(s): 8427 Problem Description In the game of DotA, Pudge

FZU Problem 2171 防守阵地 II (线段树,区间更新)

 Problem 2171 防守阵地 II Accept: 143    Submit: 565Time Limit: 3000 mSec    Memory Limit : 32768 KB  Problem Description 部队中总共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,指挥部将选择M个士兵依次进入指定地点进行防守任务,获得的参考指数即为M个士兵的能力之和.随着时间的推移,指挥部将下达Q个指令来替换M个进行防守的士兵们,每个参加完防守

POJ 3667 线段树的区间合并简单问题

题目大意:有一排标号1-N的房间.操作一:询问是不是有连续长度为a的空房间,有的话住进最左边(占用a个房间)操作二:将[a,a+b-1]的房间清空(腾出b个房间)思路:记录每个区间中“靠左”“靠右”“中间”的空房间线段树操作:update:区间替换query:询问满足条件的最左端点 题目链接: http://vjudge.net/problem/viewProblem.action?id=10354 题目操作: 因为这里找从最左边住起的房间,所以这里不能像常规地写query函数那样写了,终于发现

POJ2528 Mayor&#39;s posters(线段树成段替换,区间查询,离散化简单hash)

题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要的值来 用,比如说区间[1000,2000],[1990,2012] 我们用不到[-∞,999][1001,1989][1991,1999][2001,2011][2013,+∞]这些值,所以我只需要 1000,1990,2000,2012就够了,将其分别映射到0,1,2,3,在于复杂度就大大的降下来了 所以离散化要保存所有需要用到的值,排序后,

java-HDU1698(线段树的区间更新,和区间查询)

HDU1698: 题目意思: Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 49065    Accepted Submission(s): 23200 Problem Description In the game of DotA, Pudge’s meat hook is actually the most

HDU 1556 Color the ball(线段树:区间更新)

http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和线段树都可以,拿这道题来入门一下线段树的区间更新. 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 const int maxn = 1000

hihoCode 1078 : 线段树的区间修改

#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho: 假设货架上从左到右摆放了N种商品,并且依次标号为1到N,其中标号为i的商品的价格为Pi.小Hi的每次操作分为两种可能,第一种是修改价格——小Hi给出一段区间[L, R]和一个新的价格NewP,所有标号在这段区间中的商品的价格都变成NewP.第二种操作是询问——小Hi给出一段