Gorgeous Sequence

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 6946    Accepted Submission(s): 1784

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

Hint

Please use efficient IO method

 
Author
XJZX
 
Source
 
Recommend
wange2014   |   We have carefully selected several similar problems for you:  6554 6553 6552 6551 6550 

题意 :

有一个长度为n的序列a。我们用ai来表示这个序列中的第i个元素。您应该对这个序列执行以下三种类型的操作。

0 x y t:对于每一个x≤i≤y,我们用min(ai,t)替换原始ai的值。

1 x y:打印ai的最大值,即x≤i≤y。

2xy:输出x≤i≤y的ai之和。

输入

输入的第一行是一个整数T,表示测试用例的数量。

第一行包含两个整数n和m,表示序列的长度和操作的数量。

第二行包含n分离整数a1,…,一个(∀1≤≤n, 0≤ai < 231)。

以下m行每一行表示一个操作(1≤x≤y≤n,0≤t<231)。

保证T=100,∑n≤1000000,∑m≤1000000。

输出

对于类型1或2的每个操作,打印一行包含相应查询的答案。

题解:

c++代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + ;
int a[maxn];
#define EF if(ch==EOF) return x;
// #define lc k<<1
// #define rc k<<1|1
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;EF;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct tree
{
int l , r;
int miax , maxx;
ll sum;
int set_lazy;
}t[maxn << ]; // inline void push_up(int k){
// // sum[k]=sum[lc]+sum[rc];
// // mx[k]=max(mx[lc],mx[rc]);
// // se[k]=max(se[lc],se[rc]);
// // mc[k]=0;
// // if(mx[lc]!=mx[rc]) se[k]=max(se[k],min(mx[lc],mx[rc]));
// // if(mx[k]==mx[lc]) mc[k]+=mc[lc];
// // if(mx[k]==mx[rc]) mc[k]+=mc[rc];
// t[k].sum = t[lc].sum + t[rc].sum;
// t[k].maxx = max(t[lc].maxx,t[rc].maxx);
// t[k].miax = max(t[lc].miax,t[rc].miax);
// t[k].set_lazy = 0;
// if(t[lc].maxx != t[rc].maxx) t[k].miax = max(t[k].miax,min(t[lc].maxx,t[rc].maxx));
// if(t[k].maxx == t[lc].maxx) t[k].set_lazy += t[lc].set_lazy;
// if(t[k].maxx == t[rc].maxx) t[k].set_lazy += t[rc].set_lazy; // }
inline void push_up(int rt){
t[rt].sum = t[rt << ].sum + t[rt << |].sum;
// t[rt].minn = min(t[rt << 1].minn,t[rt << 1|1].minn);
t[rt].maxx = max(t[rt << ].maxx,t[rt << |].maxx);
t[rt].miax = max(t[rt << ].miax, t[rt << |].miax);
t[rt].set_lazy = ;
if(t[rt << ].maxx != t[rt <<|].maxx) t[rt].miax = max(t[rt].miax,min(t[rt << ].maxx , t[rt <<|].maxx));
//打上标记,记录下标记个数
if(t[rt].maxx == t[rt << ].maxx) t[rt].set_lazy += t[rt << ].set_lazy;
if(t[rt].maxx == t[rt << |].maxx) t[rt].set_lazy += t[rt << |].set_lazy;
// cout << t[rt].sum << " " << rt <<endl;
} inline void dec_tag(int rt,int v){
if(v >= t[rt].maxx) return;
t[rt].sum += 1ll * (v - t[rt].maxx)*t[rt].set_lazy;
t[rt].maxx = v;
} inline void push_down(int rt){
dec_tag(rt << ,t[rt].maxx);
dec_tag(rt << |,t[rt].maxx);
}
// inline void push_down(int rt) {
// if(t[rt].set_lazy) { ///if set_lazy add_lazy = 0
// t[rt<<1].set_lazy = t[rt].set_lazy;
// t[rt<<1].sum = (t[rt<<1].r - t[rt<<1].l + 1) * t[rt].set_lazy;
// t[rt<<1].maxx = t[rt].set_lazy;
// t[rt<<1].minn = t[rt].set_lazy;
// t[rt<<1|1].set_lazy = t[rt].set_lazy;
// t[rt<<1|1].sum = (t[rt<<1|1].r - t[rt<<1|1].l + 1) * t[rt].set_lazy;
// t[rt<<1|1].maxx = t[rt].set_lazy;
// t[rt<<1|1].minn = t[rt].set_lazy;
// //tre[rt].add_lazy = 0;
// //tre[rt<<1].add_lazy = tre[rt<<1|1].add_lazy = 0;
// t[rt].set_lazy = 0;
// return ;
// }
// // if(tre[rt].add_lazy) {
// // tre[rt<<1].add_lazy += tre[rt].add_lazy;
// // tre[rt<<1].sum += (tre[rt<<1].r - tre[rt<<1].l + 1) * tre[rt].add_lazy;
// // tre[rt<<1].max += tre[rt].add_lazy;
// // tre[rt<<1].min += tre[rt].add_lazy;
// // tre[rt<<1|1].add_lazy += tre[rt].add_lazy;
// // tre[rt<<1|1].sum += (tre[rt<<1|1].r - tre[rt<<1|1].l + 1) *
// // tre[rt].add_lazy;
// // tre[rt<<1|1].max += tre[rt].add_lazy;
// // tre[rt<<1|1].min += tre[rt].add_lazy;
// // tre[rt].add_lazy = 0;
// // }
// } void build(int rt,int l ,int r){
t[rt].l = l, t[rt].r = r;
//t[rt].set_lazy = 1; if(l == r){
t[rt].sum = t[rt].maxx = a[l];
t[rt].miax = -;
t[rt].set_lazy = ;
// cout <<"nbb " <<t[rt].sum << " "<<rt << endl;
return;
}
int mid = (l + r) >> ;
build(rt <<,l,mid);
build(rt << |,mid + ,r);
push_up(rt);
} void up_date(int rt,int l,int r,int d){
if(d >= t[rt].maxx) return; //push_down(rt);
if(l <= t[rt].l && r >= t[rt].r && d > t[rt].miax){
// t[rt].sum = (t[rt].r - t[rt].l + 1) * d;
// t[rt].maxx = d;
// t[rt].minn = d;
// t[rt].set_lazy = d;
dec_tag(rt,d);
return;
}
push_down(rt);
int mid = (t[rt].l + t[rt].r) >> ;
if(r <= mid) {
up_date(rt<<,l,r,d);
} else if(l > mid) {
up_date(rt<<|,l,r,d);
} else {
up_date(rt<<,l,mid,d);
up_date(rt<<|,mid+,r,d);
}
push_up(rt);
} ll query_sum(int rt,int l,int r) { ///sum if(l <= t[rt].l && t[rt].r <= r) {
return t[rt].sum;
}
push_down(rt);
int mid = (t[rt].l + t[rt].r) >> ;
if(r <= mid) {
return query_sum(rt<<,l,r);
} else if(l > mid) {
return query_sum(rt<<|,l,r);
} else {
return query_sum(rt<<,l,mid) + query_sum(rt<<|,mid+,r);
}
} int query_max(int rt,int l,int r) { ///max //cout << t[rt].maxx << endl;
if(l <= t[rt].l && t[rt].r <= r) {
return t[rt].maxx;
}
push_down(rt);
int mid = (t[rt].l + t[rt].r) >> ;
if(r <= mid) {
return query_max(rt<<,l,r);
} else if(l > mid) {
return query_max(rt<<|,l,r);
} else {
return max(query_max(rt<<,l,mid), query_max(rt<<|,mid+,r));
}
}
// int query_min(int rt,int l,int r) { ///min
// push_down(rt); // if(l <= t[rt].l && t[rt].r <= r) {
// return t[rt].minn;
// }
// int mid = (t[rt].l + t[rt].r) >> 1;
// if(r <= mid) {
// return query_min(rt<<1,l,r);
// } else if(l > mid) {
// return query_min(rt<<1|1,l,r);
// } else {
// return min(query_min(rt<<1,l,mid), query_min(rt<<1|1,mid+1,r));
// }
// } int main(int argc, char const *argv[])
{
int t;
//scanf("%d",&t);
t = read();
while(t--){
int n , q;
//scanf("%d%d",&n,&q);
n = read(),q = read();
for(int i = ;i <= n; i++) //scanf("%d",&a[i]);
a[i] = read();
build(,,n);
// //0 cout << 1;
// for(int i = 1;i <= n; i++){
// cout << t[i].maxx ;
// }
while(q--){
int a,b,c;
//scanf("%d%d%d",&a,&b,&c);
a = read() ,b = read() , c = read();
if(a == ){
int z;
//scanf("%d",&z);
z = read(); up_date(,b,c,z);
}
else if(a == ){
printf("%d\n",query_max(,b,c));
}
else{
printf("%lld\n",query_sum(,b,c));
}
}
}
return ;
}

