hdu6521 吉司机线段树

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

待填

代码

#include<bits/stdc++.h>
#define ls o<<1
#define rs o<<1|1
#define ll long long
using namespace std;
const int MAXN = 5e5+5;
int Mx[MAXN<<2],Mx2[MAXN<<2],Mn[MAXN<<2],ly[MAXN<<2];
ll V[MAXN<<2];
int n,m,l,r;
void push_up(int o){
    Mx[o]=max(Mx[ls],Mx[rs]);
    Mx2[o]=0;
    if(Mx[ls]==Mx[rs]){
        Mn[o]=Mn[ls]+Mn[rs];
        Mx2[o]=max(Mx2[ls],Mx2[rs]);
    }else{
        if(Mx[ls]>Mx[rs]){
            Mx[o]=Mx[ls];Mn[o]=Mn[ls];V[o]=V[ls];Mx2[o]=Mx2[ls];ly[o]=ly[ls];
        }else{
            Mx[o]=Mx[rs];Mn[o]=Mn[rs];V[o]=V[rs];Mx2[o]=Mx2[rs];ly[o]=ly[rs];
        }
        Mx2[o]=max(Mx2[ls],Mx2[rs]);
        if(Mx[o]==Mx[ls])Mx2[o]=max(Mx2[o],Mx[rs]);
        else Mx2[o]=max(Mx2[o],Mx[ls]);
    }
    V[o]=V[ls]+V[rs];
}
void ch(int o,int x){
    V[o]-=(1ll*Mx[o]-x)*Mn[o];
    Mx[o]=ly[o]=x;
}
void push_down(int o){
    if(Mx[ls]>ly[o]){ch(ls,ly[o]);ly[ls]=ly[o];}
    if(Mx[rs]>ly[o]){ch(rs,ly[o]);ly[rs]=ly[o];}
    ly[o]=-1;
}

void build(int o,int l,int r){
    ly[o]=-1;Mx2[o]=0;
    if(l==r){V[o]=Mx[o]=l;Mn[o]=1;return;}
    int mid=(l+r)/2;
    build(ls,l,mid);
    build(rs,mid+1,r);
    push_up(o);
}

void ud(int o,int l,int r,int L,int R,int x){
    if(~ly[o])push_down(o);
    int mid=(l+r)/2;
    if(L<=l&&r<=R){
        if(x>=Mx[o])return;
        else if(x>Mx2[o]){ch(o,x);return;}
        else{
            ud(ls,l,mid,L,R,x);ud(rs,mid+1,r,L,R,x);
            //return;  //没有return;
        }
    }
    if(L<=mid)ud(ls,l,mid,L,R,x);
    if(R>mid)ud(rs,mid+1,r,L,R,x);
    push_up(o);
}
ll qSum(int o,int l,int r,int L,int R){
    if(~ly[o])push_down(o);
    if(L<=l&&r<=R)return V[o];
    int mid=(l+r)/2;
    ll ans=0;
    if(L<=mid)ans+=qSum(ls,l,mid,L,R);
    if(R>mid)ans+=qSum(rs,mid+1,r,L,R);
    push_up(o);
    return ans;
}
int main(){
    while(~scanf("%d%d",&n,&m)){
        build(1,1,n);
        while(m--){
            scanf("%d%d",&l,&r);
            ll tp=qSum(1,1,n,l,r);
            ud(1,1,n,l,r,l);
            printf("%lld\n",tp-qSum(1,1,n,l,r));
        }
    }
}

原文地址:https://www.cnblogs.com/VIrtu0s0/p/10817301.html

时间: 2024-10-21 07:32:21

hdu6521 吉司机线段树的相关文章

bzoj4355 Play with sequence(吉司机线段树)题解

