[HDU] 5306 Gorgeous Sequence [区间取min&求和&求max][线段树]

本文介绍了一个关于序列操作的题目,包括三种类型的操作:替换区间元素为最小值、查找区间最大值和计算区间和。通过线段树的数据结构来高效处理这些操作,同时提供了样例输入和输出,以及解题报告,讨论了线段树在处理此类问题的复杂度和优化策略。
摘要由CSDN通过智能技术生成

Problem Description
There is a sequence a of length n. We use ai to denote the i-th element in this sequence. You should do the following three types of operations to this sequence.

0 x y t: For every x≤i≤y, we use min(ai,t) to replace the original ai’s value.
1 x y: Print the maximum value of ai that x≤i≤y.
2 x y: Print the sum of ai that x≤i≤y.

Input
The first line of the input is a single integer T, indicating the number of testcases.

The first line contains two integers n and m denoting the length of the sequence and the number of operations.

The second line contains n separated integers a1,…,an (∀1≤i≤n,0≤ai<231).

Each of the following m lines represents one operation (1≤x≤y≤n,0≤t<231).

It is guaranteed that T=100, ∑n≤1000000, ∑m≤1000000.

Output
For every operation of type 1 or 2, print one line containing the answer to the corresponding query.

Sample Input
1
5 5
1 2 3 4 5
1 1 5
2 1 5
0 3 5 3
1 1 5
2 1 5

Sample Output
5
15
3
12

解题报告

我们对于线段树的每个结点,维护最大值max,最大值出现次数cnt,严格次大值sec和区间和sum。

修改时,对于可修改结点k,若

  1. t≥max(k):修改对于该区间无效,返回。

  2. sec(k) < t < max(k):t只对max(k)发生影响,令max(k)=t并更新区间和,返回。

  3. sec(k) ≤ t:无法简单地更新区间和了……

复杂度是 (mlog n),证明的话可以参看16年集训队吉爷的论文

这个题要优化输入输出,否则可能超时

原题链接

#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX_N 1000005
using namespace std;
typedef long long LL;

const int MAXS = 40*1024*1024;
char buf[MAXS],bufout[MAXS],*ch,*chout;

void read(int &x){
    for(++ch;*ch<=32;++ch);
    for(x=0;*ch>=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值