线段树

对于$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)的更多相关文章

  1. Codeforces 1108E2 Array and Segments (Hard version)(差分+思维)

    题目链接:Array and Segments (Hard version) 题意:给定一个长度为n的序列,m个区间,从m个区间内选择一些区间内的数都减一,使得整个序列的最大值减最小值最大. 题解:利 ...

  2. 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 ...

  3. Codeforces 1108E2 Array and Segments (Hard version) 差分, 暴力

    Codeforces 1108E2 E2. Array and Segments (Hard version) Description: The only difference between eas ...

  4. 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 ...

  5. CF E2 - Array and Segments (Hard version) (线段树)

    题意给定一个长度为n的序列,和m个区间.对一个区间的操作是:对整个区间的数-1可以选择任意个区间(可以为0个.每个区间最多被选择一次)进行操作后,要求最大化的序列极差(极差即最大值 - 最小值).ea ...

  6. 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 ...

  7. 【Codeforces 1108E1】Array and Segments (Easy version)

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 枚举最大值和最小值在什么地方. 显然,只要包含最小值的区间,都让他减少. 因为就算那个区间包含最大值,也无所谓,因为不会让答案变小. 但是那些 ...

  8. CF #535 (Div. 3) E2 Array and Segments (Hard version) 利用线段树进行区间转移

    传送门 题意:    有m个区间,n个a[ i ] , 选择若干个区间,使得整个数组中的最大值和最小值的差值最小.n<=1e5,m<=300; 思路: 可以知道每个i,如果一个区间包含这个 ...

  9. Codeforces Round #535 E2-Array and Segments (Hard version)

    Codeforces Round #535 E2-Array and Segments (Hard version) 题意: 给你一个数列和一些区间,让你选择一些区间(选择的区间中的数都减一), 求最 ...

随机推荐

  1. 手把手教你AspNetCore WebApi:入门

    需求 前几天,马老板给小明和小红一个"待办事项"网站,小明负责后端,小红负责前端,并要求网站可以同时在 Windows.和 Linux 上运行. 小明整理了一下"待办事项 ...

  2. Sprign-mvc系列之Spring快速入门 什么是sprign-mvc spring-mvc的作用及其基本使用+组件解析+注解解析

    Spring-mvc 什么是SpringMvc SpringMvc是一种基于java的实现Mvc设计模式的请求驱动类型的轻量级web框架,属于SpringFrameWork的后续产品,已经融合在Spr ...

  3. Consul 快速入门

    Consul是什么 Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用.限流.熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便.它提供了一个功 ...

  4. [java进阶]关于多线程的知识点

    线程和进程的区别? 进程: 是程序得一次之星过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序就是从一个进程的创建开始,到进程的结束的过程. 在java中当我们的main函数运行时就是 ...

  5. DockerFile系统的学习

    1.背景 DockerFile定义:用来构建Docker镜像的文件,有脚本命令组成. 自定义镜像并运行步骤:编写dockerFile文件-->docker build为镜像-->docke ...

  6. 运行shell文件时提示/bin/bash^M: bad interpreter: 没有那个文件

    查看脚本文件是dos格式还是unix格式的几种办法.(1)cat -A filename 从显示结果可以判断,dos格式的文件行尾为^M$,unix格式的文件行尾为$:(2)od -t x1 file ...

  7. dom4j api 详解【转】

    1.DOM4J简介 DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP. DOM4J ...

  8. 第三十六章 Linux常用性能检测的指令

    作为一个Linux运维人员,介绍下常用的性能检测指令! 一.uptime 命令返回的信息: 19:08:17              //系统当前时间 up 127 days,  3:00     ...

  9. 【应用服务 App Service】如何移除App Service Response Header中包含的服务器敏感信息

    问题描述 有些情况下,当应用部署到App Service上后,在有些Response Header中,可以看见关于服务器的一些信息,这样会导致隐藏的安全问题,所以可以在web.config中移除某些关 ...

  10. ubuntu JDK&SDK 环境变量配置

    ubuntu JDK&SDK 环境变量配置 一.下载JDK 1. 先卸载Ubuntu 带的openJDK: sudo apt-get purge openjdk* 2.到http://www. ...