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) 题意: 给你一个数列和一些区间,让你选择一些区间(选择的区间中的数都减一), 求最 ...
随机推荐
- 关于继承、封装、多态、抽象和接口(Java)
1.继承: 通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类.已有的称为父类,新的类称为子类(父类派生子类,子类继承父类). (1)继承的优点:①代码的可重用性: ②父类的属性的方 ...
- VS2015如何调试自己写的DLL与调试
转载: 1. https://blog.csdn.net/u014738665/article/details/79779632 2. https://blog.csdn.net/jacke121/a ...
- 《C++primerplus》第12章“队列模拟”程序
这个程序刚开始学有很多难点,个人认为主要有以下三项: 1.链表的概念 2.如何表示顾客随机到达的过程 3.程序执行时两类之间的关系,即执行逻辑 关于第一点,书上的图解释得比较清楚了,把"空指 ...
- day65:nginx代理&nginx负载均衡
目录 1.nginx代理 2.nginx代理与配置 3.nginx负载均衡调度多web节点(静态页面) 4.nginx负载均衡调度多应用节点(blog) 5.nginx_proxy + web应用节点 ...
- C# 中 System.Range 结构体
翻译自 John Demetriou 2020年4月6日 的文章 <C# 8 Is Introducing Ranges> 我们之前讨论过的 C# 中的一个特性 System.Index ...
- SpringBoot+Activiti+bpmn.js+Vue.js+Elementui(OA系统审批流)
引言:OA系统用到请假.加班.调休.离职,需要使用工作流进行流程审批 一:activiti流程设计器的选择(通过学习activiti工作流过程中,发现一款好的流程设计器将会更好的方便的设计好流程(主要 ...
- Android开发还不会这些?如何面试拿高薪!
我所接触的Android开发者,百分之九十五以上 都遇到了以下几点致命弱点! 如果这些问题也是阻止你升职加薪,跳槽大厂的阻碍. 那么我确信可以帮你突破瓶颈! 群内有许多来自一线的技术大牛,也有在小厂或 ...
- SpringBoot+MongoDB实现物流订单系统
码字不易,点赞收藏,养成习惯!原创作者公众号:bigsai.更多精彩期待与您分享!项目收录在github的MongoDB案例中,文章收录在回车课堂中如果没基础请看看前两篇(墙裂推荐)MongoDB从立 ...
- linux(centos8):kubernetes安装的准备工作
一,安装docker-ce19.03.11 1,卸载podman [root@kubemaster ~]# dnf remove podman podman是红帽系os自带的容器,卸载是为了避免冲突 ...
- 使用OLEDB方式 读取excel和csv文件
/// <summary> /// 使用OLEDB读取excel和csv文件 /// </summary> /// <param name="path" ...