Codeforces Round #535 E2-Array and Segments (Hard version)
Codeforces Round #535 E2-Array and Segments (Hard version)
题意:
给你一个数列和一些区间,让你选择一些区间(选择的区间中的数都减一),
求最后最大值与最小值的差值最大,并输出选择的区间
思路:
在n=300的时候,我们是枚举每个数作为最小值,应用所有覆盖它的区间,并且没
次都更行差值的最大值。
但是这里的n=1e5,所以我们不能用O(n*n*m),但是我们看到这里的m=300
所以可以从m入手,枚举区间,就是记录每个区间的两个端点,利用差分的思想,
来枚举更新最大值
这里说一下为什么枚举最小值,因为如果最大值也在这个区间则抵消,如果没在则
更好
#include<bits/stdc++.h>
using namespace std;
#define MAX 100005
int n,m;
vector<int>add[MAX],sub[MAX],a(MAX);
vector<pair<int,int > >b(MAX); void change(int l,int r,int x)
{
for(int i=l;i<=r;i++)
{
a[i]+=x;
}
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
for(int i=;i<m;i++) sub[i].clear();
for(int i=;i<m;i++) add[i].clear();
for(int i=;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=;i<m;i++)
{
scanf("%d %d",&b[i].first,&b[i].second);
b[i].first--;
b[i].second--;
sub[b[i].first].push_back(i);
add[b[i].second+].push_back(i);
}
int minn,maxn;
minn=maxn=a[];//注意这里不要习惯把minn=INF,maxn=0,因为a数组元素可能为负数,比如-1,这样ans=1,容易出错
for(int i=;i<n;i++)
{
maxn=max(maxn,a[i]);
minn=min(minn,a[i]);
}
int ans=maxn-minn;
int c=-;
for(int i=;i<n;i++)
{
//应用覆盖的区间
for(int j=;j<sub[i].size();j++)
{
int ind=sub[i][j];
change(b[ind].first,b[ind].second,-);
}
//消除之前的区间
for(int j=;j<add[i].size();j++)
{
int ind=add[i][j];
change(b[ind].first,b[ind].second,);
}
int minn=maxn=a[];
if(add[i].size()||sub[i].size())
{
for(int j=;j<n;j++)
{
maxn=max(maxn,a[j]);
minn=min(minn,a[j]);
}
if(maxn-minn>ans)
{
ans=maxn-minn;
c=i;
}
}
}
int len=;
int mask[MAX];
for(int i=;i<m;i++)
{
if(b[i].first<=c&&c<=b[i].second)
{
mask[len++]=i;
}
}
printf("%d\n",ans);
printf("%d\n",len);
for(int i=;i<len;i++)
{
printf("%d ",mask[i]+);
}
}
return ;
}
Codeforces Round #535 E2-Array and Segments (Hard version)的更多相关文章
- 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 ...
- CF #535 (Div. 3) E2 Array and Segments (Hard version) 利用线段树进行区间转移
传送门 题意: 有m个区间,n个a[ i ] , 选择若干个区间,使得整个数组中的最大值和最小值的差值最小.n<=1e5,m<=300; 思路: 可以知道每个i,如果一个区间包含这个 ...
- 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 ...
- CF E2 - Array and Segments (Hard version) (线段树)
题意给定一个长度为n的序列,和m个区间.对一个区间的操作是:对整个区间的数-1可以选择任意个区间(可以为0个.每个区间最多被选择一次)进行操作后,要求最大化的序列极差(极差即最大值 - 最小值).ea ...
- Codeforces Round #535 (Div. 3) 题解
Codeforces Round #535 (Div. 3) 题目总链接:https://codeforces.com/contest/1108 太懒了啊~好久之前的我现在才更新,赶紧补上吧,不能漏掉 ...
- Codeforces 1108E2 Array and Segments (Hard version) 差分, 暴力
Codeforces 1108E2 E2. Array and Segments (Hard version) Description: The only difference between eas ...
- Codeforces Round #535 (Div. 3) [codeforces div3 难度测评]
hhhh感觉我真的太久没有接触过OI了 大约是前天听到JK他们约着一起刷codeforces,假期里觉得有些颓废的我忽然也心血来潮来看看题目 今天看codeforces才知道居然有div3了,感觉应该 ...
- Codeforces Round #504 D. Array Restoration
Codeforces Round #504 D. Array Restoration 题目描述:有一个长度为\(n\)的序列\(a\),有\(q\)次操作,第\(i\)次选择一个区间,将区间里的数全部 ...
- Codeforces 1108E2 Array and Segments (Hard version)(差分+思维)
题目链接:Array and Segments (Hard version) 题意:给定一个长度为n的序列,m个区间,从m个区间内选择一些区间内的数都减一,使得整个序列的最大值减最小值最大. 题解:利 ...
随机推荐
- Robot Framework 源码阅读 day1 run.py
robot里面run起来的接口主要有两类 run_cli def run_cli(arguments): """Command line execution entry ...
- CentOS7安装mysql8.0编译报错集合
以下都是我安装mysql8.0遇到的一些报错和解决方法 1.does not appear to contain CMakeLists.txt. 原因:mysql下载的源码包不对 解决方法:下载正确的 ...
- 12 | 为什么我的MySQL会“抖”一下? 学习记录
<MySQL实战45讲>12 | 为什么我的MySQL会“抖”一下? 学习记录 http://naotu.baidu.com/file/15aa54cab2fa882c6a2a1dd52e ...
- 2018-10-01-weekly
Algorithm 77. 组合 What 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. How 利用递归的思想,当凑够k个数时,就回退回去,remove掉一个数,在 ...
- 關於mac os系統的一些快捷鍵和操作
一.了解mac os 1.桌面的组成元素 2.认识“Dock栏” Dock是一个神奇的东西,可以把Dock理解为Windows的任务栏,在这个地方可以随意拖放你想常驻在你屏幕底部的应用. Dock在工 ...
- python tkinter坐标转换
tkinter中坐标原点在左上角,横坐标向右,纵坐标向下,画图需要将坐标转换成右下角的某个点来符合我们的常用坐标 坐标原点设为(x0,y0),横坐标向右,纵坐标向上,: 转换:想实现坐标点(x,y)的 ...
- @ResponseBody和@RestController
Spring 关于ResponseBody注解的作用 responseBody一般是作用在方法上的,加上该注解表示该方法的返回结果直接写到Http response Body中,常用在ajax异步请求 ...
- 树TreeView控件与DataTable交互添加节点(最高效的方法)
#region "读取树结点从Datatable" /// <summary> /// 读取树结点从Datatable" /// </summary&g ...
- 浅析java中的string
在学习java36讲的时候看到评论区有人提出的一个问题: String s1 = new String("do"); s1.intern(); String s2 = " ...
- (转)Window 中杀死指定端口 cmd 命令行 taskkill
Windows平台 两步方法 : 1 查询端口占用,2 强行杀死进程 netstat -aon|findstr "8080" taskkill /pid 4136-t -f ...