题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 赋值为\(x\) \(2.\)区间\([L,R]\) 赋值为\(max(a[i] + x, 0)\) \(3.\)区间\([L,R]\) 询问\(0\)个数 已知初始值\(\geq 0\),\(x\geq0\). 思路: 吉司机线段树. 操作\(1\)可以直接打覆盖标记. 操作\(2\)可以分为两步:区间加\(x\),然后取区间\(max(a[i],0)\). 操作\(3\)只要维护最小值的个数,因为不管怎么操作最

【模板】吉司机线段树 HDU 5306 Gorgeous Sequence

也叫小清新线段树,用于解决区间最值修改问题 具体可以参考jiry_2神犇的集训队论文和WC2016上的PPT 此题就作为模板好了,模板的话写法是比较精妙的 #include<bits/stdc++.h> using namespace std; #define go(i,a,b) for(int i=a;i<=b;++i) #define com(i,a,b) for(int i=a;i>=b;--i) #define mem(a,b) memset(a,b,sizeof(a))

HDU 5306 吉司机线段树

思路: 后面nlogn的部分是伪证... 大家可以构造数据证明是这是nlog^2n的啊~ 吉老司机翻车了 //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; const int N=1000050; int cases,n,m,op,xx,yy,zz; typedef long long ll; struct SegTree{int max1,max2,maxnum,lazy;ll s

吉司机线段树思路整理[bzoj4355 Play with sequence]

原题目链接 原代码来自attack #include<cstdio> #include<algorithm> #define LL long long //#define int long long using namespace std; const int MAXN = 3 * 1e5 + 10; const LL INF = 1e10 +10; inline int read() { char c = getchar(); int x = 0, f = 1; while(c

HDU4695 最假女选手(吉司机线段树)

本题原理和代码讲解会在近日放到b站,对题目解法不是很了解的同学可以关注b站 朝暮不思 #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<vector> #include<string> #include<cstring> #include<map> #include<set> using

COGS 2638. 数列操作ψ 线段树

传送门 : COGS 2638. 数列操作ψ 线段树 这道题让我们维护区间最大值,以及维护区间and,or一个数 我们考虑用线段树进行维护,这时候我们就要用到吉司机线段树啦 QAQ 由于发现若干次and,or之后,如果数据分布均匀,那么几乎所有的数在若干次操作后都会变成同一个数 因为我们的and操作中的0位,以及or操作当中的1位,都是可以把整个区间的那一二进制位重置为相同的 我们考虑利用这一个性质 如果我们直接维护一个区间内的值是否是相同的,那么效果会差很多. 我们发现我们在进行and操作的时

【hdu5306】Gorgeous Sequence 线段树区间最值操作

题目描述 给你一个序列,支持三种操作: $0\ x\ y\ t$ :将 $[x,y]$ 内大于 $t$ 的数变为 $t$ :$1\ x\ y$ :求 $[x,y]$ 内所有数的最大值:$2\ x\ y$ :求 $[x,y]$ 内所有数的和. 多组测试数据,$\sum n,\sum m\le 10^6$ 题解 线段树区间最值操作 对于线段树上的一个节点,维护对应区间的:最大值 $mx$ .最大值个数 $c$ 及严格次大值 $se$ .那么对于一次区间最小值操作: 如果 $t\ge mx$ ,则这个

[BZOJ4869][六省联考2017]相逢是问候(线段树+扩展欧拉定理)

4869: [Shoi2017]相逢是问候 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1313  Solved: 471[Submit][Status][Discuss] Description Informatikverbindetdichundmich. 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,ar)中的每

关于吉利线段树

引言 这玩意儿又称\(Segment\ Tree\ Beats\) .由吉老师.\(Picks\).美国队长三位知名毒瘤发明. 我的精神受到了污染...... 线段树简介 线段树什么的太难了,不是很会啊..... 线段树最强的地方在于,如果标记支持合并,那么我们就能够快速进行区间修改了. 一类特殊标记 维护这样一个标记\((a,b)\) ,表示\(x\to max(x + a , b)\) . 显然标记可合并:\((a,b) + (c,d) = (a + c , max(b + c , d))\