题目链接:

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)(线段树维护)的更多相关文章

  1. Light oj-1100 - Again Array Queries,又是这个题,上次那个题用的线段树,这题差点就陷坑里了,简单的抽屉原理加暴力就可以了,真是坑~~

                                                                              1100 - Again Array Queries ...

  2. HDU - 4366 Successor DFS序 + 分块暴力 or 线段树维护

    给定一颗树,每个节点都有忠诚和能力两个参数,随意指定一个节点,要求在它的子树中找一个节点代替它,这个节点要满足能力值大于它,而且是忠诚度最高的那个. 首先,dfs一下,处理出L[i], R[i]表示d ...

  3. CF719E. Sasha and Array [线段树维护矩阵]

    CF719E. Sasha and Array 题意: 对长度为 n 的数列进行 m 次操作, 操作为: a[l..r] 每一项都加一个常数 C, 其中 0 ≤ C ≤ 10^9 求 F[a[l]]+ ...

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

  5. 线段树维护矩阵【CF718C】 Sasha and Array

    Description 有一个长为\(n\)的数列\(a_{1},a_{2}...a_{n}\),你需要对这个数列维护如下两种操作: \(1\space l \space r\space x\) 表示 ...

  6. CF718C Sasha and Array(线段树维护矩阵)

    题解 (不会矩阵加速的先去学矩阵加速) 反正我想不到线段树维护矩阵.我太菜了. 我们在线段树上维护一个区间的斐波那契的列矩阵的和. 然后询问时提取每个符合题意列矩阵的答案项(不是列矩阵存了两项吗,一个 ...

  7. Codeforces 671C - Ultimate Weirdness of an Array(线段树维护+找性质)

    Codeforces 题目传送门 & 洛谷题目传送门 *2800 的 DS,不过还是被我自己想出来了 u1s1 这个 D1C 比某些 D1D 不知道难到什么地方去了 首先碰到这类问题我们肯定考 ...

  8. 2019年CCPC网络赛 HDU 6703 array【权值线段树】

    题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n].有两种操作:1.将pos位置的元素+1e72.查询不属于[1,r]中的最小的>=k的值.强制在线. 题解因为数组中的值唯一 ...

  9. 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法

    C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...

随机推荐

  1. 1094. The Largest Generation (25)-(dfs,树的遍历,统计每层的节点数)

    题目很简单,就是统计一下每层的节点数,输出节点数最多的个数和对应的层数即可. #include <iostream> #include <cstdio> #include &l ...

  2. Linux内核分析第一二章读书笔记

    linux读书笔记(1,2章) 标签(空格分隔): 20135328陈都 第一章 Linux内核简介 Unix的历史 Unix 虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最 ...

  3. 20135337朱荟潼 Linux第二周学习总结——操作系统是如何工作的

    一.计算机是如何工作的--总结 三个法宝 存储程序计算机.函数调用堆栈.中断机制 二.堆栈 1.是c语言程序运行时必须的一个记录调用路径和参数的空间. 函数调用框架.传递参数.保存返回地址.提供局部变 ...

  4. week7:个人博客作业

    这周有2个需要注意的地方. 1,课上 这周是由张翼飞老师讲的课,上周已经听过老师讲的一节课了,这周发现,这个老师讲课是理论+案例,我每节课都在第一排坐的,我不知道其他人是什么想法,我是一上课,老师讲理 ...

  5. java之JDBC学习总结

    以前一直以为jdbc是很高大上的东西,没想到今天学了jdbc,惊喜来了,just a tool!当然工具是用来帮助人们学习和提供方便的,所以总结了一下,也就是简单的三板斧: first :加载驱动 t ...

  6. PAT 1043 输出PATest

    https://pintia.cn/problem-sets/994805260223102976/problems/994805280074743808 给定一个长度不超过10000的.仅由英文字母 ...

  7. Spring+Junit测试用例的使用

    1.[导包]使用Spring测试套件,需要两个jar包:junit-X.X.jar和spring-test-X.X.X.RELEASE.jar,在maven项目下可添加如下依赖: <depend ...

  8. 极简版 卸载 home 扩充 根分区--centos7 xfs 文件格式

    1. 查看文件系统 df -Th 2. 关闭正常连接 /home的用户 fuser /home 3. 卸载 /home的挂载点 umount /home 4.删除home的lv 注意 lv的名称的写法 ...

  9. [转帖]Oracle 11G RAC For Windows 2008 R2部署手册

    Oracle 11G RAC For Windows 2008 R2部署手册(亲测,成功实施多次) https://www.cnblogs.com/yhfssp/p/7821593.html 总体规划 ...

  10. FuelPHP 系列(一) ------ Oil 命令

    之前用过 Laravel,框架自带的 artisan 命令,用得爽到爆.现在工作需要,要学习 FuelPHP,首先看到框架目录结构,有 coposer.json 框架可以用 composer 管理,一 ...