Gorgeous Sequence(线段树)的更多相关文章

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

    题目描述 给你一个序列,支持三种操作: $0\ x\ y\ t$ :将 $[x,y]$ 内大于 $t$ 的数变为 $t$ :$1\ x\ y$ :求 $[x,y]$ 内所有数的最大值:$2\ x\ y ...

  2. HDU 5306 Gorgeous Sequence[线段树区间最值操作]

    Gorgeous Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  3. HDOJ 5306 Gorgeous Sequence 线段树

    http://www.shuizilong.com/house/archives/hdu-5306-gorgeous-sequence/ Gorgeous Sequence Time Limit: 6 ...

  4. HDU - 5306 Gorgeous Sequence 线段树 + 均摊分析

    Code: #include<algorithm> #include<cstdio> #include<cstring> #define ll long long ...

  5. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  6. Wow! Such Sequence!(线段树4893)

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...

  7. Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸

    D. The Child and Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  8. hdu4893Wow! Such Sequence! (线段树)

    Problem Description Recently, Doge got a funny birthday present from his new friend, Protein Tiger f ...

  9. HDU 6047 Maximum Sequence(线段树)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...

  10. Codeforces 438D The Child and Sequence - 线段树

    At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at ...

随机推荐

  1. LA 4327 Parade(单调队列优化dp)

    题目链接: 题目大意(摘自刘汝佳<<算法竞赛入门经典--训练指南>>):F城是由n+1条横向路和m+1条竖向路组成.你的任务是从最南边的路走到最北边的路,使得走过的路上的高兴值 ...

  2. springboot+mybatis 配置sql打印日志

    第一种: 配置类型 # 配置slq打印日志 logging.level.com.lawt.repository.mapper=debug重点: #其中   com.lawt.repository.ma ...

  3. 【leetcode】1109. Corporate Flight Bookings

    题目如下: There are n flights, and they are labeled from 1 to n. We have a list of flight bookings.  The ...

  4. element和iView初步研究(-)

    element 1.可以通过npm 和使用cdn 2,支持多种语言组件 3.基本组件还是可以的 iView iView 是一套基于 Vue.js 的开源 UI 组件库,主要服务于 PC 界面的中后台产 ...

  5. 3分钟教会你把封装的js公共方法挂载在vue实例原型上

    第一步:首先在src文件夹里面创建一个通用js文件夹,然后在创建的文件夹里面创建一个js文件 第二步:const 一个方法,然后通过export暴露出来(在同一个页面可以写多个方法,和暴露多个方法,在 ...

  6. Delphi 2010 secondsBetween Bug

    在设置定时任务时,无意之间发现一个BUG, 定时在00:10:00的任务,执行了2次, 百思不得其解, 一调试发现, 00:10:00,00:09:59的secondsBetween结果值是0, 正确 ...

  7. 15 Spring Boot Shiro 验证码

    1. <dependency> <groupId>com.github.axet</groupId> <artifactId>kaptcha</a ...

  8. es6的扩展运算符

    扩展运算符用三个点号表示,功能是把数组或类数组对象展开成一系列用逗号隔开的值,扩展运算符有几点作用: 一,展开数组 //展开数组 let a = [1,2,3,4,5], b = [...a,6,7] ...

  9. luogu 2219[HAOI2007]修筑绿化带 单调队列

    Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...

  10. docker-compose简介

    一.Docker-Compose简介   Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排.   Docker-Compose将所管理的容器分为三 ...