codeforces#1108E2. Array and Segments (线段树+扫描线)
题目链接:
http://codeforces.com/contest/1108/problem/E2
题意:
给出$n$个数和$m$个操作
每个操作是下标为$l$到$r$的数减一
选出某些操作,使$n$个数的最大值减最小值最大
数据范围:
$1 \le n \le 10^5$
$0 \le m \le 300$
$-10^6 \le a_i \le 10^6$
分析:
假设选择第$i$位置作为最小值,那么我们选取所有包含$i$的区间可以得到选择第$i$位置为最小值的最佳答案
第一步,我们从$1$到$n$枚举最小值的位置
第二步,我们用扫描线来添加和减少题目给出的区间影响,例如最小值为$i$时,我们要让所有的包含i区间的操作生效
第三步,计算以$i$为最小值时的最优解
ac代码:
#include<bits/stdc++.h>
#define ll long long
#define pa pair<int,int>
using namespace std;
const int maxn=1e5+10;
const int maxm=300+10;
const ll mod=1e9+7;
int ans=-1,inde,tree[maxn*4],lazy[maxn*4],num[maxn],n;
pa quer[maxm];
vector<pa>ve[maxn];
vector<int>ve2;
void build(int st,int en,int rt)
{
if(st==en)
{
tree[rt]=num[st];
return ;
}
int md=(st+en)/2;
build(st,md,rt*2);
build(md+1,en,rt*2+1);
tree[rt]=max(tree[rt*2],tree[rt*2+1]);
}
void update(int l,int r,int x,int st,int en,int rt)
{
if(l>en||r<st)return ;
if(l<=st&&r>=en)
{
lazy[rt]+=x;
tree[rt]+=x;
return ;
}
if(lazy[rt])
{
int v=lazy[rt];
lazy[rt*2]+=v;
lazy[rt*2+1]+=v;
tree[rt*2]+=v;
tree[rt*2+1]+=v;
lazy[rt]=0;
}
int md=(st+en)/2;
update(l,r,x,st,md,rt*2);
update(l,r,x,md+1,en,rt*2+1);
tree[rt]=max(tree[rt*2],tree[rt*2+1]);
}
int Quer(int x,int st,int en,int rt)
{
if(st==en)
return tree[rt];
if(lazy[rt])
{
int v=lazy[rt];
lazy[rt*2]+=v;
lazy[rt*2+1]+=v;
tree[rt*2]+=v;
tree[rt*2+1]+=v;
lazy[rt]=0;
}
int md=(st+en)/2;
int res;
if(x<=md)res=Quer(x,st,md,rt*2);
else res=Quer(x,md+1,en,rt*2+1);
tree[rt]=max(tree[rt*2],tree[rt*2+1]);
return res;
}
int main()
{
int q;
scanf("%d %d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
build(1,n,1);
for(int i=1;i<=q;i++)
{
int l,r;
scanf("%d %d",&l,&r);
quer[i].first=l;
quer[i].second=r;
ve[l].push_back(make_pair(i,-1));
ve[r+1].push_back(make_pair(i,+1));
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<ve[i].size();j++)
{
int v=ve[i][j].first;
int add=ve[i][j].second;
update(quer[v].first,quer[v].second,add,1,n,1);
}
int res=tree[1]-Quer(i,1,n,1);
if(res>ans)
{
inde=i;
ans=res;
}
}
printf("%d\n",ans);
int res=0;
for(int i=1;i<=q;i++)
if(inde>=quer[i].first&&inde<=quer[i].second)
ve2.push_back(i);
printf("%d\n",ve2.size());
for(int i=0;i<ve2.size();i++)
printf("%d%c",ve2[i]," \n"[i==ve2.size()-1]);
return 0;
}
codeforces#1108E2. Array and Segments (线段树+扫描线)的更多相关文章
- Codeforces 1108E (Array and Segments) 线段树
题意:给你一个长度为n的序列和m组区间操作,每组区间操作可以把区间[l, r]中的数字都-1,请选择一些操作(可以都不选),使得序列的最大值和最小值的差值尽量的大. 思路:容易发现如果最大值和最小值都 ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线
D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)
题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...
- Codeforces 1108E2 Array and Segments (Hard version) 差分, 暴力
Codeforces 1108E2 E2. Array and Segments (Hard version) Description: The only difference between eas ...
- Codeforces 1108E2 Array and Segments (Hard version)(差分+思维)
题目链接:Array and Segments (Hard version) 题意:给定一个长度为n的序列,m个区间,从m个区间内选择一些区间内的数都减一,使得整个序列的最大值减最小值最大. 题解:利 ...
- Codeforces 610D Vika and Segments 线段树+离散化+扫描线
可以转变成上一题(hdu1542)的形式,把每条线段变成宽为1的矩形,求矩形面积并 要注意的就是转化为右下角的点需要x+1,y-1,画一条线就能看出来了 #include<bits/stdc++ ...
- Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)
题目链接:http://codeforces.com/contest/522/problem/D 题目大意: 给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树 矩阵面积并
D. Vika and Segments Vika has an infinite sheet of squared paper. Initially all squares are whit ...
- hdu 1828 线段树扫描线(周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
随机推荐
- 植物大战僵尸:查找植物叠加种植CALL
实验目标:我们都知道植物大战僵尸游戏中植物是不可以叠加种植的,也就是一个格子只能种植一个植物,今天我们将实现一个格子里种植无限多的植物. 我们首先需要找到植物的种植CALL,然后在逐步测试观察功能之间 ...
- MySQL SQL Training
源于知乎:50道SQL练习题 一.表数据 1.学生表——Student ),Sname ),Sage )); ' , '赵雷' , '1990-01-01' , '男'); ' , '钱电' , '1 ...
- Web API与MVC控制器的区别
Web API属于ASP.NET核心平台的一部分,它利用MVC框架的底层功能方便我们快速的开发部署WEB服务.我们可以在常规MVC应用通过添加API控制器来创建web api服务,普通MVC应用程序控 ...
- JS基础_返回值的类型
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Vue-img-preload
预加载页面上的图片资源,提高用户体验 效果预览 使用方法 下载vue-img-preload插件 npm install vue-img-preload 配置参数 eachLoaded(functio ...
- Jerry Wang在SAP社区上获得的徽章
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
- jq国际化i18n
1.(main.js或)ajax.js引入文件 import './jquery.i18n.properties.min' //https://github.com/jquery-i18n-prope ...
- Am335x SD卡刷eMMC二
犹豫前段时间一直在搞另一个项目,Am335x这个BBlack板就放置一边了.前几天把BBlack板重新拿到手,之前搞得给全忘了.SD卡烧写emmC时突然出现了错误,一直找不到原因,今天终于算是有点眉目 ...
- safari同步google书签
1 直接通过safari的导入书签,from chrome就可以了
- 【linux】ubuntu修改系统时间
ubuntu修改时间步骤 ① 先把系统校验时间的程序停止掉 /lib/systemd/systemd-timesyncd systemd 开始,包括了一个名为systemd-timesyncd 的守护 ...