CF1108E2 Array and Segments (Hard version)
线段树
对于$Easy$ $version$可以枚举极大值和极小值的位置,然后判断即可
但对于$Hard$ $version$明显暴力同时枚举极大值和极小值会超时
那么,考虑只枚举极小值
对于数轴上每一个点,记录开始和结束于这个点的区间
那么从1枚举到i时可以处理出当包含i点所有区间
所以用线段树维护修改这些区间,进行判断总区间的极差
记录最大值即可
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+100;
int n,m,a[MAXN],l[310],r[310];
int ans,wh;
vector <int> t,be[MAXN],ed[MAXN];
struct node
{
int l,r,MAX,MIN,sum,lazy;
}sh[MAXN*4];
void pushup(int x)
{
sh[x].sum=sh[x+x].sum+sh[x+x+1].sum;
sh[x].MAX=max(sh[x+x].MAX,sh[x+x+1].MAX);
sh[x].MIN=min(sh[x+x].MIN,sh[x+x+1].MIN);
}
void pushdown(int x)
{
if (sh[x].lazy!=0)
{
sh[x+x].lazy+=sh[x].lazy;
sh[x+x+1].lazy+=sh[x].lazy;
sh[x+x].sum+=sh[x].lazy;
sh[x+x].MAX+=sh[x].lazy;
sh[x+x].MIN+=sh[x].lazy;
sh[x+x+1].sum+=sh[x].lazy;
sh[x+x+1].MAX+=sh[x].lazy;
sh[x+x+1].MIN+=sh[x].lazy;
sh[x].lazy=0;
}
}
void build(int x,int ll,int rr)
{
sh[x].l=ll;
sh[x].r=rr;
if (ll==rr)
{
sh[x].MAX=sh[x].MIN=sh[x].sum=a[ll];
return;
}
int mid;
mid=(ll+rr)>>1;
build(x+x,ll,mid);
build(x+x+1,mid+1,rr);
pushup(x);
}
void change(int x,int ll,int rr,int k)//区间修改
{
if (sh[x].l>=ll && sh[x].r<=rr)
{
sh[x].sum+=k;
sh[x].MIN+=k;
sh[x].MAX+=k;
sh[x].lazy+=k;
return;
}
pushdown(x);
int mid;
mid=(sh[x].l+sh[x].r)>>1;
if (ll<=mid)
change(x+x,ll,rr,k);
if (rr>mid)
change(x+x+1,ll,rr,k);
pushup(x);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=1;i<=m;i++)
scanf("%d%d",&l[i],&r[i]);
build(1,1,n);
if (n==1)
{
printf("0\n0\n");
return 0;
}
for (int i=1;i<=m;i++)
{
be[l[i]].push_back(i);//对于结束和开始的节点记录区间
ed[r[i]].push_back(i);
}
ans=sh[1].MAX-sh[1].MIN;
wh=0;
for (int i=1;i<=n;i++)
{
for (int j=0;j<(int)ed[i-1].size();j++)
{
int u;
u=ed[i-1][j];
change(1,l[u],r[u],1);//将之前修改的区间对当前无影响改回去
}
for (int j=0;j<(int)be[i].size();j++)
{
int u;
u=be[i][j];
change(1,l[u],r[u],-1);//将新增的区间修改
}
pushdown(1);
pushup(1);
if (sh[1].MAX-sh[1].MIN>ans)//记录当期的极差
{
ans=sh[1].MAX-sh[1].MIN;
wh=i;
}
}
for (int i=1;i<=m;i++)
{
if (l[i]<=wh && r[i]>=wh)
t.push_back(i);
}
printf("%d\n%d\n",ans,(int)t.size());
for (int i=0;i<(int)t.size();i++)
printf("%d ",t[i]);
printf("\n");
}
CF1108E2 Array and Segments (Hard version)的更多相关文章
- Codeforces 1108E2 Array and Segments (Hard version)(差分+思维)
题目链接:Array and Segments (Hard version) 题意:给定一个长度为n的序列,m个区间,从m个区间内选择一些区间内的数都减一,使得整个序列的最大值减最小值最大. 题解:利 ...
- Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 【区间更新 线段树】
传送门:http://codeforces.com/contest/1108/problem/E2 E2. Array and Segments (Hard version) time limit p ...
- Codeforces 1108E2 Array and Segments (Hard version) 差分, 暴力
Codeforces 1108E2 E2. Array and Segments (Hard version) Description: The only difference between eas ...
- Array and Segments (Easy version) CodeForces - 1108E1 (暴力枚举)
The only difference between easy and hard versions is a number of elements in the array. You are giv ...
- CF E2 - Array and Segments (Hard version) (线段树)
题意给定一个长度为n的序列,和m个区间.对一个区间的操作是:对整个区间的数-1可以选择任意个区间(可以为0个.每个区间最多被选择一次)进行操作后,要求最大化的序列极差(极差即最大值 - 最小值).ea ...
- E1. Array and Segments (Easy version)(暴力) && E2. Array and Segments (Hard version)(线段树维护)
题目链接: E1:http://codeforces.com/contest/1108/problem/E1 E2:http://codeforces.com/contest/1108/problem ...
- 【Codeforces 1108E1】Array and Segments (Easy version)
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 枚举最大值和最小值在什么地方. 显然,只要包含最小值的区间,都让他减少. 因为就算那个区间包含最大值,也无所谓,因为不会让答案变小. 但是那些 ...
- CF #535 (Div. 3) E2 Array and Segments (Hard version) 利用线段树进行区间转移
传送门 题意: 有m个区间,n个a[ i ] , 选择若干个区间,使得整个数组中的最大值和最小值的差值最小.n<=1e5,m<=300; 思路: 可以知道每个i,如果一个区间包含这个 ...
- Codeforces Round #535 E2-Array and Segments (Hard version)
Codeforces Round #535 E2-Array and Segments (Hard version) 题意: 给你一个数列和一些区间,让你选择一些区间(选择的区间中的数都减一), 求最 ...
随机推荐
- 2020.09.05【NOIP提高组&普及组】模拟赛C组1总结
T1:机器翻译 这一道题是一个很简单的队列题目,我们只要每次维护队列元素数量保持在m以内即可 T2:乌龟棋 这一道题我一开始比赛是暴力枚举(万事先暴力),很明显这个肯定会超时(30分)那么考虑动态规划 ...
- JavaScript DOM三种创建元素的方式
三种创建元素的方式: document.write() element.innerHTML document.createElement() 初始HTML内容: <button>btn&l ...
- ORA-00001: unique constraint (string.string) violated 违反唯一约束条件(.)
ORA-00001: unique constraint (string.string) violated ORA-00001: 违反唯一约束条件(.) Cause: An UPDATE or I ...
- 常见的Mysql十款高可用方案
简介 我们在考虑MySQL数据库的高可用架构时,主要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断. 用作 ...
- OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...
- org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "enterpCd")-Mybatis报错
一.问题由来 下午快要下班时,登录测试服务器查看日志信息,看看有没有新的异常信息,如果有的话好及时修改.结果一看果然有新的异常信息. 主要的异常信息如下: 2020-10-13 14:51:03,03 ...
- 【C语言/C++编程学习笔记】你的第一个Windows程序!高级操作~
什么是windows编程?了解到Windows API 编程.Windows编程.Windows SDK 编程是一个概念.今天我们运用C语言来实现你的第一个真正的Windows程序. windows. ...
- 什么是 C 和 C ++ 标准库?学编程的你应该知道这些知识!
简要介绍编写C/C ++应用程序的领域,标准库的作用以及它是如何在各种操作系统中实现的. 我已经接触C++一段时间了,一开始就让我感到疑惑的是其内部结构:我所使用的内核函数和类从何而来? 谁发明了它们 ...
- linux(centos8):安装分布式事务服务seata(file单机模式,seata 1.3.0/centos 8.2)
一,什么是seata? Seata:Simpe Extensible Autonomous Transcaction Architecture, 是阿里中间件,开源的分布式事务解决方案. 前身是阿里的 ...
- fish_redux使用详解---看完就会用!
说句心里话,这篇文章,来来回回修改了很多次,如果认真看完这篇文章,还不会写fish_redux,请在评论里喷我. 前言 来学学难搞的fish_redux框架吧,这个框架,官方的文档真是一言难尽,比fl ...