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/E2
题目大意:
给你n个数,然后给你m个区间,每一个区间代表将给定的n个数这个区间内都减去1,每个区间最多使用一次。然后问你使用哪些区间能够使得这n个数中最大数和最小的差值最大?
首先对于E1:这么小的数据不暴力搞啥??直接问枚举就完事了,每一次枚举的时候保持一个数不变,假设当前的数是最大的,然后其他的只要是不包含这个数的区间,都减去,这样就能让最小的那个位置尽可能的小了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = +;
int a[maxn],b[maxn],sto[maxn];
struct node
{
int le;
int ri;
} q[maxn];
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=; i<=n; i++)
{
scanf("%d",&a[i]);
}
for(int i=; i<=m; i++)
{
scanf("%d %d",&q[i].le,&q[i].ri);
}
int maxx=-inf,id=;
for(int i=; i<=n; i++)
{
int t1=-inf,t2=inf;
for(int j=; j<=n; j++)
{
b[j]=a[j];
}
for(int j=; j<=m; j++)
{
if(i>=q[j].le&&i<=q[j].ri)
continue;
for(int k=q[j].le; k<=q[j].ri; k++)
{
b[k]-=;
}
}
for(int j=; j<=n; j++)
{
t1=max(t1,b[j]);
t2=min(t2,b[j]);
}
if(t1-t2>maxx)
{
maxx=t1-t2;
id=i;
}
}
// cout<<m<<endl;
printf("%d\n",maxx);
int num=;
// cout<<1<<" "<<num<<endl;
for(int i=; i<=m; i++)
{
if(id>=q[i].le&&id<=q[i].ri)
continue;
// cout<<1<<endl;
sto[++num]=i;
}
// cout<<2<<" "<<num<<endl;
printf("%d\n",num);
for(int i=; i<=num; i++)
{
if(i==)
printf("%d",sto[i]);
else
printf(" %d",sto[i]);
}
printf("\n");
return ;
}
其次对于E2:我们可以寻找最小的数的位置,这个时候为什么不和E1一样去找最大的数的位置呢?因为我们要利用区间的性质,对于每一个节点,我们需要从第一个位置开始。
对于当枚举到第i个节点的时候,需要把包括i的区间都给整上,这个时候求一下最值之差,当枚举到第i+1个节点的时候,我们只需要把不包括第i个节点但是包括第i+1个节点的区间给整上就可以了,这样就能省去很多不必要的操作了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
# define lson l,m,rt<<
# define rson m+,r,rt<<|
const int maxn = 1e5+;
int minn[maxn<<],maxx[maxn<<],dif[maxn<<];
int lazy[maxn<<];
struct node
{
int le;
int ri;
} edge[+];
int sto[maxn];
int ans1,ans2;
vector<int>q1[maxn],q2[maxn];
void up(int rt)
{
minn[rt]=min(minn[rt<<],minn[rt<<|]);
maxx[rt]=max(maxx[rt<<],maxx[rt<<|]);
dif[rt]=maxx[rt]-minn[rt];// 本来查找最值得差的时候是直接询问到底部的,加了这个就不需要了,学到了!!
}
void build(int l,int r,int rt)
{
if(l==r)
{
int tmp;
scanf("%d",&tmp);
minn[rt]=tmp;
maxx[rt]=tmp;
return ;
}
int m=(l+r)>>;
build(lson);
build(rson);
up(rt);
}
void down(int rt)
{
if(lazy[rt])
{
lazy[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
minn[rt<<]+=lazy[rt];
minn[rt<<|]+=lazy[rt];
maxx[rt<<]+=lazy[rt];
maxx[rt<<|]+=lazy[rt];
lazy[rt]=;
}
}
void update(int l,int r,int rt,int L,int R,int p)
{
if(L<=l&&R>=r)
{
minn[rt]+=p;
maxx[rt]+=p;
lazy[rt]+=p;
return ;
}
down(rt);
int m=(l+r)>>;
if(L<=m)
update(lson,L,R,p);
if(R>m)
update(rson,L,R,p);
up(rt);
}
//int querymax(int l,int r,int rt)
//{
// if(l==r)
// {
// return maxx[rt];
// }
// int t1;
// down(rt);
// int m=(l+r)>>1;
// if(l<=m)querymax(lson);
// if(r>m)querymax(rson);
// up(rt);
//}
//void querymin(int l,int r,int rt)
//{
// if(l==r)
// {
// ans2=min(ans2,minn[rt]);
// return ;
// }
// down(rt);
// int m=(l+r)>>1;
// querymin(lson);
// querymin(rson);
// up(rt);
//}
int main()
{
int n,m,tmp,len;
scanf("%d %d",&n,&m);
build(,n,);
int ans=-inf,id=;
for(int i=; i<=m; i++)
{
scanf("%d %d",&edge[i].le,&edge[i].ri);
q1[edge[i].le].push_back(i);
q2[edge[i].ri].push_back(i);
}
for(int i=; i<=n; i++)
{
len=q2[i-].size();
for(int j=; j<len; j++)
{
tmp=q2[i-][j];
update(,n,,edge[tmp].le,edge[tmp].ri,);
}
len=q1[i].size();
for(int j=; j<len; j++)
{
tmp=q1[i][j];
update(,n,,edge[tmp].le,edge[tmp].ri,-);
}
if(ans<dif[])
{
ans=dif[];
id=i;
}
}
int num=;
printf("%d\n",ans);
for(int i=; i<=m; i++)
{
if(edge[i].le<=id&&edge[i].ri>=id)
{
sto[++num]=i;
}
}
printf("%d\n",num);
for(int i=; i<=num; i++)
{
if(i==)
printf("%d",sto[i]);
else
printf(" %d",sto[i]);
}
printf("\n");
return ;
}
E1. Array and Segments (Easy version)(暴力) && E2. Array and Segments (Hard version)(线段树维护)的更多相关文章
- Light oj-1100 - Again Array Queries,又是这个题,上次那个题用的线段树,这题差点就陷坑里了,简单的抽屉原理加暴力就可以了,真是坑~~
1100 - Again Array Queries ...
- HDU - 4366 Successor DFS序 + 分块暴力 or 线段树维护
给定一颗树,每个节点都有忠诚和能力两个参数,随意指定一个节点,要求在它的子树中找一个节点代替它,这个节点要满足能力值大于它,而且是忠诚度最高的那个. 首先,dfs一下,处理出L[i], R[i]表示d ...
- CF719E. Sasha and Array [线段树维护矩阵]
CF719E. Sasha and Array 题意: 对长度为 n 的数列进行 m 次操作, 操作为: a[l..r] 每一项都加一个常数 C, 其中 0 ≤ C ≤ 10^9 求 F[a[l]]+ ...
- Codeforces Round #373 (Div. 2) E. Sasha and Array 线段树维护矩阵
E. Sasha and Array 题目连接: http://codeforces.com/contest/719/problem/E Description Sasha has an array ...
- 线段树维护矩阵【CF718C】 Sasha and Array
Description 有一个长为\(n\)的数列\(a_{1},a_{2}...a_{n}\),你需要对这个数列维护如下两种操作: \(1\space l \space r\space x\) 表示 ...
- CF718C Sasha and Array(线段树维护矩阵)
题解 (不会矩阵加速的先去学矩阵加速) 反正我想不到线段树维护矩阵.我太菜了. 我们在线段树上维护一个区间的斐波那契的列矩阵的和. 然后询问时提取每个符合题意列矩阵的答案项(不是列矩阵存了两项吗,一个 ...
- Codeforces 671C - Ultimate Weirdness of an Array(线段树维护+找性质)
Codeforces 题目传送门 & 洛谷题目传送门 *2800 的 DS,不过还是被我自己想出来了 u1s1 这个 D1C 比某些 D1D 不知道难到什么地方去了 首先碰到这类问题我们肯定考 ...
- 2019年CCPC网络赛 HDU 6703 array【权值线段树】
题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n].有两种操作:1.将pos位置的元素+1e72.查询不属于[1,r]中的最小的>=k的值.强制在线. 题解因为数组中的值唯一 ...
- 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法
C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...
随机推荐
- Actual Time Cost
- RabbitMQ-从基础到实战(3)— 消息的交换(上)
转载请注明出处 0.目录 RabbitMQ-从基础到实战(1)— Hello RabbitMQ RabbitMQ-从基础到实战(2)— 防止消息丢失 RabbitMQ-从基础到实战(4)— 消息的交换 ...
- SpringBoot 2.SpringBoot整合Mybatis
一.创建Springboot的配置文件:application.properties,并添加MyBatis依赖 SpringApplication 会从 application.properties ...
- Mysql学习实践---SELECT INTO的替代方案
从一个表复制数据,然后把数据插入到另一个新表中. 假设有一个已创建且有数据的orders表,要把orders表备份到还未创建的newOrders表里 SQL用法:SELECT * INTO newOr ...
- aop 例外通知就是记录业务方法出现错误 并保存到日志里面的功能
aop 例外通知就是记录业务方法出现错误 并保存到日志里面的功能
- Eclipse Job
Job可以我们基于Eclipse的Java程序中,我们有很多种方式提供多任务的实现.熟悉Java的朋友立即会想到Java的Thread类,这是Java中使 用最多的一个实现多任务的类.Eclipse平 ...
- CRM 2013发邮件的插件报错Cannot open Sql Encryption Symmetric Key because Symmetric Key password does not exist in Config DB
解决方法: 1. 依次打开Settings->Data management –> Data Encryption 然后在上面红框里填上任意一个key即可.
- 【ARC082E】ConvexScore
Description 给定二维直角坐标系上的N个点\((X_i,Y_i)\),定义一个有N个点中的部分点所构成点集为"凸点集",当且仅当该集合内的所有点恰好构成一个面积为正的凸多 ...
- 【UOJ #351】新年的叶子(树的直径,期望)
题目链接 这的确是一道好题,我们不妨依循思路一步步推导,看问题是如何被解决的. 做一些约定,设$m$为树的叶子节点个数,设$len$为该树的直径(经过的点数). 毫无疑问,直径可能有多条,我们需要把所 ...
- 洛谷 P2047 [NOI2007]社交网络 解题报告
P2047 [NOI2007]社交网络 题目描述 在社交网络(\(social\) \(network\))的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题.在一个社交圈子里有\ ...