LA 4108 (线段树)

区间更新 + 统计更新长度

稍稍不注意就T了

#include<bits/stdc++.h>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std;
const int maxn = 100000 + 131;
int Ma[maxn<<2], Mi[maxn<<2], Lazy[maxn<<2];
int Cnt;

void PushUp(int rt)
{
    Ma[rt] = max(Ma[rt<<1], Ma[rt<<1|1]);
    Mi[rt] = min(Mi[rt<<1], Mi[rt<<1|1]);
}

void PushDown(int rt)
{
    if(Lazy[rt] != -1)
    {
        Lazy[rt<<1] = Lazy[rt<<1|1] = Lazy[rt];
        Ma[rt<<1] = Ma[rt<<1|1] = Lazy[rt];
        Mi[rt<<1] = Mi[rt<<1|1] = Lazy[rt];
        Lazy[rt] = -1;
    }
}

void Build(int l, int r, int rt)
{
    Ma[rt] = Mi[rt] = 0;
    Lazy[rt] = -1;
    if(l == r) return ;
    int m = (l + r) >> 1;
    Build(lson), Build(rson);
}

void Query(int L, int R, int val, int l,int r,int rt)
{
    ////////////////////////////////////
    if(L <= l && r <= R)
    {
        if(val < Mi[rt]) return ;
        if(val >= Ma[rt])
        {
            Ma[rt] = Mi[rt] = val;
            Lazy[rt] = val;
            Cnt += r - l + 1;
            return ;
        }
        if(l == r) return ;
    }
    ///////////////////////////////////////
    PushDown(rt);
    int m = (l + r) >> 1;
    if(L <= m) Query(L, R, val, lson);
    if(R > m)  Query(L, R, val, rson);
    PushUp(rt);
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        Cnt = 0;
        Build(1,100000,1);
        int l, r, val;
        for(int i = 0; i < n; ++ i)
        {
            scanf("%d%d%d",&l,&r,&val);
            r--;
            Query(l,r,val,1,100000,1);
        }
        printf("%d\n",Cnt);
    }
    return 0;
}
时间: 2024-10-10 17:40:36

LA 4108 (线段树)的相关文章

UVA-1400 Ray, Pass me the Dishes, LA 3938 , 线段树,区间查询

题意:给出一列数(n个),m次查询区间[l,r]的最大连续区间[x,y](l<=x<=y<=r).(n,m<=500 000) 思路:动态查询区间最大连续区间: 如果是求最大连续区间和: 用线段树维护最大连续和sum_sub.最大前缀和sum_prefix.最大后缀和sum_suffix. root.sum_sub = max{l.sum_sub, r.sum_sub, (l.sum_suffix + r.sum_prefix) }; 题目要求区间,类似的: 用线段树维护最大连续区

并查集 + 线段树 LA 4730 Kingdom

题目传送门 题意:训练指南P248 分析:第一个操作可以用并查集实现,保存某集合的最小高度和最大高度以及城市个数.运用线段树成端更新来统计一个区间高度的个数,此时高度需要离散化.这题两种数据结构一起使用,联系紧密. #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; const int M = 3 * N; const int INF = 0x3f3f3f3f; struct Point { int x, y

LA 2191电位计(线段树模板题)

线段树模板题,没啥好说的.....注意输出是case之间空一行就行.........之前一直没注意,一直wa 代码如下: #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #includ

WHYZOJ-#53 线段树区间修改(线段树)

[题目描述]: 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 [输入描述]: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k 操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和 [输出描述]: 输出包含若干行整

士兵杀敌(四)(树状数组+线段树)

士兵杀敌(四) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上,这样,有时候,计算他们中的哪一个人到底有多少军功就是一个比较困难的事情,军师小工的任务就是在南将军询问他某个人的军功的时候,快速的报出此人的军功,请你编写一个程序来帮助小工吧. 假设起始时所有人的军功都是0. 输入

hdu5293 Tree chain problem 树形dp+线段树

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5293 在一棵树中,给出若干条链和链的权值.求选取不相交的链使得权值和最大. 比赛的时候以为是树链剖分就果断没去想,事实上是没思路. 看了题解,原来是树形dp.话说多校第一场树形dp还真多. . .. 维护d[i],表示以i为根节点的子树的最优答案. sum[i]表示i的儿子节点(仅仅能是儿子节点)的d值和. 那么答案就是d[root]. 怎样更新d值 d[i] = max(sum[i] , w[p]+s

hdu 4267 A Simple Problem with Integers(树形结构-线段树)

A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3708    Accepted Submission(s): 1139 Problem Description Let A1, A2, ... , AN be N elements. You need to deal with

线段树、KMP、HASH模板

线段树 #include<cstdio> using namespace std; int n,p,a,b,m,x,y,ans; struct node { int l,r,w,f; }tree[400001]; inline void build(int k,int ll,int rr)//建树 { tree[k].l=ll,tree[k].r=rr; if(tree[k].l==tree[k].r) { scanf("%d",&tree[k].w); retur

zstu4186——线段树——表白计划(未完成)

Description 众所周知,程序员是种神奇的没有妹子的生物. 有一个很厉害的程序员Doge,他没有妹子.于是他将自己心仪的n个妹子编号为1到n,然后制定了m个表白计划在接下来的t天内向妹子表白,对于某一个计划,他会在计划的第L天到第R天向编号为x的妹子每天表白一次.由于计划很多,有些表白区间可能有重复,所以他有可能在某一天跟同一个妹子表白很多次.他每一次表白被拒绝后都会收到被表白的妹子亲手写的好人卡,毫无悬念,他每一次都能收到好人卡. 现在Doge想知道在某些时间段他收到了多少张好人卡,还

codeforces 446C DZY Loves Fibonacci Numbers 数论+线段树成段更新

DZY Loves Fibonacci Numbers Time Limit:4000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2014-07-14) Description In mathematical terms, the sequence Fn of Fibonacci numbers is defi